ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

microk8sのpod内からserviceを検索してみる

serviceのIPアドレスは他のpodからはどう見えるのか?

前回のエントリーで、service,deployment,replicasetを立ち上げ、ホスト上からnslookupコマンドを使い、microk8s内のdnsサーバーにアクセスすることでserviceに付与したservice名からserviceのCluster IPが引けることを確認しました。
rc30-popo.hatenablog.com

実際にはkubernetes環境内に立ち上がった他のpodからserviceのCluster IPが引ける必要があります。

追加でこの事を確認してみます。

とりあえず前回同様にflask-helloアプリをservice化

$ sudo microk8s kubectl create -f svc-flaskhello.yaml
service/flask-hello created
deployment.apps/flask-hello-deploy created
$ sudo microk8s kubectl get pods,services,deployments
NAME                                     READY   STATUS    RESTARTS   AGE
pod/flask-hello-deploy-5465d8d8b-mbggv   1/1     Running   0          11s
pod/flask-hello-deploy-5465d8d8b-dnn7x   1/1     Running   0          11s

NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/kubernetes    ClusterIP   10.152.183.1     <none>        443/TCP    225d
service/flask-hello   ClusterIP   10.152.183.204   <none>        5000/TCP   12s

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/flask-hello-deploy   2/2     2            2           12s
$ sudo microk8s kubectl get pods --output=wide
NAME                                 READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
flask-hello-deploy-5465d8d8b-mbggv   1/1     Running   0          45s   10.1.3.204   ubuntu01   <none>           <none>
flask-hello-deploy-5465d8d8b-dnn7x   1/1     Running   0          45s   10.1.3.194   ubuntu01   <none>           <none>
$ sudo microk8s kubectl get services --namespace=kube-system
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
metrics-server              ClusterIP   10.152.183.144   <none>        443/TCP                  217d
kubernetes-dashboard        ClusterIP   10.152.183.59    <none>        443/TCP                  217d
dashboard-metrics-scraper   ClusterIP   10.152.183.209   <none>        8000/TCP                 217d
kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   7d17h

前回のエントリーとserviceやpodのCluster IPが変わっていますが、問題無く起動しています。

DNSサービスはkube-dnsとしてCluster IP=10.152.183.10で立ち上がっています。

追加でpodを1つ立ち上げる

flask-helloのイメージを利用してkubectlコマンドでpodを1つテスト用に起動します。
pod内ではflask-helloアプリの代わりに/bin/bashを起動してttyを接続します。
yamlの定義ファイルは作らず、kubectlコマンドだけでテンポラリでpodを起動してみます。

$ sudo microk8s kubectl run -i --tty flask-test --image=myubuntu:flask-hello --command -- /bin/bash
If you don't see a command prompt, try pressing enter.
root@flask-test:/flaskapp#

これでコンテナの中で/bin/bashに向かって直接コマンドを叩ける状態になりました。
ホストに別端末からログインしてkubectl get podsコマンドを叩くと3つ目のpodがflask-testというpod名で起動していることが判ります。

$ sudo microk8s kubectl get pods --output=wide
NAME                                 READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
flask-hello-deploy-5465d8d8b-mbggv   1/1     Running   0          13m     10.1.3.204   ubuntu01   <none>           <none>
flask-hello-deploy-5465d8d8b-dnn7x   1/1     Running   0          13m     10.1.3.194   ubuntu01   <none>           <none>
flask-test                           1/1     Running   0          2m21s   10.1.3.202   ubuntu01   <none>           <none>

さて、この新しく起動したpodからはDNSサーバーがどう見えるのでしょうか?
/etc/resolv.confを確認してみます。

root@flask-test:/flaskapp# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.152.183.10
options ndots:5

nameserverとして10.152.183.10が設定されています。細かい仕掛けは判りませんが、kubernetesがコンテナ起動時に仕込んでくれる様です。

実際にDNS検索を実行してみます。このコンテナイメージには最小限のubuntuイメージとpython3環境しか入っていないので、nslookupやdigコマンドは利用できません。
python3をREPLモードで立ち上げてsocketモジュールを使って前回のエントリーと同じservice名「flask-hello.default.svc.cluster.local」を検索してみます。

root@flask-test:/flaskapp# python3
Python 3.6.9 (default, Dec  8 2021, 21:08:43) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostbyname('flask-hello.default.svc.cluster.local')
'10.152.183.204'

こんな感じで、socket.gethostbyname()を利用してservice/flask-hello のCluster IP 10.152.183.204が引けました。
serviceのCluster IPは前回エントリから動的に変わっていますが、DNS検索を使う事で正しいIPアドレスをpod内から取得出来ることが確認できました。