この記事はなむゆの個人ブログにもマルチポストしています
はじめに
Kubernetes を普段業務で使っている方で、業務で培った技術力の証明のために CKA(Certified Kubernetes Administrator)や CKAD(Certified Kubernetes Application Developer)といった資格を受験したいと考える方っていると思います。
実際普段から Kubernetes を触っている人がこれらの受験しようとすることは試験に合格しようとする上では Docker やコンテナ等の前提知識が備わっている点や試験内容である実際にコマンドラインで問題を解くという点において大きなアドバンテージになります。
しかし、一方で試験の形式や問題を受ける場面は普段の Kubernetes を用いた運用や開発を行う場面と大きく異なっている点もあります。
例えて言うならば、普段業務で Kubernetes を使うことはそれなりに力を使うので仕事をしているだけで筋肉が鍛え上げられていくのですが、試験では仕事で使うのとは違う筋肉を使うこともあるようなイメージです。
なので、試験を受ける場合はそちらで使うことになる筋肉も鍛えておかなければならないのですね。
今回は、Kubernetes 系資格の中でも特に CKAD において普段から Kubernetes を業務で使っている人向けに受験に向けた学習のコツのようなものを共有できればと思います。
できる限りコマンドでリソースを作成、操作する
普段 Kubernetes を用いて業務を行っているとき、アプリケーションを展開するときにはまずマニフェストファイルを作成してそれを kubectl apply -f <ファイル名>
のようなコマンドで展開しているかと思います。
アプリケーションの kubernetes へのデプロイはできる限り宣言的な方法でコードで記述した方が分かりやすく、管理もしやすいためです。
一方で、この CKAD という試験は、試験の内容でも書いたとおり、この試験の制限時間は 2 時間でその間に 15~20 問の問題を解かなければなりません。そのため、1 問にかけられる時間は 6~8 分になります。
そんな中で、ある程度複数の概念が組み合わさったようなリソースを展開しなければならなくなった場合、いくら公式ドキュメントが参照できると言っても、マニフェストを作成して適用する方法だと以下のような手順を踏むことになります。
- Pod リソースを kubernetes ドキュメントで検索する
- Pod リソースのマニフェストのサンプルを vi にコピペしてくる
- サンプルマニフェストの余計な部分を削除し、Pod 名、イメージ名等を書き換える
- 個別の概念(livenessProbe とか env とか)について調べてマニフェストのサンプルを探す
- それぞれの概念のマニフェストのサンプルを vi にコピペしてくる
- 適用
この方法だとさすがに、1 問を解くのに時間がかかりすぎてしまいます。
なので、できる限り kubectl コマンドでリソースを作る方法を覚えるべきです。
例えば、イメージだけを指定した簡単な pod を作成したい場合は以下のようなコマンドだけで一発で Pod を作成できます。
kubectl run <podの名前> --image=<image名>
このコマンドを覚えて使うことは、マニフェストファイルの内容を丸覚えしていたとしてもそれを vi で記述してkubectl apply
したり、あるいは忘れていた場合は kubernetes の公式ドキュメントで Pod リソースのページを開いてマニフェストのサンプルをコピペして余計な部分を消してリソース名とイメージ名を修正してそれからkubectl apply
したり・・・なんてするよりはずっと早いです。
このようなリソースの展開方法をドキュメントではImperative Commandsと呼んでいます。
これを習得しましょう。
一応この方法にもデメリットがあり、それはこのコマンドの引数だけでは設定できない部分もあることです。
例えば kubectl run コマンドだけでは作成する Pod に対する livenessProbe や ReadinessProbe の設定ができません。
他にも、ConfigMap リソースから env を引っ張ってくる等の設定もkubectl run
コマンドだけでは行えません。
これらはマニフェストファイルにパラメータを設定することでしか設定することができません。
では Imperative Command は実際の試験で使えないのかというとそんなこともないです。
例えば、先程のそこそこ複雑な要件の Pod を作成する例で例えると、Imperative Command を使うと以下ただ、な手順になります。
kubectl run <pod名> --image=<image名> <その他色々、オプションで設定できる限りの設定を行う> --out-put=client -o=yaml > <ローカルに作成するファイル名>
のコマンドを実行する- 個別の概念(livenessProbe とか env とか)について調べてマニフェストのサンプルを探す
- それぞれの概念のマニフェストのサンプルを vi にコピペしてくる
- 適用
1 番のコマンドについては追加で説明するべき点が 3 つあります。
一つは、--out-put=client
のオプションの部分で、これによってコマンドの実行を実際には行わず、コマンドを実行した場合どのような結果になるかだけを取得します。
二つ目は、-o=yaml
の部分です。これは、コマンドの実行結果を yaml 形式で出力するものです。pod を作成するコマンドにこのオプションを実行すると、yaml 形式で表現された Pod の情報が出力されます
この出力をコピペしてマニフェストを生成すると、適用するとコマンドで生成するのと同じリソースが作成できます。
三つめは、リダイレクト>
です。ご存知の方はご存知かと思うのですが、これで出力結果をそのままファイルに出力できます。
これらを行うことで、マニフェストを 1 から作る際の手順の 1~3 を省略することができ、時間も大きく節約できます。
戦術としては、Imperative Commands で設定できる限りの設定をオプションで行い、それで設定しきれない部分についてはマニフェストに吐き出して個別に調べて設定、適用するというような形になります。
Imperative Command で設定できる項目については、kubectl コマンドのリファレンスに載っているので、試験に備えてブックマークしておくのであればここはマークしておくべきかと思います。
CKAD は制限時間がタイトな都合上、Imperative Commands を使いこなせるようになることがほぼほぼ必須なところがあります。
ぜひ覚えましょう。
普段あまり使っていない分野の学習に集中する
普段 Kubernetes を触っている人が CKAD のような試験の学習をすることは、それらを全く触っていない状態から学習を始めることよりははるかに初期の知識において優位にあるかと思います。
学習の方法としては様々な他の人が書いているようにCKAD-excerciseや udemy コンテンツのKubernetes Certified Application Developer (CKAD) with Testsあたりが有名どころですが、これらのコンテンツの全体を同じ濃度でやるよりは、自分の弱点になっている分野を重点的に学習した方が有利です。(当たり前といえば当たり前)
普段触っていても忘れていたり知らなかったりする部分を学ぶために一周は全体を流しても、二週目は普段触っていなかったり各種サンプル問題を解いてみて分かりづらかった部分を重点的に学習するのが効果的です。
自分の場合は Security Context や Volume 周り、NetworkPolicy 周りが弱かったのでその周りを集中して学習しました。
また、2021 年の試験の更新で試験範囲に helm も加わったため、そこも重点的に学習しています。
コマンドラインでのファイル編集には慣れておく
普段業務でマニフェストを触る時、コマンドラインで扱える vi 以外で編集を行っている人も多いと思います。
ただ、CKA/CKAD 本番では試験を受けるためのブラウザのタブとドキュメント確認用のタブを一つ開くことだけを許されているので、マニフェストファイルなどのファイル編集になれておく必要があります。
自分の場合 vi を使うことにしたのですが、普段そこまで vi 操作になれていなかったので自分用のショートカット集的なものを作って学習中はちょくちょく読み直していました。
自作のよく使うショートカットは以下の 4 つでした。
's,'ed
vi中でms,meコマンドを打ってマーク付けした間の行を削除(マークは目立つ形では表示されない)
's,'ey
vi中でms,meコマンドを打ってマーク付けした間の行をコピー(マークは目立つ形では表示されない)
pキーでペースト
u
アンドゥ
dd
1行削除
おわりに
ちなみにここまで対策を書いておいてなのですが、実は試験はまだ受けていません。来週あたりを予定しています。
こういった記事は合格してから書けよという話ですが、最近この辺りの話を周りの人とする機会ができたためそれに合わせて先に書いています。
ここまで書いておいてもし受験して落ちたりしたら、その時は笑ってやってください。