CKAD合格ログ～事前学習/申し込み/試験～

# はじめに

## 本記事の内容

Certified Kubernetes Application Developerに合格しました（CKAD-1900-001515-0100）ので、
自身の事前学習/申し込み/受験の流れをまとめました。
これから受験される方のお役に立てば幸いです。

## CKADとは

https://training.linuxfoundation.org/certified-kubernetes-application-developer-ckad-jp/ より抜粋
> Certified Kubernetes Application Developer (CKAD) プログラムは、The Linux FoundationとCloud Native Computing Foundation（CNCF：Kubernetesのホスト プロジェクト）により、標準化されたトレーニングと認定を通してKubernetesエコシステムを拡充するために開発されました。

- 試験の仕組み
    - 試験の実施方法
        - オンライン
    - 試験の所要時間
        - 2時間
    - 認定の有効期間
        - 2年間
    - 受験料
        - $300
    - 受験料に含まれているもの
        - 12ヶ月間の試験受験資格
        - 無料の再受験
        - PDF形式の証明書
    - 経験レベル
        - 中級
- 参考リンク
  - [Candidate Handbook](https://www.cncf.io/certification/candidate-handbook)
  - [Curriculum Overview](https://cncf.io/certification/cka-cirriculum)
  - [Certification and Confidentiality Agreement](https://www.cncf.io/certification/agreement/)
  - [Exam Tips](https://www2.thelinuxfoundation.org/ckad-tips)
  - [Frequently Asked Questions](https://www.cncf.io/certification/cka/faq/)

# 事前学習
## 学習開始時点の状況
筆者のスキルレベルは下記の通りです

- v1.7くらいから趣味でちょこっと触っていた
- 本格的に触りはじめたのが今年入ってから

ある程度は触っていたので、本番にあわせて公式ドキュメントを読みつつkubectlを叩くことに集中しました。

## 学習環境
- Kubernetes
    - Minikube
        - 試験環境はv1.15だったので、それに合わせて構築
- エディタ
    - Vim
        - 試験中はVimで操作するため
        - `~/.vimrc`のカスタマイズも一旦消して初期状態のVimで練習

CKADではクラスタ自体を作成するような問題はでないためMinikubeでサクッと構築しました。
`minikube start`の`--kubernetes-version`オプションでK8sのバージョンを指定できますので、自分が受験するバージョンで構築すると良いです。

## 学習コンテンツ
### CKAD Curriculm
試験の出題範囲ですが、CNCFよりCKADのカリキュラムが公開されています。
https://github.com/cncf/curriculum

LinuxFoundationの研修やUdemyの研修もありますが、自分は上記カリキュラムから試験内容をイメージして勉強をしました。
試験に向けた勉強としては10時間程度です。

| 大項目                          | 小項目                                                       | 試験に向けてやったこと<br /><font color="DeepPink">赤：コマンド系</font><br /><font color="MediumSlateBlue">青：Resouceの設定項目系</font> |
| ------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| CoreConcepts<br /> (13%)        | Understand Kubernetes API primitives                         | （なし）                                                     |
| "                               | Create and configure basic Pods                              | ・Podを作る<br />　・<font color="DeepPink">kubectl run --restart=Never</font><br />・特定のPortを公開するPodを作る<br />　・<font color="DeepPink">kubectl run --port=8080 --restart=Never</font><br />・特定のコマンドを実行するPodを作る<br />　・<font color="DeepPink">kubectl run --restart=Never --command</font><br /> |
| Configuration<br /> (18%)       | Understand ConfigMaps                                        | ・ConfigMapを作る<br />　・<font color="DeepPink">kubectl create configmap --from-literal/--from-file</font><br />・Podから利用する<br />　・環境変数として利用する（<font color="MediumSlateBlue">env</font>）<br />　・ファイルとして利用する（<font color="MediumSlateBlue">volumes/volumeMounts</font>） |
| "                               | Understand SecurityContexts                                  | ・ユーザIDを固定する（<font color="MediumSlateBlue">securityContext</font>）<br />・SELinuxオプションを変更する<br />・<font color="MediumSlateBlue">capability</font>を変更する |
| "                               | Define an application's resource requirements                | ・コンテナごとにリソースを割り当てる（<font color="MediumSlateBlue">request/limit</font>）<br />・Namespace内のリソースを制限する（ResourceQuota/LimitRange） |
| "                               | Create & consume Secrets                                     | ・Secretを作る<br />　・<font color="DeepPink">kubectl create secret</font><br />・Podから利用する<br />　・環境変数として利用する（<font color="MediumSlateBlue">env</font>）<br />　・ファイルとして利用する（<font color="MediumSlateBlue">volumes/volumeMounts</font>） |
| "                               | Understand ServiceAccounts                                   | ・ServiceAccountを作る<br />　・<font color="DeepPink">kubectl create serviceaccount）</font><br />・PodにServiceAccountを設定する（<font color="MediumSlateBlue">serviceAccountName</font>） |
| Multi-ContainerPods<br /> (10%) | Understand Multi-Container Pod design patterns(e.g.ambassador,adapter,sidecar) | ・複数のコンテナを含むPodを作成する<br />・<font color="MediumSlateBlue">initContainer</font>で初期化処理を行う |
| Observability <br />(18%)       | Understand LivenessProbes and ReadinessProbes                 | ・コンテナに対してProbeを設定する（<font color="MediumSlateBlue">livenessProbe/readinessProbe</font>） |
| "                               | Understand container logging                                 | ・コンテナのログを見る<br />　・<font color="DeepPink">kubectl logs</font><br />・直前に稼動していたコンテナのログを見る<br />　・<font color="DeepPink">kubectl logs -p</font> |
| "                               | Understand how to monitor applications in Kubernetes         | ・イベントを見る<br />　・<font color="DeepPink">kubectl get event</font><br />・詳細を見る<br />　・<font color="DeepPink">kubectl describe </font><br />・出力形式を変更する<br />　・<font color="DeepPink">kubectl get  -o json</font><br /> |
| "                               | Understand debugging in Kubernetes                           | ・（同上）                                                   |
| PodDesign (20%)                 | Understand how to use Labels, Selectors, and Annotations     | ・ラベルをつける<br />　・<font color="DeepPink">kubectl label</font><br />・アノテーションをつける<br />　・<font color="DeepPink">kubectl annotate</font> |
| "                               | Understand Deployments and how to perform rollingupdates     | ・Deploymentを作る<br />　・<font color="DeepPink">kubectl run</font><br />・Deploymentを更新する<br />　・<font color="DeepPink">kubectl edit deployment</font><br />・更新状況を確認する<br />　・<font color="DeepPink">kubectl rollout status</font><br /> |
| "                               | Understand Deployments and how to perform rollback           | ・Deploymentを前回の状態に戻す<br />　・<font color="DeepPink">kubectl rollout undo</font><br />・Deploymentの履歴を確認する<br />　・<font color="DeepPink">kubectl rollout history</font> |
| "                               | Understand Jobs and CronJobs                                 | ・Jobを作る<br />　・<font color="DeepPink">kubectl run --restart=OnFailure</font><br />・CronJobを作る<br />　・<font color="DeepPink">kubectl run --schedule</font> |
| StatePersistence (8%)           | Understand PersistentVolumeClaims for storage                | ・PersistentVolumeを作る<br />・StorageClassを作る<br />・PersistentVolumeClaimsを作る<br />・PodからPVCを利用する<br />・StatefulSetからPVを利用する |
| Services&Networking (13%)       | Understand Services                                          | ・Serviceを作る<br />　・<font color="MediumSlateBlue">ClusterIP</font><br />　・<font color="MediumSlateBlue">NodePort</font><br />　・<font color="MediumSlateBlue">LoadBalancer</font><br />・labelを付け替えてBlue/Greenをやってみる |
| "                               | Demonstrate basic understanding of NetworkPolicies           | ・NetworkPolicyを作る                                        |

### ＜参考＞研修等
研修などもいくつかあります。お財布＆時間と相談して受けてみるのも良いかと。

[Certified Kubernetes Application Developer (CKAD-JP)](https://www.cncf.io/certification/training/)（個別だと\$300。試験とセットだと\$199）
[Kubernetes Certified Application Developer (CKAD) with Tests](https://www.udemy.com/course/certified-kubernetes-application-developer/)（24,000円だけど定期的に90%近くオフに）
[dgkanatsios/CKAD-exercises](https://github.com/dgkanatsios/CKAD-exercises)（無料）

# 申し込み
## 試験の申し込み
公式サイトから申し込みます。特に要望がなければCKAD-JPで。試験官とのやりとりが（多分）日本語になります。
https://training.linuxfoundation.org/certified-kubernetes-application-developer-ckad-jp/

時間帯について、自分が申し込んだ際は平日08:00～16:00の間でいくつか枠が用意されていました。
休日には枠がなかったようにみえましたが、もともとないのか埋まっていたのかは不明です。

## 試験会場の準備
貸し会議室を借りたり会社の会議室をおさえておきましょう。カフェのようなオープンな場はNG。
試験は2時間ですが、事前準備等あるので前後30分くらい余裕をもっておさえておくと良いです。

## 端末の準備
- Chromeブラウザ
  - 受験用のExtensionを事前にインストール
  - Kubernetesのサイトをブックマークしておくと◎
- Webカメラ
  - 自分はUSBで接続するカメラを利用しましたが、ノートPCのカメラでも可能です。

# 試験
## 試験直前の準備
- ブラウザの確認
    - 試験官の指示に従って確認作業を行います。会話の必要はなく、チャットでのやりとりとなります
        - CKAD-JPで申し込んだためか、日本語でのやりとりでした。
- 受験者の確認
    - 国が発行する写真つきの証明書が必要となります。
        - 自分はパスポートを利用しました。
- 周囲の確認
    - 机の周りや下などをチェックされます
        - このとき外付けカメラだと取り回しやすいです。

## 試験
時間は結構短いです。自分は下記を意識しつつ&使いつつ進めました。

- `kubectl --dry-run -o yaml`などでベースを作る
  - 時間を節約するために。残りはvimで手直し
- `kubectl -h`でオプションを確認
  - ちょっとしたオプションであれば、公式サイトを検索するより早い
- はじめに`source <(kubectl completion bash)`を叩いて補間を使えるようにしておく
  - Pod名などの補間が効くので便利
- ctl+c/ctl+v（コピペ）はブラウザ上では使えないのでマウスでコピペ
  - Ins+特定のキーでコピペ可能なようですが、変な操作をしてしまいそうだったのでマウスに

tmuxが使えるといったことをどこかで見た気がしたのですが、自分は必要ありませんでしたので利用できるか確認していません。必要に応じて利用しましょう。ブラウザ上で起動するNotepadも利用できます。
あとはvimになれておくと◎。

# 結果＆おわりに
試験終了から36時間以内に結果が届くとのことで、自分の場合は32時間後くらいに届きました。
結果はスコア89%で合格でした。（66%が合格ライン）
手も足も出ない問題はなかったのですが、単純にYAMLの記述ミスで時間がかかってしまったところはありました。
ほぼ手ごたえ通りのスコアかなと思います。

基本的なところから実践的な問題までいろいろあって楽しかったです。
（「K8sのあのコンセプトをこの問題で説明させたいんだな」的な）

1回は無料で再受験できるので、受けてみるのをオススメします。
次はCKAをがんばりたい。