尝试在特定系统环境下安装 Minikube,系统为在 PVE 中通过 Lxc 虚拟出的 Ubuntu 22.04。在安装过程中,遭遇了诸多问题,在此记录下来,希望能为有相似经历的人提供一些参考。
按照官方的 Minikube 安装指南(minikube start | minikube (k8s.io)),可能需要一些特殊网络条件。首先尝试执行:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
却发现系统中没有安装 curl。于是先进行 apt install curl,但一开始却报错了。不过,执行 apt update之后,这个问题就得以解决。
接着,执行以下命令安装 Minikube:
install minikube-linux-amd64 /usr/local/bin/minikube
很快就执行完毕且没有任何输出,这与预期不太相符。后来了解到,实际上在执行 minikube start的时候才会进行一系列复杂的操作。
当执行 minikube start时,不出意外地报错了。提示不能用 root 运行,于是加上 --driver=none参数后,又报缺少 conntrack。那就先安装 conntrack,这个安装过程倒是十分顺利。
随后,又报缺少 crictl。发现不能通过 apt install来安装,于是前往 https://github.com/kubernetes-sigs/cri-tools/releases 下载 crictl-v1.31.0-linux-amd64.tar.gz,然后将其解压到 /usr/local/bin下。可以通过 SSH 将在 Windows 上解压后的 crictl文件放置到这个目录,也可以使用命令:
sudo tar zxvf crictl-v1.31.0-linux-amd64.tar.gz -C /usr/local/bin
可能还需要加上执行权限,即 chmod +x /usr/local/bin/crictl。然后执行 crictl --version进行验证。
这时候,似乎还需要安装 kubectl。执行以下命令:
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x./kubectl
sudo mv./kubectl /usr/local/bin/kubectl
测试时执行 kubectl version --client。
接着再次执行 minikube start --vm-driver=none --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers,又报缺少 cri-dockerd。前往 Releases・Mirantis/cri-dockerd (github.com) 下载 cri-dockerd-0.3.14.amd64.tgz,同样放置在 /usr/local/bin下。
之后又报缺少 containernetworking-plugins。前往 Releases・containernetworking/plugins (github.com) 下载 cni-plugins-linux-amd64-v1.5.1.tgz。按照官方的说明(FAQ | minikube (k8s.io)),执行以下操作:
CNI_PLUGIN_VERSION="<version_here>"
CNI_PLUGIN_TAR="cni-plugins-linux-amd64-$CNI_PLUGIN_VERSION.tgz" # change arch if not on amd64
CNI_PLUGIN_INSTALL_DIR="/opt/cni/bin"
curl -LO "https://github.com/containernetworking/plugins/releases/download/$CNI_PLUGIN_VERSION/$CNI_PLUGIN_TAR"
sudo mkdir -p "$CNI_PLUGIN_INSTALL_DIR"
sudo tar -xf "$CNI_PLUGIN_TAR" -C "$CNI_PLUGIN_INSTALL_DIR"
rm "$CNI_PLUGIN_TAR"
将其解压后放置到新建的 /opt/cni/bin目录下。
然而,运行 minikube start时又报出错误:“X Exiting due to RT_DOCKER_MISSING_CRI_DOCKER_NONE: sudo systemctl enable cri-docker.socket: exit status 1”。
解决方法是创建 cri-docker.service配置文件:
vi /lib/systemd/system/cri-docker.service
并复制以下内容:
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
再创建 cri-docker.socket配置文件:
vi /lib/systemd/system/cri-docker.socket
复制以下内容:
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
然后进行启动操作:
systemctl daemon-reload
systemctl start docker.service
systemctl enable cri-docker
systemctl status docker.service
最后执行:
minikube start --image-mirror-country=cn --driver=none
在这个过程中,发现使用 “魔法” 后用 --image-mirror-country=cn或者上面的阿里云镜像都很慢,直接去掉这个参数反而速度更快了。但还是出现错误。运行 kubectl get po -A时也报错。
过了一夜,怀疑是不是不能在 LXC 中安装,于是又尝试在完整的 Ubuntu Server 中安装。过程与上述类似,也报过 “ Exiting due to NOT_FOUND_DOCKERD:” 以及 “ Suggestion: The none driver with Kubernetes v1.24+ and the docker container-runtime requires dockerd.”。但是查看 docker --version却有输出 “Docker version 24.0.5, build ced0996”。最终确定是没有安装 docker,因为这个 Ubuntu 虚拟机是从别的地方备份还原的,一开始看到 docker --version有输出就误以为已经安装过了。这个 dockerd实际上是 docker 的守护进程(Docker daemon),起初还以为是另一个软件。于是进行安装 docker:
apt install docker.io
systemctl start docker
systemctl status docker