-
Notifications
You must be signed in to change notification settings - Fork 41.9k
Description
What happened?
Running kubelet on a host with iptables-1.8.8 (nf_tables mode) does not work due to kube-proxy image uses iptables-1.8.7. kube-proxy ends up replace the rule
-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP
with
-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -j DROP
This leads to network stop working.
What did you expect to happen?
Network continue to work regardless of version of iptables installed on the host.
How can we reproduce it (as minimally and precisely as possible)?
Try to join a worker with iptables 1.8.8 in nf_tables mode on the host.
Anything else we need to know?
Problem is that iptables-save with iptables 1.8.7 does not work with iptables rules created with iptables 1.8.8 (nf_tables).
If I on the host manually (using iptables 1.8.8) do:
iptables-save | grep -E '(Generated by|mytest)'
# Generated by iptables-save v1.8.8 (nf_tables) on Thu Sep 15 14:34:46 2022
# Generated by iptables-save v1.8.8 (nf_tables) on Thu Sep 15 14:34:46 2022
-A KUBE-FIREWALL -m comment --comment mytest -m mark --mark 0x8000/0x8000 -j DROP
# Generated by iptables-save v1.8.8 (nf_tables) on Thu Sep 15 14:34:46 2022It shows the -m --mark 0x8000/0x8000.
If I then use nsenter to the kube-proxy pod and do the same I get:
/ # nsenter -t $(pidof kube-proxy) -m iptables-save | grep -E '(Generated by|mytest)'
# Generated by iptables-save v1.8.7 on Thu Sep 15 14:36:38 2022
# Generated by iptables-save v1.8.7 on Thu Sep 15 14:36:38 2022
-A KUBE-FIREWALL -m comment --comment mytest -j DROP
# Generated by iptables-save v1.8.7 on Thu Sep 15 14:36:38 2022
As you see, the -m --mark 0x8000/0x8000 is lost and all packages are dropped, not only the marked ones.
Possible workarounds:
- use iptables in legacy mode on host
- downgrade iptables to 1.8.7 on the host
Possible fixes:
- upgrade iptables in kube-proxy image to 1.8.8 (and make sure that it always is latest).
- change logic in kube-proxy so that it does not touch/re-inject previously created iptables rules (eg does not
iptables-save | ... | iptables-restore)
Kubernetes version
$ kubectl version
W0915 14:46:03.488791 2464 loader.go:223] Config not found: /var/lib/k0s/pki/admin.conf
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.0", GitCommit:"a866cbe2e5bbaa01cfd5e969aa3e033f3282a8a2", GitTreeState:"clean", BuildDate:"2022-08-23T17:44:59Z", GoVersion:"go1.19", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
Unable to connect to the server: dial tcp 127.0.0.1:8080: i/o timeoutCloud provider
OS version
# On Linux:
$ cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.16.2
PRETTY_NAME="Alpine Linux v3.16"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
$ uname -a
Linux worker0 5.15.67-0-lts #1-Alpine SMP Fri, 09 Sep 2022 06:15:47 +0000 x86_64 GNU/Linu