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が変わっていますが、問題無く起動しています。
追加で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内から取得出来ることが確認できました。