本文永久链接: https://www.xtplayer.cn/kubernetes/pod-not-run/

问题现象

在早期 rancher kubernetes 版本中,在新集群创建应用后可能会出现大批量的 Pod 处于 ContainerCreating 状态。如图:

通过 kubectl describe 查看应用的事件,提示无法获取 IP 地址:

查看 kubelet 服务日志,可以看到以下的错误信息:

E0824 08:04:39.776000   20094 cni.go:331] Error adding kube-system_coredns-59db856b69-b2jck/ead1d2646611bcee3bdb9e0900a53139af282232f6354b156b92a91bdcc3cfee to network flannel/cbr0: open /proc/sys/net/ipv6/conf/eth0/accept_dad: no such file or directory
E0824 08:04:39.809938 20094 cni.go:352] Error deleting kube-system_coredns-59db856b69-b2jck/ead1d2646611bcee3bdb9e0900a53139af282232f6354b156b92a91bdcc3cfee from network flannel/cbr0: failed to get IP addresses for "eth0": <nil>
E0824 08:04:39.863051 20094 cni.go:331] Error adding kube-system_kubernetes-dashboard-776548b567-j4d86/b6fb00ab9b815ea8a04242b263bfce958b15d0e3efeacc62e5132de8e5e95397 to network flannel/cbr0: open /proc/sys/net/ipv6/conf/eth0/accept_dad: no such file or directory
E0824 08:04:39.863229 20094 cni.go:331] Error adding kube-system_coredns-autoscaler-5b4f4f8f6b-zs7qq/aa3e232e5364e2d90fda2dd75e10da3b34a998812d06d22a4549995de26e7157 to network flannel/cbr0: open /proc/sys/net/ipv6/conf/eth0/accept_dad: no such file or directory
E0824 08:04:39.886022 20094 cni.go:331] Error adding kube-system_metrics-server-66c5c9947c-6k852/012960c8e4c6c525072acb93ed1795fc6b7f66003bf7da855d35da618d9310eb to network flannel/cbr0: open /proc/sys/net/ipv6/conf/eth0/accept_dad: no such file or directory

问题分析

根据以上信息可以确定,因为主机不支持 ipv6 或者 ipv6 功能被禁用,导致 flannel 在初始化容器网卡的时候一直无法初始化容器网卡的 IPV6 相关配置,从而导致容器无法正常获取 IP 地址。

处理方法

经过查询可以找到这是一个已知的 BUG,在不考虑更新 rancher kubernetes 版本的前提下,则需要在主机上强制启用 ipv6 功能。

centos

  1. 编辑 /etc/default/grub,如果之前配置了 ipv6.disable=1,则把它改为 ipv6.disable=0;如果之前没有添加 ipv6.disable 这个参数,则在现有的配置上添加 ipv6.disable=0

    示例如下:

    GRUB_CMDLINE_LINUX="xxxxxx ipv6.disable=0"
  2. 然后执行以下配置更新 grub 配置

    grub2-mkconfig -o /boot/grub2/grub.cfg

  3. 最后 reboot 重启系统

Ubuntu

  1. 编辑 /etc/default/grub,如果之前配置了 ipv6.disable=1,则把它改为 ipv6.disable=0;如果之前没有添加 ipv6.disable 这个参数,则在现有的配置上添加 ipv6.disable=0

    示例如下:

    GRUB_CMDLINE_LINUX="xxxxxx ipv6.disable=0"
  2. 然后执行以下配置更新 grub 配置

    update-grub
  3. 最后 reboot 重启系统

参考链接

https://github.com/containernetworking/cni/issues/569

https://github.com/rancher/flannel-cni/pull/8