(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes入門】CoreDNSによる名前解決とは?

スポンサーリンク

はじめに

Kubernetesでは同じNamespaceに属するPodやデフォルトのドメインの名前解決にDNSを利用しています。

本記事ではDockerDesktop環境にて「kube-dns」サービスによる名前解決の動きをPod内でpingコマンドを打つことで確認してみます。

環境情報
  • Windows 10
  • Docker version 19.03.5
  • kubectl version 1.15.5

coredns関連のオブジェクトを確認する

corednsのPodはkube-systemの名前空間で動いているので以下コマンドで一覧が確認でき

> kubectl get pods -n kube-system
NAME                                     READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-249r6                 1/1     Running   1          119d
coredns-5c98db65d4-p4n6z                 1/1     Running   1          119d
...

Podの詳細は以下で確認できます。

> kubectl describe pods coredns-5c98db65d4-249r6 -n kube-system
Name:                 coredns-5c98db65d4-249r6
Namespace:            kube-system
Priority:             2000000000
Priority Class Name:  system-cluster-critical
...
Labels:               k8s-app=kube-dns
                      pod-template-hash=5c98db65d4
...
Controlled By:        ReplicaSet/coredns-5c98db65d4
Containers:
  coredns:
    Container ID:  docker://1d313315702789a6382556d9c7b494fb772e2283688c668f3fe67161466ec0e3
    Image:         k8s.gcr.io/coredns:1.3.1
...
    Ports:         53/UDP, 53/TCP, 9153/TCP
...
Node-Selectors:  beta.kubernetes.io/os=linux
...

corednsは2機のPodにて構成されていますがこちらはDeploymentとして生成されており

> kubectl get deployments -n kube-system
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
coredns    2/2     2            2           119d

サービスとして一般的なDNSサーバと同じく53番ポートで待ち受けています。

> kubectl get services -n kube-system
NAME       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   119d

Podを起動してDNSサービスを利用する

Kubernetesの世界では
ServiceName.Namespace.BaseDomainName
という名前空間となっています。

よって例えばKubernetesのサービスは「kubernetes.default.svc.cluster.local」であるため

> kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   119d

試しにテスト用のPodを作成し

> kubectl apply -f .\nginx-deployment.yaml
deployment.apps/nginx-deployment created
> kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-5754944d6c-ctscx   0/1     ContainerCreating   0          6s

Podにログイン後に以下コマンドを叩けば

# ping  kubernetes.default.svc.cluster.local
PING kubernetes.default.svc.cluster.local (10.96.0.1): 48 data bytes
^C--- kubernetes.default.svc.cluster.local ping statistics ---
...

名前解決ができています。

これはPod生成時にresolv.confに以下が登録されているからこその動きです。

# cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

終わりに

Pod間における名前解決にはhostsが利用されますが

サービス全体として見ればCoreDNSで名前解決を行っている動きは、覚えておくと名前解決失敗時の問題切り分けで役立つと思います。

以上、ご参考になれば幸いです。