udemy Certified Kubernetes Administrator (CKA) with Practice Tests の癖あり問題
はじめに
あけましておめでとうございます。
今年もよろしくお願いいたします。
先日、なんとかCKAに合格することができました。
1年間CKA合格のために勉強をしてきましたが、その時主に利用してきた教材が、
udemyの「Certified Kubernetes Administrator (CKA) with Practice Tests」という講義です。
こちらはCKAを受けるに当たってとても良い教材なので(practiceで手を動かして覚えることができる、MockExamの内容が実試験に即していて良い)
受験予定の方にはオススメしたいのですが、中には練習問題や模擬試験の回答通りにコマンドを実行しても正解の判定がもらえない問題があります。
今回はそのような問題について、正解判定をもらうことができた回答を書いていきたいと思います。
癖あり問題-MOCK EXAM02-Q7
【問題内容】
nginxのpodとそのpodに結びついたserviceを作成し、名前解決用のpodを作成して名前解決結果をファイルに書き込みなさい。
問題内容は少し要約してます。
こちら、前半のpod,service作成の部分はSolutionの動画を見ることで問題なく作成することができますが、
名前解決部分に割と癖があり、Solutionのやり方をそのままやってもpodが動かなかったりします。
【Solutionの回答】
#podの作成(--generatorオプションは現verでは必要なくなっている為省いています) controlplane $ kubectl run nginx-resolver --image=nginx pod/nginx-resolver created #確認 controlplane $ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-resolver 1/1 Running 0 14s #service expose controlplane $ kubectl expose pod nginx-resolver --name=nginx-resolver-service --port=80 --target-port=80 --type=ClusterIP service/nginx-resolver-service exposed #確認 controlplane $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11m nginx-resolver-service ClusterIP 10.103.204.143 <none> 80/TCP 8s #名前解決確認用pod作成/コマンド入力 controlplane $ kubectl run test-nslookup --image=busybox:1.28 --rm -it -- nslookup nginx-resolver-service
名前解決確認用pod作成/コマンド入力のコマンドをそのまま入力するとプロンプトが返ってこず、
ctrl+Cで強制的に中断することになります。
kubectl get pod でステータスを確認すると、以下のように遷移していることがわかります。
また、logsでpodのログを確認するとnslookupの回答は返ってきている為、名前解決コマンドには問題なさそうです。
controlplane $ kc get pod NAME READY STATUS RESTARTS AGE nginx-resolver 1/1 Running 0 4m57s test-nslookup 0/1 ContainerCreating 0 11s controlplane $ kc get pod NAME READY STATUS RESTARTS AGE nginx-resolver 1/1 Running 0 5m1s test-nslookup 0/1 Completed 1 15s controlplane $ kc get pod NAME READY STATUS RESTARTS AGE nginx-resolver 1/1 Running 0 5m6s test-nslookup 0/1 CrashLoopBackOff 1 20s controlplane $ kc logs test-nslookup Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: nginx-resolver-service Address 1: 10.107.253.197 nginx-resolver-service.default.svc.cluster.local
名前解決確認用pod作成/コマンド入力に「--restart=Never」というオプションを付与して実行すると、正しく名前解決結果が標準出力に出力されます。
【回答】
controlplane $ kc run test-nslookup --image=busybox:1.28 --rm -it --restart=Never -- nslookup nginx-resolver-service Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: nginx-resolver-service Address 1: 10.107.253.197 nginx-resolver-service.default.svc.cluster.local pod "test-nslookup" deleted controlplane $
Solutionの回答通りのコマンドの場合、restart policyというPodの再起動の挙動を決めるパラメータがデフォルトのAlwaysになってしまい、
podがコマンドの成功失敗に限らず再起動を繰り返す為、--rmオプション(コマンド実行後podを削除する)との親和性が取れず上記のような挙動になってしまったのではないかと考えられます。
(practiceやMock Examで利用するkatakodaの仮装環境のバージョンは逐次最新に更新されているようなのですが、解答動画はあまり更新されていないようなので
解答動画の環境と実際の作業環境が噛み合っていないようです。以前のバージョンの環境では解答動画の通りでも出来たのかもしれないですね。)
kubectl runのオプションについてはこちらを参照(公式)
kubernetes.io
kubectl runについて日本語で説明してくれている記事はこちら
qiita.com
ちなみに、podの方のコマンドもそのまま実行するとプロンプトが返ってこなくなります。
以下で実行すると標準出力が正常に行われます。
controlplane $ kc get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-resolver 1/1 Running 0 70m 10.244.1.3 node01 <none> <none> controlplane $ kc run test-nslookup --image=busybox:1.28 --rm -it --restart=Never -- nslookup 10-244-1-3.default.pod Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: 10-244-1-3.default.pod Address 1: 10.244.1.3 10-244-1-3.nginx-resolver-service.default.svc.cluster.local pod "test-nslookup" deleted controlplane $
おまけ
MOCK EXAM02-Q8でnode01にstatic podを作成せよという問題がでますが、
node01でkubectlを実行しようとすると以下のようなエラーが出ます。
node01 $ kubectl get pod The connection to the server localhost:8080 was refused - did you specify the right host or port?
kubeconfigの仕組みをちゃんと理解していれば全然引っかからないところなのですが、
1回目の試験前に勉強した時は「なんでkubectl実行できないの!?」ってなっていたので一応恥を忍んで書いておきます。(笑)
これはkubeconfigがnode01に配置されていない為出てしまうエラーです。
以下のコマンドでcontrolplaneと同じkubeconfigファイルをnode01に配置しましょう。
controlplane $ scp .kube/config node01:/root/ Warning: Permanently added 'node01,172.17.0.25' (ECDSA) to the list of known hosts. config 100% 5567 5.9MB/s 00:00 controlplane $ controlplane $ ssh node01 root@node01:~# root@node01:~# kubectl get node The connection to the server localhost:8080 was refused - did you specify the right host or port? root@node01:~# mkdir .kube root@node01:~# mv config .kube/ root@node01:~# root@node01:~# kubectl get node NAME STATUS ROLES AGE VERSION controlplane Ready master 11m v1.19.0 node01 Ready <none> 11m v1.19.0 root@node01:~#
ちゃんとnode01にstatic podが作成されているかはcontrolplaneでも確認できるのですが、
戻って確認するのもめんどくさい、という方はこちらでnode01でも確認できるようにされてみては。
おしまい