kubernetes 学習 dns
service, pod の名前解決を調べた。
最初に確認
kbhello でHOSTNAMEを表示するようにした。 kbhello-deployment が 3podあり、kb2 kb3 の2node で実行中。
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kbhello-deployment-664dd576d4-29pkt 1/1 Running 0 15m 10.244.1.90 kb2 <none> <none> kbhello-deployment-664dd576d4-n9t8t 1/1 Running 0 33s 10.244.2.37 kb3 <none> <none> kbhello-deployment-664dd576d4-nrj9j 1/1 Running 0 15m 10.244.1.91 kb2 <none> <none>
ClusterIP 確認
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbhello-service-cip ClusterIP 10.104.228.167 <none> 8080/TCP 2d23h kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42d
curl。ip:10.104.228.167 が3pod(2node) に対応していることが分かる。
$ curl 10.104.228.167:8080 Hello Docker World kbhello-deployment-664dd576d4-n9t8t $ curl 10.104.228.167:8080 Hello Docker World kbhello-deployment-664dd576d4-nrj9j $ curl 10.104.228.167:8080 Hello Docker World kbhello-deployment-664dd576d4-29pkt
ClusterIPの名前解決
kbhello がクラスタ内のapiサービスだとしたら、このapiにどうやってアクセスしたらいい? ipアドレスはサービス作成毎に変わってしまうから名前で引きたい。
「通常の」(ヘッドレスではない)サービスには、フォームの名前のDNS Aレコードが割り当てられています。 「my-svc.my-namespace.svc.cluster.local」 これはサービスのクラスタIPに解決されます。
ということは、こうなる。
kbhello-service-cip.default.svc.cluster.local
pod から ping してみる。なるほど。
$ kubectl exec -it kbhello-deployment-664dd576d4-n9t8t ping kbhello-service-cip.default.svc.cluster.local PING kbhello-service-cip.default.svc.cluster.local (10.104.228.167): 56 data bytes ^C --- kbhello-service-cip.default.svc.cluster.local ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss command terminated with exit code 1 $ kubectl exec -it kbhello-deployment-664dd576d4-nrj9j ping kbhello-service-cip.default.svc.cluster.local PING kbhello-service-cip.default.svc.cluster.local (10.104.228.167): 56 data bytes : $ kubectl exec -it kbhello-deployment-664dd576d4-29pkt ping kbhello-service-cip.default.svc.cluster.local PING kbhello-service-cip.default.svc.cluster.local (10.104.228.167): 56 data bytes :
名前解決はしているが、レシーブせず100%ロスしている。 nslookup してみた。
$ kubectl exec -it kbhello-deployment-664dd576d4-29pkt nslookup kbhello-service-cip.default.svc.cluster.local nslookup: can't resolve '(null)': Name does not resolve Name: kbhello-service-cip.default.svc.cluster.local Address 1: 10.104.228.167 kbhello-service-cip.default.svc.cluster.local
/etc/resolv.conf を確認。
$ kubectl exec -it kbhello-deployment-664dd576d4-29pkt cat /etc/resolv.conf nameserver 10.96.0.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
完全修飾でなく サービス名:kbhello-service-cip でも引けそうだ。引けた。
$ kubectl exec -it kbhello-deployment-664dd576d4-29pkt nslookup kbhello-service-cip core@kb1 ~ $ kubectl exec -it kbhello-deployment-664dd576d4-29pkt nslookup kbhello-service-cip nslookup: can't resolve '(null)': Name does not resolve Name: kbhello-service-cip Address 1: 10.104.228.167 kbhello-service-cip.default.svc.cluster.local
逆に完全修飾ならnamepsaceを超えられるのか?
/etc/hosts を確認。10.244.1.90 はこのpod のipアドレス。kbhello-deployment-664dd576d4-29pkt はこのポッドの名前。
$ kubectl exec -it kbhello-deployment-664dd576d4-29pkt cat /etc/hosts # Kubernetes-managed hosts file. 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 10.244.1.90 kbhello-deployment-664dd576d4-29pkt
Podの名前解決
podも名前解決できるようだ。
ポッドにはDNS Aレコードが「pod-ip-address.my-namespace.pod.cluster.local」の形式で割り当てられます。
ということは、こうか。
10-244-1-90.default.pod.cluster.local 10-244-2-37.default.pod.cluster.local 10-244-1-91.default.pod.cluster.local
ping してみる。こちらはレシーブしている。
$ kubectl exec -it kbhello-deployment-664dd576d4-29pkt ping 10-244-1-90.default.pod.cluster.local PING 10-244-1-90.default.pod.cluster.local (10.244.1.90): 56 data bytes 64 bytes from 10.244.1.90: seq=0 ttl=64 time=0.048 ms : $ kubectl exec -it kbhello-deployment-664dd576d4-29pkt ping 10-244-1-91.default.pod.cluster.local PING 10-244-1-91.default.pod.cluster.local (10.244.1.91): 56 data bytes 64 bytes from 10.244.1.91: seq=0 ttl=63 time=0.116 ms : $ kubectl exec -it kbhello-deployment-664dd576d4-29pkt ping 10-244-2-37.default.pod.cluster.local PING 10-244-2-37.default.pod.cluster.local (10.244.2.37): 56 data bytes 64 bytes from 10.244.2.37: seq=0 ttl=62 time=0.575 ms :
podの名前解決が必要なケースはなんだろう。思いつかない。