コンテナを複数起動して,ロードバランサーなどを使って「期待通りに振り分けできているよ!」という挙動をデモで見せたいときがある.実際に最近あった.例えば nginx:alpine
イメージを使うと,全て同じ index.html
から Welcome to nginx! とレスポンスを返すため「振り分け確認」ができない.自分で Dockerfile
を書いて nginx.conf
をゴニョゴニョしたイメージを作ることもできるけど,そこまで頑張るモチベーションもなく,すぐに使えそうなイメージを探していた.
NGINX-Demos
GitHub に NGINX が管理をしている NGINX-Demos
という名前のリポジトリがあり,そこに nginx-hello-nonroot
というサンプルが公開されていた.イメージとしては,大きく以下の2種類のタグがある.
nginxdemos/nginx-hello
(HTML Version)nginxdemos/nginx-hello:plain-text
(TEXT Version)
とは言え,特別な仕組みになっているわけではなく,以下の情報を Nginx のレスポンスとして返すような nginx.conf
になっている.特にコンテナだと Server name に CONTAINER ID
が入るため,これを使えば「振り分け確認」ができそうだった.さっそく試していく.
- Server address
- Server name
- Date
- URI
- Request ID (TEXT Version なら)
nginxdemos/nginx-hello を試す
まず,Docker Desktop for Mac を使って nginxdemos/nginx-hello
(HTML Version) を試す.
$ docker run -p 8080:8080 nginxdemos/nginx-hello
docker run
コマンドで起動して http://localhost:8080
にアクセスすると,以下のようなサイトが表示される.HTML Version なので Server name などの情報が含まれている.
次に nginxdemos/nginx-hello:plain-text
(TEXT Version) を試す.HTML 形式ではなく TEXT 形式でレスポンスを返すため,以下のように curl
コマンドで確認できる.TEXT Version の場合は Request ID も追加されていた.
$ docker run -p 8080:8080 nginxdemos/nginx-hello:plain-text $ curl http://localhost:8080 Server address: 172.17.0.2:8080 Server name: 5b3c7d619c33 Date: 18/Dec/2020:04:10:00 +0000 URI: / Request ID: ac88e3123910f01d56ea369ef6f99947
Kubernetes で nginxdemos/nginx-hello:plain-text を試す
次に Docker Desktop for Mac を使って Kubernetes 1.19.3 環境で試す.nginxdemos/nginx-hello:plain-text
を起動する Deployment リソースとロードバランサーとして使う Service リソースを作る.マニフェストは以下のようにした.
📝 deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: sandbox-nginx-hello-deployment spec: replicas: 3 selector: matchLabels: app: sandbox-nginx-hello template: metadata: labels: app: sandbox-nginx-hello spec: containers: - name: nginx image: nginxdemos/nginx-hello:plain-text ports: - containerPort: 80
📝 service.yaml
apiVersion: v1 kind: Service metadata: name: sandbox-nginx-hello-service spec: type: ClusterIP ports: - name: "http" protocol: "TCP" port: 80 targetPort: 8080 selector: app: sandbox-nginx-hello
実際にマニフェストを適用する.deployment.yaml
の replicas
に指定した通り「3 Pods」を確認できる.
$ kubectl apply -f deployment.yaml deployment.apps/sandbox-nginx-hello-deployment created $ kubectl get pods NAME READY STATUS RESTARTS AGE sandbox-nginx-hello-deployment-6f44bbdd58-5lfbx 1/1 Running 0 10s sandbox-nginx-hello-deployment-6f44bbdd58-k56dt 1/1 Running 0 10s sandbox-nginx-hello-deployment-6f44bbdd58-zm92w 1/1 Running 0 10s $ kubectl apply -f service.yaml service/sandbox-nginx-hello-service created $ kubectl get services sandbox-nginx-hello-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sandbox-nginx-hello-service ClusterIP 10.100.85.32 <none> 80/TCP 30s
動作確認をするために適当に Alpine コンテナを起動して,Service に対して3回連続で curl
コマンドを実行する.すると sandbox-nginx-hello-deployment-6f44bbdd58-k56dt
➔ sandbox-nginx-hello-deployment-6f44bbdd58-zm92w
➔ sandbox-nginx-hello-deployment-6f44bbdd58-5lfbx
のようにレスポンスの Server name が変わった.これで「振り分け確認」ができた.便利!
$ kubectl run -i --tty alpine --image=alpine --restart=Never -- sh / # apk add curl / # curl http://sandbox-nginx-hello-service Server address: 10.1.0.158:8080 Server name: sandbox-nginx-hello-deployment-6f44bbdd58-k56dt Date: 18/Dec/2020:04:30:00 +0000 URI: / Request ID: 6775a3b7823e5fa8596451135de08b70 / # curl http://sandbox-nginx-hello-service Server address: 10.1.0.159:8080 Server name: sandbox-nginx-hello-deployment-6f44bbdd58-zm92w Date: 18/Dec/2020:04:31:00 +0000 URI: / Request ID: 10ebe1ab86f55ce21f091a498264cb15 / # curl http://sandbox-nginx-hello-service Server address: 10.1.0.160:8080 Server name: sandbox-nginx-hello-deployment-6f44bbdd58-5lfbx Date: 18/Dec/2020:04:32:00 +0000 URI: / Request ID: 86e5b2379eedcd2dd7cf7706947d8bf3
まとめ
最近発見した NGINX-Demos
リポジトリにある nginxdemos/nginx-hello
イメージを使うと,レスポンスに Server name などの情報が含まれるため「振り分け確認」に使える.知っておくと便利なイメージだと思う!