【Kubernetes】DNSについて知る

2022.03.12
2024.03.24
Kubernetes
DNSPodService

はじめに

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

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のコンテナでコマンド実行とシェル取得

【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とクラスタのドメインが設定されている

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee