【Kubernetes】DNSについて知る
はじめに
Kubernetesでの名前解決について、PodやServiceの名前解決は誰がしているのか、実際に動かしながら確認してみたいと思います。
Kubernetes DNS
KubernetesのSeriveやPodの名前解決は、クラスタ内にあるDNSサーバが名前解決を行います。このDNSサーバはServiceとして動いています。
1❯ kubectl get service -n=kube-system
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 2m31s
このServiceは、下記のDeploymentに紐づいています。
1❯ kubectl get deployment -n=kube-system
2NAME READY UP-TO-DATE AVAILABLE AGE
3coredns 2/2 2 2 2m21s
さらに、このDeploymentは、下記のPodから構成されています。
1❯ kubectl get pods -n=kube-system
2NAME READY STATUS RESTARTS AGE
3coredns-558bd4d5db-hg75t 1/1 Running 0 4m51s
4coredns-558bd4d5db-ltbxt 1/1 Running 0 4m51s
Podは、corednsのイメージを利用しています。
1❯ kubectl describe -n=kube-system pod coredns-558bd4d5db-hg75t | grep -i image
2 Image: k8s.gcr.io/coredns/coredns:v1.8.0
3 Image ID: docker-pullable://k8s.gcr.io/coredns/coredns@sha256:cc8fb77bc2a0541949d1d9320a641b82fd392b0d3d8145469ca4709ae769980e
4 Normal Pulled 6m15s kubelet Container image "k8s.gcr.io/coredns/coredns:v1.8.0" already present on machine
GitHub - coredns/coredns: CoreDNS is a DNS server that chains plugins
CoreDNS is a DNS server that chains plugins. Contribute to coredns/coredns development by creating an account on GitHub.
このDNS ServiceのIPアドレス(ここでは10.96.0.10
)が、クラスタ内のコンテナの/etc/resolv.conf
に設定されています。
ServiceとPodのFQDN
ServiceとPodのFQDNは下記のようになります。
ServiceのFQDN
1<service name>.<namespace name>.svc.<cluster domain>
具体例
1nginx-service.default.svc.cluster.local
PodのFQDN
1<ip address>.<namespace name>.pod.<cluster domain>
具体例
110-1-4-118.default.pod.cluster.local
PodとServiceの名前解決してみる
実際にPodとServiceの名前解決をしてみます。
PodとServiceを用意する
まずは、下記3つを用意します。
- 名前解決するPod:
dnsutils-pod.yml
- 名前解決されるPod:
nginx-pod.yml
- 名前解決されるService:
nginx-service.yml
1apiVersion: v1
2kind: Pod
3metadata:
4 name: dnsutils
5 labels:
6 name: dnsutils
7spec:
8 containers:
9 - name: dnsutils
10 image: tutum/dnsutils
11 command:
12 - sleep
13 - "9999"
1apiVersion: v1
2kind: Pod
3metadata:
4 name: nginx-pod
5 labels:
6 name: nginx
7spec:
8 containers:
9 - name: nginx
10 image: nginx:latest
1apiVersion: v1
2kind: Service
3metadata:
4 name: nginx-service
5spec:
6 selector:
7 app: nginx
8 ports:
9 - port: 80
10 targetPort: 80
1kubectl apply -f dnsutils-pod.yml
2kubectl apply -f nginx-pod.yml
3kubectl apply -f nginx-service.yml
PodのIPアドレスなどは下記になります。
1❯ kubectl get pod -o wide
2NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
3dnsutils 1/1 Running 0 37m 10.1.4.119 docker-desktop <none> <none>
4nginx-pod 1/1 Running 0 37m 10.1.4.118 docker-desktop <none> <none>
/etc/resolv.confの確認
dnsutils-pod
に入って、/etc/resolv.conf
を確認してみます。
1kubectl exec -it dnsutils -c dnsutils -- /bin/bash
シェルの取得方法は下記で解説しています。
【Kubernetes】Podのコンテナでコマンド実行とシェル取得
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
/etc/resolv.conf
を確認してみると、最初に確認したDNSのIPアドレス10.96.0.10
が設定されているのがわかります。また、searchに「default.svc.cluster.local svc.cluster.local cluster.local」が設定されています。
1root@dnsutils:/# cat /etc/resolv.conf
2nameserver 10.96.0.10
3search default.svc.cluster.local svc.cluster.local cluster.local
4options ndots:5
Serviceの名前解決
nginx-service
の名前解決をしてみます。
1root@dnsutils:/# nslookup nginx-service
2Server: 10.96.0.10
3Address: 10.96.0.10#53
4
5Name: nginx-service.default.svc.cluster.local
6Address: 10.101.127.160
7
8root@dnsutils:/# nslookup nginx-service.default
9Server: 10.96.0.10
10Address: 10.96.0.10#53
11
12Name: nginx-service.default.svc.cluster.local
13Address: 10.101.127.160
14
15root@dnsutils:/# nslookup nginx-service.default.svc
16Server: 10.96.0.10
17Address: 10.96.0.10#53
18
19Name: nginx-service.default.svc.cluster.local
20Address: 10.101.127.160
21
22root@dnsutils:/# nslookup nginx-service.default.svc.cluster.local
23Server: 10.96.0.10
24Address: 10.96.0.10#53
25
26Name: nginx-service.default.svc.cluster.local
27Address: 10.101.127.160
searchに「default.svc.cluster.local svc.cluster.local cluster.local」が設定されていたので、「nginx-service」や「nginx-service.default」などでも名前解決ができているのがわかります。
Podの名前解決
次にnginx-pod
の名前解決をしてみます。
1root@dnsutils:/# nslookup 10-1-4-118.default.pod
2Server: 10.96.0.10
3Address: 10.96.0.10#53
4
5Name: 10-1-4-118.default.pod.cluster.local
6Address: 10.1.4.118
7
8root@dnsutils:/# nslookup 10-1-4-118.default.pod.cluster.local
9Server: 10.96.0.10
10Address: 10.96.0.10#53
11
12Name: 10-1-4-118.default.pod.cluster.local
13Address: 10.1.4.118
searchに「cluster.local」が設定されていたので、「10-1-4-118.default.pod」でも名前解決できています。
まとめ
- クラスタ内のDNS Serviceが名前解決している
- Podの
/etc/resolv.conf
にDNSのIPアドレスが設定されている /etc/resolv.conf
のsearchで同じNamespaceとクラスタのドメインが設定されている
参考
- ServiceとPodに対するDNS | Kubernetes
- coredns/coredns: CoreDNS is a DNS server that chains plugins
- Serviceのデバッグ | Kubernetes
- 「/etc/resolv.conf」ファイル - Linux技術者認定 LinuC | LPI-Japan