tjtjtjのメモ

自分のためのメモです

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 for Services and Pods

「通常の」(ヘッドレスではない)サービスには、フォームの名前の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の名前解決が必要なケースはなんだろう。思いつかない。