Kubernetes the hard way (GCP版)の続きです。
前回の記事はこちら
Chap12. Deploying the DNS Cluster Add-on(DNSクラスターアドオンのデプロイ)
このチャプターでは、サービスディスカバリの役割を果たすクラスターアドオン(CoreDNS)のデプロイを行います。
CoreDNSに関しては、公式ドキュメントにおいてもサービスディスカバリ(=Service Discovery)の一種として紹介されています。
(+α)Service Discoveryとは?
その名の通り、特定の条件に該当するサービスを発見するための機能のことを指します。
ただし、ここで記載しているサービスはクラスタ内外のNW疎通を取るために利用されるServiceのことではなく、クラスタ上で動作しているサービスを指しています。
特定のServiceに紐づいているPodを列挙したり、Serviceの名前からServiceのEndpoint(IP)を返すことをService Discoveryと言います。
(ServiceのEndpointに関する処理では、特定のサービスを発見した上でEndpointなど必要な情報を取得しています。)
Service Discoveryに関しては、主に環境変数・DNSの2つのモードで実現可能です。
DNS Cluster Add-on
今回は、CoreDNSを利用してDNSを用いたService Discoveryを行うためのアドオンを環境にデプロイします。
下記のコマンドを実行して、アドオンとして利用するCoreDNSをデプロイします。
~/w/k/h/04 ❯❯❯ kubectl apply -f https://storage.googleapis.com/kubernetes-the-hard-way/coredns.yaml serviceaccount/coredns created clusterrole.rbac.authorization.k8s.io/system:coredns created clusterrolebinding.rbac.authorization.k8s.io/system:coredns created configmap/coredns created deployment.apps/coredns created service/kube-dns created ~/w/k/h/04 ❯❯❯ kubectl get pods -l k8s-app=kube-dns -n kube-system NAME READY STATUS RESTARTS AGE coredns-5fb99965-2f569 1/1 Running 0 8s coredns-5fb99965-4fbr9 1/1 Running 0 8s
applyしたyamlファイル内の設定値は確認できていないですが、おそらく下記と類似したような内容が定義されていると考えられます。
github.com
検証
今回はbusyboxのコンテナをデプロイして、コンテナ内からnslookup
コマンドを実行してkubernetes
のドメイン名からIPアドレスを取得します。
名前解決に成功すると、API Server用に作成されているService(ClusterIP)のクラスターIPが返ってくるはずです。
~/w/k/h/04 ❯❯❯ kubectl run --generator=run-pod/v1 busybox --image=busybox:1.28 --command -- sleep 3600 pod/busybox created ~/w/k/h/04 ❯❯❯ kubectl get pods -l run=busybox NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 5s ~/w/k/h/04 ❯❯❯ POD_NAME=$(kubectl get pods -l run=busybox -o jsonpath="{.items[0].metadata.name}") ~/w/k/h/04 ❯❯❯ echo $POD_NAME busybox
名前解決を行った結果、API Server用のServiceのクラスターIPを取得することができました。
これにより、クラスタ内での名前解決によるService Discoveryが可能になります。
~/w/k/h/04 ❯❯❯ kubectl exec -ti $POD_NAME -- nslookup kubernetes Server: 10.32.0.10 Address 1: 10.32.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes Address 1: 10.32.0.1 kubernetes.default.svc.cluster.local
今回は、Chap12の内容をまとめました。