こんにちは、LinuCエバンジェリストこと、鯨井貴博@opensourcetechです。

今回は、kubernetesのPod(nginx*4台)へ外部からアクセスする方法です。
なお、アクセス方法としてはNodePortを使用しています。
Pod(nginx)の用意
バックエンドのWebサーバとなるnginxですが、以下のYAMLファイルをApplyしました。
https://github.com/kujiraitakahiro/kubernetes/blob/master/test1.yaml
Natadecoco:~ tapioka$ kubectl apply -f test1.yaml
deployment.apps/nginx-deployment configured
Natadecoco:~ tapioka$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-68789fb7cc-4ld6w 1/1 Running 0 21m
nginx-deployment-68789fb7cc-5nkwc 1/1 Running 0 5h20m
nginx-deployment-68789fb7cc-m4dxc 1/1 Running 0 5h20m
nginx-deployment-68789fb7cc-snsp7 1/1 Running 0 8s
なお、各nginxにはアクセスした際に区別がつくように、背景色を変更したコンテンツを置いています。
※以下のindex.html 10行目の「background-color: green;」をred/blueに変更。
https://github.com/kujiraitakahiro/kubernetes/blob/master/index.html
Natadecoco:~ tapioka$ kubectl cp ./index.html nginx-deployment-68789fb7cc-5nkwc:/usr/share/nginx/html/index.html
Natadecoco:~ tapioka$ kubectl cp ./index.html nginx-deployment-68789fb7cc-m4dxc:/usr/share/nginx/html/index.html
サービス(NodePort)のアプライ
続いて、サービス(NodePort)をアプライします。
アプライするのは、以下のYAMLファイルです。
https://github.com/kujiraitakahiro/kubernetes/blob/master/test1-nodeport.yaml
service/test-nodeport created
Natadecoco:~ tapioka$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
test-nodeport NodePort 10.106.177.216 <none> 8080:30080/TCP 6s
Natadecoco:~ tapioka$ kubectl describe svc test-nodeport
Name: test-nodeport
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"test-nodeport","namespace":"default"},"spec":{"ports":[{"name":"h...
Selector: app=nginx
Type: NodePort
IP: 10.106.177.216
LoadBalancer Ingress: localhost
Port: http-port 8080/TCP・・・・サービスのポート
TargetPort: 80/TCP・・・・Podの待ち受けポート
NodePort: http-port 30080/TCP・・・・kubernetes稼働ホストの対応ポート
Endpoints: 10.1.0.104:80,10.1.0.105:80,10.1.0.106:80 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
上記により、以下のように通信が行われPodのnginxへアクセスできます。
-------
kubernetes稼働ホストの30080/TCP
↓
サービスのポート 8080/TCP
↓
Pod(nginx)のポート 80/TCP
Pod(nginx)へのアクセス
Webブラウザより「http://localhost:30080」へアクセスすると、コンテンツが表示されるかと思います。
また、F5などをクリックして新規セッションとしてアクセスさせることで、
以下の動画のように4台のnginxに負荷分散されていることが確認出来ます。
kubernetes Podのダウン時の挙動
今回デプロイしたPod(nginx)では、常に4台が稼働するようにYAMLを書いていますので、以下のように1つのPodを削除した場合、自動的に1台が再作成されます。
Natadecoco:~ tapioka$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-68789fb7cc-4ld6w 1/1 Running 3 2d2h
nginx-deployment-68789fb7cc-5nkwc 1/1 Running 3 2d7h
nginx-deployment-68789fb7cc-m4dxc 1/1 Running 3 2d7h
nginx-deployment-68789fb7cc-snsp7 1/1 Running 3 2d2h <--削除対象
Natadecoco:~ tapioka$ kubectl delete pods nginx-deployment-68789fb7cc-snsp7
pod "nginx-deployment-68789fb7cc-snsp7" deleted
Natadecoco:~ tapioka$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-68789fb7cc-4ld6w 1/1 Running 3 2d2h
nginx-deployment-68789fb7cc-5nkwc 1/1 Running 3 2d7h
nginx-deployment-68789fb7cc-bgr6w 1/1 Running 0 14s <--再作成された!
nginx-deployment-68789fb7cc-m4dxc 1/1 Running 3 2d7h
おわりに
今回はNodePortを使ってサービス(Pod)へアクセスしましたが、
他にもCluster-IPやExternal-IPを使ったアクセスも可能とのことですので、
またの機会に挑戦してみようと思います。