はじめに
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で名前解決を行っている動きは、覚えておくと名前解決失敗時の問題切り分けで役立つと思います。
以上、ご参考になれば幸いです。