「Kubernetes」- 使用 minikube 快速搭建集群(实验集群)

  CREATED BY JENKINSBOT

问题描述

学习 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 start \
    --registry-mirror=https://hub-mirror.c.163.com \
    --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
    --driver=kvm2 -v=8
* 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

相关文档

搭建“稍显复杂的”测试集群,参考 1.Kubernetes Testing (CentOS 7) 笔记(依旧只能用于测试);

搭建“生产可用的”集群环境,参考 Stacked control plane 笔记(细节内容建议参考官方文档);

参考文献

completion | minikube
Drivers | minikube
Install Minikube | Kubernetes
kvm2 | minikube
Proxies and VPNs | minikube
Quickstart for Calico on minikube