1. 问题描述
学习 Kubernetes 技术,就要先部署 Kubernetes 环境,不然怎么练习呢?(光看文档是学不会的)。然而,部署 Kubernetes 集群需要很多台机器,并且过程也不简单,让人忘而生畏(其实也没有那么复杂,我们之所以这么说,纯粹是为了引出 minikube 工具,不然我们没办法继续往下说呀)。幸好有 minikube 工具,让我们快速在本地创建用于学习和开发的 Kubernetes 集群。
该笔记将记录:使用 minikube 搭建用于学习的 Kubernetes 集群(用于本地测试、功能体验)的方法及注意事项。
2. 实验环境
# 09/18/2020 Debian GNU/Linux 10 (buster)
# 03/15/2021 Ubuntu 20.04 LTS(由于硬件不到位,我们少张阵列卡,磁盘空间不足,所以临时使用 minikube 搭建测试环境)
3. 解决方案
3.1. 第一步、安装环境依赖
安装 kubectl 命令:参考 Install and Set Up kubectl(https://k4nz.com/Kubernetes_and_Docker/05.Kubernetes_Cluster/3.Administration/0.Install_and_Set_Up_kubectl.html) 笔记(或者,官方文档)。该步骤是可选的,最后我们会通过 minikube 来安装对应版本的 kubectl 命令。
安装集群底层运行环境:使用 minikube 创建的 Kubernetes 集群,运行在不同的环境内。比如 minikube 可以调用 VirtualBox 来创建集群,也可以调用 VMware 来创建集群(还支持使用 Docker、Podman 等等,参考 Drivers(https://minikube.sigs.k8s.io/docs/drivers/) 文档)。我们使用 kvm 虚拟化(因为更贴近于使用场景),所以需要安装 KVM 虚拟化环境,参考 Setting Up a KVM VM Host Server(https://k4nz.com/Virtualization_and_Emulator/4.QEMU,_KVM_and_libvirt/2.Installing_and_Upgrading/Setting_Up_a_KVM_VM_Host_Server.html) 笔记。
3.2. 第二步、检查虚拟化是否开启
# egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
yes # 输出 yes 表示支持虚拟化
3.3. 第三步、安装 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
3.4. 第四步、启动 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
3.5. 第五步、访问及使用集群
添加 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
3.6. 常用组件设置
安装 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
4. 常见问题汇总
4.1. 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 用户运行,只能以普通用户运行。
解决方法:切换到普通用户执行该命令。
4.2. /usr/bin/virsh domcapabilities --virttype kvm failed
KVM - Debian Wiki(https://wiki.debian.org/KVM#Installation)
kvm2: check if user in "libvirt" group · Issue #5617 · kubernetes/minikube(https://github.com/kubernetes/minikube/issues/5617)
问题描述:使用 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
5. 相关文档
搭建“稍显复杂的”测试集群,参考 Installing k8s 1.14 on CentOS 7(https://k4nz.com/Kubernetes_and_Docker/05.Kubernetes_Cluster/2.Creating_a_Learning_Environment/Installing_k8s_1.14_on_CentOS_7.html) 笔记(依旧只能用于测试);
搭建“生产可用的”集群环境,参考 Stacked control plane(https://k4nz.com/Kubernetes_and_Docker/05.Kubernetes_Cluster/7.Cluster_and_High_availability/Stacked_control_plane.html) 笔记(细节内容建议参考官方文档);
6. 参考文献
completion | minikube(https://minikube.sigs.k8s.io/docs/commands/completion/)
Drivers | minikube(https://minikube.sigs.k8s.io/docs/drivers/%20)
Install Minikube | Kubernetes(https://jsoup.org/)
kvm2 | minikube(https://minikube.sigs.k8s.io/docs/drivers/kvm2/)
Proxies and VPNs | minikube(https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/)
Quickstart for Calico on minikube(https://docs.projectcalico.org/getting-started/kubernetes/minikube%20)
本文暂时没有评论,来添加一个吧(●'◡'●)