Kubernetes не удалось создать изолированную программную среду pod с отключенным IPv6
Я вчера заметил следующую ситуацию с Кубернетесом. Пришлось установить Kubernetes на ОС Redhat 7.3 с помощью kubeadm. В качестве сетевого плагина я использовал фланель. Все прошло нормально, пока я не обнаружил, что мой DNS-модуль не может запуститься со следующей ошибкой:
Normal SandboxChanged 13m (x42200 over 13h) kubelet, k8s-master Pod sandbox changed, it will be killed and re-created.
Warning FailedCreatePodSandBox 3m (x42687 over 13h) kubelet, k8s-master Failed create pod sandbox.
Я проверил свой интерфейс cni и обнаружил следующее:
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:00:00:00:00:00 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Там не было IP-адреса и Mac. Затем я проверил каталог /var/lib/cni/networks/cbr0/. Были файлы, которые соответствуют сети 10.244.0.0/24, которая выделена этому хосту фланелевой.
Тогда я проверил логи:
journalctl -xe | grep cni
Jan 24 20:35:02 k8s-master kubelet[3353]: E0124 20:35:02.979434 3353 cni.go:259] Error adding network: open /proc/sys/net/ipv6/conf/eth0/accept_dad: no such file or directory
Jan 24 20:35:02 k8s-master kubelet[3353]: E0124 20:35:02.979452 3353 cni.go:227] Error while adding to cni network: open /proc/sys/net/ipv6/conf/eth0/accept_dad: no such file or directory
Jan 24 20:35:03 k8s-master kubelet[3353]: E0124 20:35:03.260145 3353 remote_runtime.go:92] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = NetworkPlugin cni failed to set up pod "kube-dns-6f4fd4bdf-mcztl_kube-system" network: open /proc/sys/net/ipv6/conf/eth0/accept_dad: no such file or directory
Итак, что-то связано с ipv6, но я не знаю почему, потому что мы не используем протокол IPv6. Затем я проверил модуль IPv6 на уровне ядра и обнаружил, что он отключен:
GRUB_CMDLINE_LINUX="ipv6.disable=1"
Просто для теста я попытался включить его, и это помогло pod получить IP все стало нормально.
Может кто-нибудь прояснить эту ситуацию, может быть, вы столкнулись с той же проблемой? Почему я не могу отключить IPv6, если я не использую его?
Заранее спасибо.
1 ответ
Если вы хотите использовать IPv4 только в своем кластере, вам необходимо соответствующим образом настроить мост CNI.
По умолчанию :
export PODCIDR="10.244.0.0/16"
curl -sSL "https://raw.githubusercontent.com/cri-o/cri-o/main/contrib/cni/11-crio-ipv4-bridge.conf" | sed "s:10.85.0.0/16:${PODCIDR}:g" | tee /etc/cni/net.d/11-crio-ipv4-bridge.conf
curl -sSL "https://raw.githubusercontent.com/cri-o/cri-o/main/contrib/cni/99-loopback.conf" -o /etc/cni/net.d/99-loopback.conf
rm /etc/cni/net.d/10-crio-bridge.conf
systemctl restart NetworkManager