Kubernetes the Hard Way on Azure : 13. スモークテスト

こんにちは。
Kubernetes the Hard Way on Azure を読み進めます。

前回までで一通りのKubernetesの構築が終わっているはずで、今回は簡単な動作確認の手順を追っていきます。

Smoke Test

このラボでは、構築してきた Kubernetes クラスタが正しく動作することを確認するスモークテストを実施し、このタスクシリーズを完結します。 (スモークテスト、という表現を初めて知った)

f:id:dombri:20200216212841j:plain
要するに、Kubernetesたる状態になっているかを簡単に確かめていきます。ドキドキ。

Data Encryption

このセクションでは、rest でデータの暗号化ができることを確かめます。

汎用的な Secret を作成します。

kubectl create secret generic kubernetes-the-hard-way \
  --from-literal="mykey=mydata"

etcd に保存されている Secret [kubernetes-the-hard-way] の16進ダンプを表示します。

CONTROLLER="controller-0"
PUBLIC_IP_ADDRESS=$(az network public-ip show -g kubernetes \
  -n ${CONTROLLER}-pip --query "ipAddress" -otsv)

ssh kuberoot@${PUBLIC_IP_ADDRESS} \
  "ETCDCTL_API=3 etcdctl get /registry/secrets/default/kubernetes-the-hard-way | hexdump -C"
  
# 出力内容
00000000  2f 72 65 67 69 73 74 72  79 2f 73 65 63 72 65 74  |/registry/secret|
00000010  73 2f 64 65 66 61 75 6c  74 2f 6b 75 62 65 72 6e  |s/default/kubern|
00000020  65 74 65 73 2d 74 68 65  2d 68 61 72 64 2d 77 61  |etes-the-hard-wa|
00000030  79 0a 6b 38 73 3a 65 6e  63 3a 61 65 73 63 62 63  |y.k8s:enc:aescbc|
00000040  3a 76 31 3a 6b 65 79 31  3a 7a d6 96 9c d8 08 b4  |:v1:key1:z......|
00000050  19 01 3b 4b bb c0 e8 60  35 e4 ad 59 b9 f9 37 71  |..;K...`5..Y..7q|
00000060  30 e8 37 79 5f 6f f7 f7  29 3e cb 72 f5 1e 4a f2  |0.7y_o..)>.r..J.|
00000070  d8 00 44 cc 21 93 98 aa  c2 52 3b c0 99 e5 35 2a  |..D.!....R;...5*|
00000080  88 0d c1 6f 13 55 9f 01  49 23 c0 a1 c7 d2 33 56  |...o.U..I#....3V|
00000090  6c df f1 0d 6a 22 60 3b  51 8b 8c b4 50 90 52 17  |l...j"`;Q...P.R.|
000000a0  3c 26 78 7f 7a c1 a1 40  96 e0 18 d9 00 fe cd 86  |<&x.z..@........|
000000b0  30 b2 76 6c 4e b6 47 19  81 79 d8 22 ff a8 0d b3  |0.vlN.G..y."....|
000000c0  d3 3c 66 2a 8a 59 52 83  b5 c4 c7 25 ea e2 6a cf  |.<f*.YR....%..j.|
000000d0  9c a4 f5 4b 5e 7e 87 0c  c2 bb f1 15 ea 62 c3 9d  |...K^~.......b..|
000000e0  6d ac 6d 71 fb 66 04 73  43 0a                    |m.mq.f.sC.|
000000ea

etcd キーの prefix として [k8s:enc:aescbc:v1:key1] を付ける必要があります。[aescbc] プロバイダーが key1暗号化キーでデータを暗号化するために使用されたことを示します。


Deployments

このセクションでは、Deployment を作成し、運用する機能を確かめます。

nginx Web サーバ用の Deployment を作成します。

kubectl run --generator=run-pod/v1 nginx --image=nginx

nginx Deployment によって作成された Pod をリスト表示します。

kubectl get pods -l run=nginx

# 表示内容
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          73s


Port Forwarding

このセクションでは、ポートフォワーディングを使用してクラスタ外からアプリケーションにアクセスできることを確認します。

nginx Pod の完全修飾名を取得します。

POD_NAME=$(kubectl get pods -l run=nginx -o jsonpath="{.items[0].metadata.name}")

ローカルの8080ポートをNginx Pod の80ポートにフォワードします。

kubectl port-forward $POD_NAME 8080:80

別の新しいターミナルを開き、フォワーディングアドレスを用いてHTTPリクエストを行います。

curl --head http://127.0.0.1:8080

# 出力内容
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Sun, 16 Feb 2020 07:32:22 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Jan 2020 13:36:08 GMT
Connection: keep-alive
ETag: "5e26fe48-264"
Accept-Ranges: bytes

元のターミナルに戻り、nginx Pod へのポートフォワードを止めます。(ctrl + C).


Logs

このセクションでは、コンテナログを収集できることを確認します。

nginx Pod のログを表示します。

kubectl logs $POD_NAME

# 表示内容
127.0.0.1 - - [16/Feb/2020:07:32:22 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.64.1" "-"


Exec

このセクションでは、コンテナ内でコマンドが実行できることを確認します。

nginx コンテナ内で nginx -v コマンドを実行し、Nginx のバージョンを表示します。

kubectl exec -ti $POD_NAME -- nginx -v

# 出力内容
nginx version: nginx/1.17.8


Services

このセクションでは、Service を利用したアプリケーションの公開機能を検証します。

nginx Deployment を NodePort Service を用いて公開します。

kubectl expose pod nginx --port 80 --type NodePort

このクラスタは cloud provider integration で設定されていないため、LoadBalancer Service は使用されません。

nginx Service に割り当てられた NodePort を取得します。

NODE_PORT=$(kubectl get svc nginx \
  --output=jsonpath='{range .spec.ports[0]}{.nodePort}')

Nginx NodePort へのリモートアクセスを許可するファイアウォールルール(NSG) を作成します。

az network nsg rule create -g kubernetes \
  -n kubernetes-allow-nginx \
  --access allow \
  --destination-address-prefix '*' \
  --destination-port-range ${NODE_PORT} \
  --direction inbound \
  --nsg-name kubernetes-nsg \
  --protocol tcp \
  --source-address-prefix '*' \
  --source-port-range '*' \
  --priority 1002

ワーカーインスタンスの外部IPを取得します。

EXTERNAL_IP=$(az network public-ip show -g kubernetes \
  -n worker-0-pip --query "ipAddress" -otsv)

外部IPと nginx NodePort から HTTP リクエストを実行します。

curl -I http://$EXTERNAL_IP:$NODE_PORT

# 出力内容
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Sun, 16 Feb 2020 07:59:47 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Jan 2020 13:36:08 GMT
Connection: keep-alive
ETag: "5e26fe48-264"
Accept-Ranges: bytes


まとめ

  • スモークテスト
    • 暗号化
    • Deployment
      • Port Forwarding
      • Log
      • コンテナでのコマンド実行
    • Service
      • NodePort

作ってきたクラスタが正しく動くことを確認できました。ひとまずよかった。
普段オンプレで Kubernetes 構築している方々は、どうやって「ちゃんと動く」ことを検証しているのかが気になるな。

いったん最後まで読み進めて、改めてまとめを書こうと思います。

残りわずかですが、14.に続きます。