Fugu Log

げきょゎエンジニアの技術修行ブログ

udemy Certified Kubernetes Administrator (CKA) with Practice Tests の癖あり問題

はじめに

あけましておめでとうございます。
今年もよろしくお願いいたします。

先日、なんとかCKAに合格することができました。
1年間CKA合格のために勉強をしてきましたが、その時主に利用してきた教材が、
udemyの「Certified Kubernetes Administrator (CKA) with Practice Tests」という講義です。

www.udemy.com

こちらは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でも確認できるようにされてみては。



おしまい