Kubernetes the Hard Way on Azure : 13. スモークテスト
こんにちは。
Kubernetes the Hard Way on Azure を読み進めます。
前回までで一通りのKubernetesの構築が終わっているはずで、今回は簡単な動作確認の手順を追っていきます。
Smoke Test
このラボでは、構築してきた Kubernetes クラスタが正しく動作することを確認するスモークテストを実施し、このタスクシリーズを完結します。 (スモークテスト、という表現を初めて知った)
要するに、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
- NodePort
作ってきたクラスタが正しく動くことを確認できました。ひとまずよかった。
普段オンプレで Kubernetes 構築している方々は、どうやって「ちゃんと動く」ことを検証しているのかが気になるな。
いったん最後まで読み進めて、改めてまとめを書こうと思います。
残りわずかですが、14.に続きます。