kakakakakku blog

Weekly Tech Blog: Keep on Learning!

nginxdemos/nginx-hello イメージを使うと簡単に「コンテナ ID」を確認できる

コンテナを複数起動して,ロードバランサーなどを使って「期待通りに振り分けできているよ!」という挙動をデモで見せたいときがある.実際に最近あった.例えば 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 nameCONTAINER ID が入るため,これを使えば「振り分け確認」ができそうだった.さっそく試していく.

  • Server address
  • Server name
  • Date
  • URI
  • Request ID (TEXT Version なら)

github.com

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 などの情報が含まれている.

f:id:kakku22:20201219180717p:plain

次に 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.yamlreplicas に指定した通り「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-k56dtsandbox-nginx-hello-deployment-6f44bbdd58-zm92wsandbox-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 などの情報が含まれるため「振り分け確認」に使える.知っておくと便利なイメージだと思う!