taxin's notes

読書、勉強メモ etc.

Kubernetes the hard way (GCP版) #12 (DNSクラスターアドオンのデプロイ)

Kubernetes the hard way (GCP版)の続きです。

前回の記事はこちら

taxintt.hatenablog.com

Chap12. Deploying the DNS Cluster Add-on(DNSクラスターアドオンのデプロイ)

このチャプターでは、サービスディスカバリの役割を果たすクラスターアドオン(CoreDNS)のデプロイを行います。

CoreDNSに関しては、公式ドキュメントにおいてもサービスディスカバリ(=Service Discovery)の一種として紹介されています。

kubernetes.io

(+α)Service Discoveryとは?

その名の通り、特定の条件に該当するサービスを発見するための機能のことを指します。
ただし、ここで記載しているサービスはクラスタ内外のNW疎通を取るために利用されるServiceのことではなく、クラスタ上で動作しているサービスを指しています。

特定のServiceに紐づいているPodを列挙したり、Serviceの名前からServiceのEndpoint(IP)を返すことをService Discoveryと言います。
(ServiceのEndpointに関する処理では、特定のサービスを発見した上でEndpointなど必要な情報を取得しています。)

Service Discoveryに関しては、主に環境変数DNSの2つのモードで実現可能です。

kubernetes.io

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の内容をまとめました。