Kubernetes 使用 flannel 创建的容器卡在 "ContainerCreating" 状态
Kubernetes' container creation with flannel gets stuck in "ContainerCreating"-state
上下文
我在 Ubuntu 18.04 LTS (Server)
上按照 this 说明安装了 Docker
,后来在 Kubernetes
上安装了 Docker
,然后通过 kubeadm
安装了 Docker
。初始化 (kubeadm init --pod-network-cidr=10.10.10.10/24
) 并加入第二个节点后(一开始我有一个双节点集群)我无法获得我的 coredns 以及后来应用的 Web UI(仪表板) 实际进入状态 运行.
作为 pod 网络,我尝试了 Flannel (kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
) 和 Weave Net - 没有任何改变。它仍然显示状态 ContainerCreating,即使经过数小时的等待:
问题
为什么容器创建没有按预期工作?根本原因可能是什么?最重要的是:我该如何解决这个问题?
编辑
在下面总结我的回答,原因如下:
- Docker 使用
cgroups
而不是 systemd
- 我没有正确配置
iptables
- 我用错了
kubeadm init
因为法兰绒standard-yaml要求--pod-network-cidr
是10.244.0.0/16
因为回答这个问题花了我很多时间,所以我想分享一下是什么让我摆脱了这个问题。代码可能比必要的多,但如果我或其他人必须重做所有步骤,我也希望将它放在一个地方。
首先,一切始于 Docker...
我想通了,大概都是从我安装的方式开始的Docker。按照 linked 在线说明,我使用 sudo apt-get install docker.io
安装 Docker 并通过 cgroups
将其与 cgroups
一起使用18=].
好吧,看看 Kubernetes 的官方说明这是一个错误:systemd
是推荐的方法!
所以我通过关注 these great instructions 完全清除了我对 docker 所做的一切
马约尔·班达尔:
sudo apt-get purge -y docker-engine docker docker.io docker-ce
sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce
sudo rm -rf /var/lib/docker /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock
# Reboot to be sure
之后我重新安装了 the official way(请记住,这可能会在未来发生变化):
# Install Docker CE
## Set up the repository:
### Install packages to allow apt to use a repository over HTTPS
apt-get update && apt-get install -y \
apt-transport-https ca-certificates curl software-properties-common gnupg2
### Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
### Add Docker apt repository.
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
## Install Docker CE.
apt-get update && apt-get install -y \
containerd.io=1.2.10-3 \
docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) \
docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs)
# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart docker.
systemctl daemon-reload
systemctl restart docker
请注意,这明确使用了 systemd
!
...然后继续使用 Flannel...
上面我写的 sudo kubeadm init
是用 --pod-network-cidr=10.10.10.10/24
完成的,因为后者是我主人的 IP。
好吧,正如所指出的 here not using the official recommended --pod-network-cidr=10.244.0.0/16
导致错误 例如使用 kubectl proxy
或在使用提供的 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
时创建容器。
这是因为 10.244.0.0/16
在 .yaml
中是硬 link,因此是强制性的 - 或者您只需在 .yaml
.[=39 中更改它=]
为了摆脱错误的配置,我进行了完全重置。
这可以使用 sudo kubeadm reset
并通过使用 sudo rm -r ~/.kube/config
删除配置来实现。
无论如何,因为我把它搞砸了,我通过卸载并重新安装 kubeadm
并确保这次它确实使用了 iptables
进行了完全重置(我之前也忘记这样做......)。
很好 link 如何完全卸载所有 kubeadm-parts。
kubeadm reset
sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
sudo apt-get autoremove
sudo rm -rf ~/.kube
为了完整起见,这里也重装一下:
# ensure legacy binaries are installed
sudo apt-get install -y iptables arptables ebtables
# switch to legacy versions
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy
# Install Kubernetes with kubeadm
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
#reboot
...终于成功了!
完全重新安装后,我执行了以下操作:
# Initialize with correct cidr
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
然后对结果感到震惊:
kubectl get pods --all-namespaces
在站点注释中:这也解决了我在执行这些步骤之前描述未创建的 coredns 时遇到的 /run/flannel/subnet.env: no such file or directory
错误。
所以我遇到了与上述相同的问题。对我来说,这是解决此问题的完美解决方案,但其他 pods 也卡在了挂起或 ContainerCreating 上。
除了上面的修复,我的 flannel 遇到了一个未被注意到的错误,所以我需要重新运行 flannel create。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
上下文
我在 Ubuntu 18.04 LTS (Server)
上按照 this 说明安装了 Docker
,后来在 Kubernetes
上安装了 Docker
,然后通过 kubeadm
安装了 Docker
。初始化 (kubeadm init --pod-network-cidr=10.10.10.10/24
) 并加入第二个节点后(一开始我有一个双节点集群)我无法获得我的 coredns 以及后来应用的 Web UI(仪表板) 实际进入状态 运行.
作为 pod 网络,我尝试了 Flannel (kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
) 和 Weave Net - 没有任何改变。它仍然显示状态 ContainerCreating,即使经过数小时的等待:
问题
为什么容器创建没有按预期工作?根本原因可能是什么?最重要的是:我该如何解决这个问题?
编辑
在下面总结我的回答,原因如下:
- Docker 使用
cgroups
而不是systemd
- 我没有正确配置
iptables
- 我用错了
kubeadm init
因为法兰绒standard-yaml要求--pod-network-cidr
是10.244.0.0/16
因为回答这个问题花了我很多时间,所以我想分享一下是什么让我摆脱了这个问题。代码可能比必要的多,但如果我或其他人必须重做所有步骤,我也希望将它放在一个地方。
首先,一切始于 Docker...
我想通了,大概都是从我安装的方式开始的Docker。按照 linked 在线说明,我使用 sudo apt-get install docker.io
安装 Docker 并通过 cgroups
将其与 cgroups
一起使用18=].
好吧,看看 Kubernetes 的官方说明这是一个错误:systemd
是推荐的方法!
所以我通过关注 these great instructions 完全清除了我对 docker 所做的一切 马约尔·班达尔:
sudo apt-get purge -y docker-engine docker docker.io docker-ce
sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce
sudo rm -rf /var/lib/docker /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock
# Reboot to be sure
之后我重新安装了 the official way(请记住,这可能会在未来发生变化):
# Install Docker CE
## Set up the repository:
### Install packages to allow apt to use a repository over HTTPS
apt-get update && apt-get install -y \
apt-transport-https ca-certificates curl software-properties-common gnupg2
### Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
### Add Docker apt repository.
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
## Install Docker CE.
apt-get update && apt-get install -y \
containerd.io=1.2.10-3 \
docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) \
docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs)
# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart docker.
systemctl daemon-reload
systemctl restart docker
请注意,这明确使用了 systemd
!
...然后继续使用 Flannel...
上面我写的 sudo kubeadm init
是用 --pod-network-cidr=10.10.10.10/24
完成的,因为后者是我主人的 IP。
好吧,正如所指出的 here not using the official recommended --pod-network-cidr=10.244.0.0/16
导致错误 例如使用 kubectl proxy
或在使用提供的 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
时创建容器。
这是因为 10.244.0.0/16
在 .yaml
中是硬 link,因此是强制性的 - 或者您只需在 .yaml
.[=39 中更改它=]
为了摆脱错误的配置,我进行了完全重置。
这可以使用 sudo kubeadm reset
并通过使用 sudo rm -r ~/.kube/config
删除配置来实现。
无论如何,因为我把它搞砸了,我通过卸载并重新安装 kubeadm
并确保这次它确实使用了 iptables
进行了完全重置(我之前也忘记这样做......)。
kubeadm reset
sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
sudo apt-get autoremove
sudo rm -rf ~/.kube
为了完整起见,这里也重装一下:
# ensure legacy binaries are installed
sudo apt-get install -y iptables arptables ebtables
# switch to legacy versions
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy
# Install Kubernetes with kubeadm
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
#reboot
...终于成功了!
完全重新安装后,我执行了以下操作:
# Initialize with correct cidr
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
然后对结果感到震惊:
kubectl get pods --all-namespaces
在站点注释中:这也解决了我在执行这些步骤之前描述未创建的 coredns 时遇到的 /run/flannel/subnet.env: no such file or directory
错误。
所以我遇到了与上述相同的问题。对我来说,这是解决此问题的完美解决方案,但其他 pods 也卡在了挂起或 ContainerCreating 上。 除了上面的修复,我的 flannel 遇到了一个未被注意到的错误,所以我需要重新运行 flannel create。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml