📑

kube-proxy の iptables って node ごとに差が出るのか

2022/05/01に公開

iptables に差が出るのか、見てみる。
今回は --enable-addons monitoring option 付きの AKS なので余計なのがあるかもしれない。

kube-dns が 10.0.0.10 で動いてて、これを追いかけてみる。

$ kubectl get svc kube-dns -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
kube-dns   ClusterIP   10.0.0.10    <none>        53/UDP,53/TCP   104m

coredns は aks-nodepool1-10688416-vmss000001 と aks-nodepool1-10688416-vmss000002 で動いている。
aks-nodepool1-10688416-vmss000000 では動いてない。

$ kubectl get po -l k8s-app=kube-dns -n kube-system -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE                                NOMINATED NODE   READINESS GATES
coredns-69c47794-4kplx   1/1     Running   0          93m   10.244.1.3   aks-nodepool1-10688416-vmss000002   <none>           <none>
coredns-69c47794-mgr58   1/1     Running   0          96m   10.244.2.6   aks-nodepool1-10688416-vmss000001   <none>           <none>

kube-proxy の node との関連付けはこちら。

$ kubectl get po -l component=kube-proxy -n kube-system -o wide
NAME               READY   STATUS    RESTARTS   AGE    IP           NODE                                NOMINATED NODE   READINESS GATES
kube-proxy-kngbq   1/1     Running   0          101m   10.224.0.6   aks-nodepool1-10688416-vmss000002   <none>           <none>
kube-proxy-n4w2k   1/1     Running   0          101m   10.224.0.5   aks-nodepool1-10688416-vmss000001   <none>           <none>
kube-proxy-pj49z   1/1     Running   0          101m   10.224.0.4   aks-nodepool1-10688416-vmss000000   <none>           <none>

aks-nodepool1-10688416-vmss000001 と aks-nodepool1-10688416-vmss000002 で動いてるのが kube-proxy-n4w2k と kube-proxy-kngbq
Cluter IP は iptablesKUBE-SERVICES chain で捌かれてるのでそれだけとりあえず。

$ kubectl exec kube-proxy-n4w2k -n kube-system -- iptables -nL KUBE-SERVICES -t nat --line-numbers
Chain KUBE-SERVICES (2 references)
num  target     prot opt source               destination
1    KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  0.0.0.0/0            10.0.0.1             /* default/kubernetes:https cluster IP */ tcp dpt:443
2    KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  0.0.0.0/0            10.0.0.10            /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:53
3    KUBE-SVC-TCOU7JCQXEZGVUNU  udp  --  0.0.0.0/0            10.0.0.10            /* kube-system/kube-dns:dns cluster IP */ udp dpt:53
4    KUBE-SVC-QMWWTXBG7KFJQKLO  tcp  --  0.0.0.0/0            10.0.60.35           /* kube-system/metrics-server cluster IP */ tcp dpt:443
5    KUBE-SVC-WT3SFWJ44Q74XUPR  tcp  --  0.0.0.0/0            10.0.36.18           /* kube-system/healthmodel-replicaset-service cluster IP */ tcp dpt:25227
6    KUBE-NODEPORTS  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL
$ kubectl exec kube-proxy-kngbq -n kube-system -- iptables -nL KUBE-SERVICES -t nat --line-numbers
Chain KUBE-SERVICES (2 references)
num  target     prot opt source               destination
1    KUBE-SVC-QMWWTXBG7KFJQKLO  tcp  --  0.0.0.0/0            10.0.60.35           /* kube-system/metrics-server cluster IP */ tcp dpt:443
2    KUBE-SVC-WT3SFWJ44Q74XUPR  tcp  --  0.0.0.0/0            10.0.36.18           /* kube-system/healthmodel-replicaset-service cluster IP */ tcp dpt:25227
3    KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  0.0.0.0/0            10.0.0.1             /* default/kubernetes:https cluster IP */ tcp dpt:443
4    KUBE-SVC-TCOU7JCQXEZGVUNU  udp  --  0.0.0.0/0            10.0.0.10            /* kube-system/kube-dns:dns cluster IP */ udp dpt:53
5    KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  0.0.0.0/0            10.0.0.10            /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:53
6    KUBE-NODEPORTS  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL

んで、aks-nodepool1-10688416-vmss000000 のが kube-proxy-pj49z

$ kubectl exec kube-proxy-pj49z -n kube-system -- iptables -nL KUBE-SERVICES -t nat --line-numbers
Chain KUBE-SERVICES (2 references)
num  target     prot opt source               destination
1    KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  0.0.0.0/0            10.0.0.10            /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:53
2    KUBE-SVC-QMWWTXBG7KFJQKLO  tcp  --  0.0.0.0/0            10.0.60.35           /* kube-system/metrics-server cluster IP */ tcp dpt:443
3    KUBE-SVC-WT3SFWJ44Q74XUPR  tcp  --  0.0.0.0/0            10.0.36.18           /* kube-system/healthmodel-replicaset-service cluster IP */ tcp dpt:25227
4    KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  0.0.0.0/0            10.0.0.1             /* default/kubernetes:https cluster IP */ tcp dpt:443
5    KUBE-SVC-TCOU7JCQXEZGVUNU  udp  --  0.0.0.0/0            10.0.0.10            /* kube-system/kube-dns:dns cluster IP */ udp dpt:53
6    KUBE-NODEPORTS  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL

微妙に順番が違うのが気になるけど大した差は生まないと思うのでまぁいいかなとは思う。

それから、そりゃそうか、って話なんだけど Cluster IP のがそれぞれの iptables に登録されてるんだな、と。
もうちょっと効率よくできてもいいかなとは思うけど nodes / pods がいる subnet から IP アドレス使わずに実装しようと思うとこうなるか。

Microsoft (有志)

Discussion