kube-dnsがErrorを繰り返していたので、動作をまとめる。
問題はこのPod。
ubuntu@k8s-master:~$ kubectl get pod -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
kube-system kube-dns-f64d97d84-8lmhx 3/3 Running 0 44m 172.16.0.35 k8s-node3
describeしてみると、LivenessとReadinessにhttp-getを使っているんですよ。
Liveness: http-get http://:10054/healthcheck/kubedns delay=60s timeout=5s period=10s #success=1 #failure=5
Readiness: http-get http://:8081/readiness delay=3s timeout=5s period=10s #success=1 #failure=3
今回だとk8s-node3上で動作しているので、k8s-node3のホストネットワークからPodのIP宛にProbeしてるんですね。
Calicoとか使っているとip route
するとわかるのですが、Pod宛IPはコンテナインタフェースに向いてます。
そのため、この通信のためにノードからでることはない。図は以下の通り。
しかし、CNIによっては管理用ネットワークとPodネットワークが完全に分離されている場合がある。
その場合には、Probeが毎度管理用ネットワークからPodネットワークに対して通信が発生し、2つのネットワーク間でルーティングが必要になる。
図は以下の通り。
ip tablesを使おうが、そもそも分離されたネットワークなのでProbeがノード外に出る必要がある。
その上、トップにあるルータに2つのネットワークでルーティングが必要。
ラボとかは問題ないけど、商用に使うときはセキュリティとかどうするんやろうか。
そもそもhttpを使わないという選択肢もあるんだろうけど、特定のPodだけ、ホストのポートにBindしてlocalhost宛にProbeできないんかな?