1

语境

Docker按照说明安装在我的设备Ubuntu 18.04 LTS (Server)上,Kubernetes然后通过kubeadm. 在初始化 ( kubeadm init --pod-network-cidr=10.10.10.10/24) 并加入第二个节点后(我一开始有一个双节点集群),我无法让我的coredns以及后来应用的Web UI(仪表板)实际进入状态Running

作为 pod 网络,我尝试了Flannel ( kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml) 和Weave Net - 没有任何改变。即使经过数小时的等待,它仍然显示状态ContainerCreating

在此处输入图像描述

问题

为什么容器创建没有按预期工作,这可能是什么根本原因?最重要的是:我该如何解决这个问题?

编辑

总结一下我的回答,原因如下:

  • 使用 Dockercgroups代替systemd
  • 我没有iptables正确配置
  • 我用错了kubeadm init,因为法兰绒标准 yaml--pod-network-cidr需要10.244.0.0/16
4

2 回答 2

4

由于回答这个问题花了我很多时间,我想分享是什么让我摆脱了这个问题。可能有一些不必要的代码,但如果我或其他人必须重做所有步骤,我也希望它在一个地方。



首先,这一切都是从 Docker 开始的……

我发现这大概都是从我安装Docker的方式开始的。sudo apt-get install docker.io按照我用来安装Docker并使用它的链接在线说明cgroupssudo usermod -aG docker $USER.

好吧,看看Kubernetes的官方说明,这是一个错误:systemd是推荐的方法!

因此,我按照 Mayur Bhandare 的这些重要指示,彻底清除了我对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

之后我以官方方式重新安装(请记住,这可能会在未来发生变化):

# 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



......然后它继续与法兰绒......

上面我写我的sudo kubeadm init已经完成了,--pod-network-cidr=10.10.10.10/24因为后者是我主人的IP。好吧,正如这里 指出的那样,不使用官方推荐 --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.yaml.

为了摆脱错误的配置,我进行了完全重置。这可以通过使用sudo kubeadm reset和删除配置来实现sudo rm -r ~/.kube/config。无论如何,由于我把它搞砸了,我通过卸载并重新安装kubeadm并确保它确实使用iptables了这个时间(我之前也忘记这样做了......)。

是一个很好的链接,如何完全卸载所有 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

在此处输入图像描述

在站点注释上:这也解决了/run/flannel/subnet.env: no such file or directory我在描述未创建的 coredns 时在这些步骤之前遇到的错误。

于 2020-02-04T00:38:55.770 回答
2

所以我遇到了与上述相同的问题。对我来说,这是解决此问题的完美解决方案,但其他 pod 也卡在待处理或 ContainerCreating 上。除了上面的修复,我的 flannel 遇到了一个未被注意到的错误,所以我需要重新运行 flannel create。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
于 2020-08-26T05:38:28.060 回答