gpt4 book ai didi

docker - Kubernetes 使用 flannel 创建容器时卡在 "ContainerCreating"-state

转载 作者:行者123 更新时间:2023-12-02 21:02:15 25 4
gpt4 key购买 nike

上下文

我安装了Docker关注 this我的Ubuntu 18.04 LTS (Server)上的说明之后是 Kubernetes紧随其后的是 kubeadm .在初始化( 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:

enter image description here

问题

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

编辑

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

  • 使用的 Docker cgroups而不是 systemd
  • 我没有配置iptables正确
  • 我用错了kubeadm init因为法兰绒标准 yaml 需要 --pod-network-cidr成为 10.244.0.0/16
  • 最佳答案

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

    首先,这一切都始于 Docker...

    我发现这大概都是从我安装 Docker 的方式开始的。按照我使用的链接在线说明sudo apt-get install docker.io为了安装 Docker 并将其与 cgroups 一起使用通过做sudo usermod -aG docker $USER .

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

    所以我通过关注 these great instructions 彻底清除了我对 docker 所做的一切。从
    Mayur Bhandare:

    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 (请记住,这在 future 可能会改变):

    # 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。
    好吧,正如所指出的 here 不使用 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 中硬链接(hard link)因此,这是强制性的 - 或者您只需在 .yaml 中更改它.

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

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

    enter image description here

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

    关于docker - Kubernetes 使用 flannel 创建容器时卡在 "ContainerCreating"-state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60049036/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com