【Kubernetes】Certified Kubernetes Application Developer (CKAD) 合格体験記

2022/11/8に[Certified Kubernetes Application Developer (CKAD)](https://training.linuxfoundation.org/ja/certification/certified-kubernetes-application-developer-ckad/)に合格しました！
これからCKADの合格を目指す方へのアドバイスと、合格までの流れを感想とともにまとめます。

# まえおき

## CKAD合格を目指した理由

CKAD合格を目指した理由は2つです。

- 初学者として、Kubernetesの何を勉強すればいいのか判断する材料として有用
- Kubernetesを勉強した成果を客観的に表すのに便利

## バックグラウンド

受験時点での私のバックグラウンドを簡単に紹介します。

大学を卒業して2020年4月、IT企業にシステムエンジニアとして入社しました。2022年11月時点で3年目です。
1年目の3ヶ月間は新人研修、2年目の4ヶ月間は新人研修の指導員だったので、実務経験はちょうど2年です。

CKADに関係する技術要素の経験は以下です。
※経験年数は業務で意識して使用した期間の目安です。

|技術要素|経験年数|内容|
|:-:|:-:|:-:|
|Kubernetes|0年|コンテナ管理ツールのデファクトスタンダードと言われていて、日本でももっと流行りそうという認識。業務経験はない。CKADの内容に沿って勉強した。|
|Docker|2年|Dockerfile, docker-compose.ymlがスラスラ書ける。公式のコンテナイメージを基に作成したいコンテナを設計できる。|
|Linux全般|2年|2年と言っているが、1.5年はコンテナを使用する都合で浅く経験していたのみなので簡単なコマンドしか知らなかった。受験の半年前からUbuntuサーバ(物理)でのシステム開発を経験したため、そこで基本的な知識を身につけた。|
|ネットワーク|1年|いつもはDockerに任せっきりなので、あまり意識していない。AWSでVPC・サブネット・NATゲートウェイ・アプリケーションロードバランサーくらいなら使用経験がある。いずれも細かいところは勝手に上手くやってくれるものなので、浅くしか知識がない。|

# アドバイス

CKADの合格を目指している方に向けて、私の経験をもとに僭越ながらアドバイスをしたいと思います。

### CKADが難しいと感じるのは普通である

ネット上のCKAD合格体験記などを読んでいると、「そんなに難しくない」「1-3ヶ月程度勉強すれば合格できる」と書いてある記事をよく見かけました。
でも、それらの意見よりはるかに難しく感じる方もいると思います。実際、私にとっては難しかったです。私だと多分3ヶ月程度では受からないです。

それでも心配はいりません。きっと以下の理由があります。

#### バックグラウンド(経験)が違う

未経験や趣味で勉強したことがあるのと、業務経験があるのでは全然違います。業務だと1日で8時間ですから、感覚よりもだいぶ経験値を得ている可能性があります。

また、コンテナやLinuxの基礎知識があるのかどうかも大きいと思います。私の場合、コンテナには慣れていましたが、Linuxの簡単なコマンドでも最初はつまずきました。

#### できることは難易度を低く見積もりがち

誰しもできること・一度でもできたことは難易度を低く見積もりがちです。
今の私ですら、CKAD合格後はそんなに難しくなかった気がしていますが、客観的に過去の勉強時間等を振り返ると、明らかに苦労した痕跡があります。

#### ネット上で情報発信している人たちは"強い人"が多い

個人的な感覚ですが、検索で上位に表示されるような人気ブログを書いているってだけで"強い人"の可能性大です。
決して自分が弱いわけじゃないです。比べる相手が悪かっただけです。

### ドキュメントは読み込んだほうが良い

CKADは試験中に[各種ドキュメントの参照が可能](https://docs.linuxfoundation.org/tc-docs/certification/certification-resources-allowed#certified-kubernetes-administrator-cka-and-certified-kubernetes-application-developer-ckad)です。特に[Kubernetes 公式ドキュメント](https://kubernetes.io/docs/home/)は一番参照すると思います。
主要なリソースはどのページでなんの単語を検索すれば目的の情報にたどり着けるのかを覚えておくと有利です。

### Candidate Handbookは前日までに確認する

[Candidate Handbook](https://docs.linuxfoundation.org/tc-docs/certification/lf-handbook2)は試験のルールや流れ等が詳しく説明されています。
例えば、試験で使用するPSIセキュアブラウザの使用方法の動画解説などもあります。試験中に困らないように前日までに確認しておきましょう。

### `kubectl explain`を使えると楽できる

マニュフェストファイルを書くとき、どの階層に何を設定すればいいのか分からないことがあります。
場合によってはドキュメントでも見つからないです。そんな時は`kubectl explain`を使用しましょう。
`kubectl explain po.spec --recursive | grep "image"`のように検索すればすぐに見つかるかもしれません。

### `kubectl api-resources`で利用可能なAPIリソースを確認できる

`kubectl api-resources`で、**NAME:リソース名**, **SHORTNAMES:短縮名**, **APIVERSION:APIグループ**, **NAMESPACED:名前空間に属するか**, **KIND:リソースの種類**が確認できます。
kubectlコマンドで指定する名前を忘れてしまったときや、マニュフェストファイルのkindやapiVersionが分からない時に役立ちます。

### メカニカルマウスが使用できるかも

私は[ERGO M575 ワイヤレス トラックボール](https://www.logicool.co.jp/ja-jp/campaigns/trackball-trial.html)を使っていて、拡張ボタンを有効活用するために[Logicool Options](https://www.logicool.co.jp/ja-jp/software/options.html)というソフトウェアを起動していました。
試験時に停止しなければならない可能性も考慮していましたが、特に問題なく使用できました。

普通のマウスも用意して使えない場合に備えつつ、メカニカルマウスを持ち込むのはいいかもしれません。

# 合格までの流れ

勉強開始→合格まで10ヶ月でした。
もちろんずっと勉強していたわけではなく、数週間学習していない期間が何回かあります。

「試験を受けるまで」「試験当日」「試験後」に分けて状況を振り返ってみます。

## 試験を受けるまで

2021年12月まではDockerを中心にコンテナ技術全般を学んでいました。
1年半でコンテナ技術の基礎が固まったことをきっかけに、2022年1月から本格的にKubernetesを勉強し始めました。

試験を受けるまでの状況を時系列で簡単に書き出してみます。

### ~2021年12月

|勉強時間 (週)|0.1時間|
|---|---|
|**勉強頻度 (週)**|**0.5~1日**|

[Kubernetesのドキュメント](https://kubernetes.io/ja/docs/home/#%E5%9F%BA%E6%9C%AC%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B)の基本部分やコンセプトが説明されている部分を読みながら、概要を確認した。

Pod≒コンテナ、Deployment≒Docker Composeくらいの理解度。つまりあまり分かってない。

### 2022年1月~2022年4月

|勉強時間 (週)|0.5時間|
|---|---|
|**勉強頻度 (週)**|**0.5~1日**|

2022年1月9日にUdemyの[Kubernetes Certified Application Developer (CKAD) with Tests](https://www.udemy.com/course/certified-kubernetes-application-developer/)を購入した。
1~2週間に1時間程度のゆっくりペースで学習した。

ドキュメントや説明を聞いて短期的には理解できる。
いざ問題を解こうとすると分からなくなることがほとんど。

### 2022年5月~2022年8月

|勉強時間 (週)|3~4時間|
|---|---|
|**勉強頻度 (週)**|**3日**|

大体隔日で勉強。7月以降は練習問題で`kubectl`コマンドを書きまくることで手になじませた。
Linuxコマンド等のCKADに対する共通知識を身につけた。

とにかく質より量が大事な時期と考えて、勉強時間を長く、頻度を多くすることを意識していた。
いわゆる「完全に理解した」状態を越えて、着実に知識が定着していった期間でもある。
Pod、Deployment、Serviceくらいは基本的に理解している。
Ingressみたいな少し出現頻度が低いリソースは、理解しているつもりだが実際に使おうとすると迷ってしまう。

### 2022年9月~2022年10月

|勉強時間 (週)|2~3時間|
|---|---|
|**勉強頻度 (週)**|**2日**|


自分の苦手なところを復習していた。練習問題を繰り返し解いた。

Kubernetesへの自分の理解度が見えてきた時期でもあった。自分が何が分かっているのか、何が分かっていないのかが分かったことによって、苦手な部分をピンポイントで勉強できた。
2~3日おきに勉強することで、「忘れかけたころに思い出す」を繰り返すことで長期記憶への定着を図った。具体的には、一部の練習問題を無意識に覚える程度。
理解を深めることも意識したが、知識を頭の引き出しから出すまでのスピードをつけることを優先した。
9月後半以降はドキュメントを見なくても`kubectl`コマンドがスラスラ書ける。
一部のマニフェストファイル(YAML)でしか指定できない設定も、ドキュメント検索ですぐに見つけられる。

## 試験当日 (2022/11/8)

会社の会議室で受験だったので、身分証明書のパスポートを持って家を出ました。
10:30 AM JSTで試験を予約していたので、前後に余裕を持って会議室は9:30~13:00で押さえていました。

試験中の状況を表にしてみました。
※完答率は後から振り返ったときの**予想値**です。完答した問題の配点の合計値を表していて、**完答率≠正答率**です。


|時間|状況|完答率(%)|
|:-:|:-:|:-:|
|9:30|5分ほどで部屋の中を確認する。念のため設置されていたモニターを壁向きにする。|-|
|10:00|試験日時の30分前。専用のページから試験の準備が開始できる。試験用セキュアブラウザをダウンロードし、チャットで説明を受けながら身分確認やWebカメラ越しの部屋チェックをする。|-|
|10:30|準備に30分かかったので、定刻で試験開始。セキュアブラウザの使い方を理解するのに6,7分使ってしまい焦る。|0|
|11:00|思うように問題が解けず、「このままでは落ちる」という恐怖が襲ってくる。セキュアブラウザ内で使用できるFirefoxの検索機能が使えないことに気付く。画面サイズも小さく端のナビゲーションが見切れていて、ドキュメントが読みづらくて萎える。|20|
|11:30|なんだかんだ1時間で約5割の問題が解けていること、セキュアブラウザの操作に慣れてきたことで平静を取り戻す。|48|
|11:45|スキップした問題以外が解き終わる。配点が理由でスキップした問題のうち、すぐに解けそうな問題から解き始める。|64|
|12:10|配点が低い問題を全て確認し、すぐに分かった問題だけ解いた。完答できない問題が残り3問。|80|
|12:30|残り20秒くらいのタイミングで滑り込みで1問解いた。2問を残して試験終了。|84|

## 試験後

とりあえず、お昼ごはんを食べました。

解けなかった問題があったのが心残りだったので、少し調べて復習しましたが、疲れてて全然頭に入ってきませんでした。

諦めて働きました。

### 受験結果

正答率81%で合格しました。(CKADは正答率66%以上で合格です。)

今回は配点が全て4で割り切れる数だったので、正答率が4の倍数でないということは部分点があります。
完答できなかった2問のうち1問(配点8%)は一部解答しました。また、完答率は84%です。
つまり、部分解答を含む解答率は85~87%であり、そこからミスで4~6%減点されたようです。

私にとって、部分点があるのは嬉しい誤算でした。

# おわりに

IT業界に入って間もなくコンテナの虜になり、「いつかKubernetesを使えるようになりたい！」とずっと思っていました。
CKADはあくまでも、Kubernetesを使えるようになるための最初の道しるべだと考えているので、きっとまだまだ勉強が必要だと考えています。
それでも、最初の一歩を踏み出せたことは嬉しく思います。