「Kubernetes」- 使用 minikube 快速搭建集群(实验性质) @20210316
问题描述
学习 Kubernetes 技术,就要先部署 Kubernetes 环境,不然怎么练习呢?(光看文档是学不会的)。然而,部署 Kubernetes 集群需要很多台机器,并且过程也不简单,让人忘而生畏(其实也没有那么复杂,我们之所以这么说,纯粹是为了引出 minikube 工具,不然我们没办法继续往下说呀)。幸好有 minikube 工具,让我们快速在本地创建用于学习和开发的 Kubernetes 集群。
该笔记将记录:使用 minikube 搭建用于学习的 Kubernetes 集群(用于本地测试、功能体验)的方法及注意事项。
实验环境
# 09/18/2020 Debian GNU/Linux 10 (buster)
# 03/15/2021 Ubuntu 20.04 LTS(由于硬件不到位,我们少张阵列卡,磁盘空间不足,所以临时使用 minikube 搭建测试环境)
解决方案
第一步、安装环境依赖
安装 kubectl 命令:参考 Install and Set Up kubectl 笔记(或者,官方文档)。该步骤是可选的,最后我们会通过 minikube 来安装对应版本的 kubectl 命令。
安装集群底层运行环境:使用 minikube 创建的 Kubernetes 集群,运行在不同的环境内。比如 minikube 可以调用 VirtualBox 来创建集群,也可以调用 VMware 来创建集群(还支持使用 Docker、Podman 等等,参考 Drivers 文档)。我们使用 kvm 虚拟化(因为更贴近于使用场景),所以需要安装 KVM 虚拟化环境,参考 Setting Up a KVM VM Host Server 笔记。
第二步、检查虚拟化是否开启
# egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no yes # 输出 yes 表示支持虚拟化
第三步、安装 minikube 命令
有两种安装方法:1)使用包管理器安装、2)使用二进制安装
方法一、使用包管理器安装:
# 我们使用 Debian 发行版(适用于 Ubuntu 发行版),因此执行如下安装命令: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb dpkg -i minikube_latest_amd64.deb # 其他 Linux 发行版,参考 minikube start 页面 # https://minikube.sigs.k8s.io/docs/start/ # 其他 minikube 版本,访问 Github release 页面 # https://github.com/kubernetes/minikube/releases
方法二、使用二进制安装(通用):
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 mkdir -p /usr/local/bin/ mv ./minikube /usr/local/bin/ chmod u+x /usr/local/bin/minikube minikube version
第四步、启动 minikube 集群,并进行操作
该步骤的全部命令,需要切换到普通用户执行(否则,将出现各种错误,参考「常见问题处理」部分)。
网络原因,我们需要配置网络加速服务,才能让 minikube 完成下载:
export HTTP_PROXY="http://<proxy hostname:port>" export HTTPS_PROXY="https://<proxy hostname:port>" # 以下内网网段不要通过代理服务 # 注意,这里一定要添加虚拟机 NAT 网段 export NO_PROXY="localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" # 更多网络设置,参考 Proxies and VPNs 文档: # https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/
启动集群(需要等待下载完成):
# minikube start --driver=kvm2 * minikube v1.18.1 on Ubuntu 20.04 * Using the kvm2 driver based on user configuration * Downloading driver docker-machine-driver-kvm2: > docker-machine-driver-kvm2....: 65 B / 65 B [----------] 100.00% ? p/s 0s > docker-machine-driver-kvm2: 11.39 MiB / 11.39 MiB 100.00% 1.14 MiB p/s 1 * Downloading VM boot image ... > minikube-v1.18.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s > minikube-v1.18.0.iso: 212.99 MiB / 212.99 MiB 100.00% 1.46 MiB p/s 2m26s * Starting control plane node minikube in cluster minikube * Downloading Kubernetes v1.20.2 preload ... > preloaded-images-k8s-v9-v1....: 491.22 MiB / 491.22 MiB 100.00% 1.11 MiB * Creating kvm2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) ... * Found network options: - HTTP_PROXY=http://192.168.10.184:8123 - HTTPS_PROXY=http://192.168.10.184:8123 - NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - http_proxy=http://192.168.10.184:8123 - https_proxy=http://192.168.10.184:8123 * Preparing Kubernetes v1.20.2 on Docker 20.10.3 ... - env HTTP_PROXY=http://192.168.10.184:8123 - env HTTPS_PROXY=http://192.168.10.184:8123 - env NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - Generating certificates and keys ... - Booting up control plane ... - Configuring RBAC rules ... * Verifying Kubernetes components... - Using image gcr.io/k8s-minikube/storage-provisioner:v4 * Enabled addons: storage-provisioner, default-storageclass * Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
查看集群状态,以及常用集群操作:
# minikube status minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured # minikube node list minikube 192.168.39.73 # minikube node add * Adding node m02 to cluster minikube ! Cluster was created without any CNI, adding node to it might cause broken network. E0315 17:10:35.176437 3660 register.go:141] unexpected first step: "" * Starting node minikube-m02 in cluster minikube E0315 17:10:35.178726 3660 register.go:141] unexpected first step: "" * Creating kvm2 VM (CPUs=2, Memory=2200MB, Disk=20000MB) ... * Found network options: - HTTP_PROXY=http://192.168.10.184:8123 - HTTPS_PROXY=http://192.168.10.184:8123 - NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - http_proxy=http://192.168.10.184:8123 - https_proxy=http://192.168.10.184:8123 E0315 17:10:59.100306 3660 register.go:141] unexpected first step: "" * Preparing Kubernetes v1.20.2 on Docker 20.10.3 ... - env HTTP_PROXY=http://192.168.10.184:8123 - env HTTPS_PROXY=http://192.168.10.184:8123 - env NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 E0315 17:11:07.146825 3660 register.go:141] unexpected first step: "" * Verifying Kubernetes components... * Successfully added m02 to minikube! # minikube node add ... # minikube node list minikube 192.168.39.73 minikube-m02 192.168.39.91 minikube-m03 192.168.39.244
第五步、访问及使用集群
添加 minikube 的 Bash 补全:
echo 'source <(minikube completion bash)' >> ~/.bashrc # 添加命令补全 source ~/.bashrc
安装 kubectl 命令,以及自动补全:
minikube kubectl # 安装命令(当首次执行时,将自动安装) echo 'alias kubectl="minikube kubectl --"' >> ~/.bashrc # 添加命令别名(最后的 -- 是 minikube 要求的) echo 'source <(minikube kubectl completion bash)' >> ~/.bashrc # 添加命令补全 source ~/.bashrc
使用 kubectl 命令:
// minikube 已经将集群的访问凭证保存到 ~/.kube/ 目录,因此无需单独配置 # kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready control-plane,master 45m v1.20.2 minikube-m02 Ready <none> 38m v1.20.2 minikube-m03 Ready <none> 35m v1.20.2 minikube-m04 Ready <none> 34m v1.20.2 minikube-m05 Ready <none> 33m v1.20.2
常用组件设置
安装 Calico 网络插件:
// 在最开始时,我们未使用其他网络插件,因此需要重新启动集群来指定网络插件 # minikube stop # minikube start --driver=kvm2 --network-plugin=cni --cni=calico // 查看网络插件容器状态 # kubectl get pods -n kube-system -l k8s-app=calico-node NAME READY STATUS RESTARTS AGE calico-node-5d58f 1/1 Running 0 14m calico-node-6972r 1/1 Running 0 14m calico-node-br69s 1/1 Running 0 14m calico-node-jqjzg 1/1 Running 0 14m calico-node-njwn2 1/1 Running 0 14m
常见问题汇总
X Exiting due to DRV_AS_ROOT: The "kvm2" driver should not be used with root privileges.
问题描述:使用 minikube start --driver=kvm2 启动时,产生如下错误:
# minikube start --driver=kvm2 * minikube v1.18.1 on Ubuntu 20.04 * Using the kvm2 driver based on user configuration * The "kvm2" driver should not be used with root privileges. * If you are running minikube within a VM, consider using --driver=none: * https://minikube.sigs.k8s.io/docs/reference/drivers/none/ X Exiting due to DRV_AS_ROOT: The "kvm2" driver should not be used with root privileges.
问题原因:当前用户为 ROOT 用户 而 minikube 不允许以 ROOT 用户运行,只能以普通用户运行。
解决方法:切换到普通用户执行该命令。
/usr/bin/virsh domcapabilities --virttype kvm failed
KVM - Debian Wiki
kvm2: check if user in "libvirt" group · Issue #5617 · kubernetes/minikube
问题描述:使用 minikube start --driver=kvm2 启动时,产生如下错误:
# minikube start --driver=kvm2 minikube v1.14.1 on Debian 10.5 Using the kvm2 driver based on user configuration X Exiting due to PROVIDER_KVM2_ERROR: /usr/bin/virsh domcapabilities --virttype kvm failed: Suggestion: Follow your Linux distribution instructions for configuring KVM Documentation: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/
问题原因:当前用户(非 ROOT 用户)未加入 libvirt 组。首先,minikube 不允许以 ROOT 用户运行,只能以普通用户运行。以普通用户运行时,如果不能管理虚拟机(即没有权限,即不能执行 virsh domcapabilities 命令),则会产生上述错误。
解决方法:将当前用户加入 libvirt 组即可:
adduser '<your user>' libvirt
相关文档
搭建“稍显复杂的”测试集群,参考 Installing k8s 1.14 on CentOS 7 笔记(依旧只能用于测试);
搭建“生产可用的”集群环境,参考 Stacked control plane 笔记(细节内容建议参考官方文档);
相关文章
「Kubernetes」- 在集群初始化时,如果无法拉取官方镜像怎么办?
「Kubernetes」- 使用 kubeadm 部署测试集群(实验性质)
参考文献
completion | minikube
Drivers | minikube
Install Minikube | Kubernetes
kvm2 | minikube
Proxies and VPNs | minikube
Quickstart for Calico on minikube