認定Kubernetes資格 CKAD勉強方法

Kubernetes実務経験ゼロでしたが、実務で使うようになり勉強を始めて約2ヶ月で取得しました。
今回は、CKADの試験概要や勉強方法、試験当日の流れについてまとめます。

## CKADの試験概要
認定Kubernetesアプリケーション開発者CKAD(Certified Kubernetes Application Developer)は、CNCFが運営しているKubernetesを使用する開発者向けの認定試験です。
CKADの問題はよくある選択肢形式ではなく、コマンドライン形式でリソースを作成したり、トラブルシュートしたりといった問題が出題されます。

```
受験形式：オンライン
問題数：15~20（1つの問題に複数のタスクが含まれている場合あり）
試験時間：2時間
合格ライン：66%
認証有効期間：3年
受験費用：$410（CKAD-JP）
リテイク：1回（1回目で不合格でも無料で1回再受験可能）
試験資格：1年（試験の支払い日から1年間の間であればいつでも受験可能）
```

試験環境のデモ動画も公開されていますのでご参考まで。
問題の配色がカラフルで、個人的には内容が頭に入りづらい印象を受けました・・・

https://www.youtube.com/watch?v=9UqkWcdy140

### CKAD-JP
CKADには`CKAD`と`CKAD-JP`がありますが、`CKAD-JP`の場合は当日の試験監督官とのチャットコミュニケーションを日本語でやりとりすることができるそうです。`CKAD`は英語です。
試験問題はどちらも日本語を選択できるそうです。
費用はCKAD-JPの方が少し高めです。
ちなみに私は`CKAD-JP`を選びましたが、申し込みの際の設定を誤ったのか？試験監督官とのやりとりは英語でした・・・

https://training.linuxfoundation.org/ja/certification/certified-kubernetes-application-developer-ckad-jp/

### 試験範囲
最新の試験範囲は、試験のサイトやCNCFが管理しているカリキュラムを参考にしてください。

https://github.com/cncf/curriculum

```
アプリケーションの設計と構築 - 20%
・　コンテナイメージを定義、構築、変更する
・　ジョブとCronJobsを理解する
・　マルチコンテナポッドのデザインパターンを理解する（サイドカー、initなど）
・　永続的で一時的なボリュームを利用する

アプリケーションの展開 - 20%
・　Kubernetesプリミティブを使用して、一般的なデプロイ戦略（青/緑またはカナリアなど）を実装します
・　展開とローリング更新の実行方法を理解する
・　Helmパッケージマネージャーを使用して、既存のパッケージをデプロイします

アプリケーションの可観測性とメンテナンス - 15%
・　APIの非推奨を理解する
・　プローブとヘルスチェックを実装する
・　提供されているツールを使用してKubernetesアプリケーションを監視する
・　コンテナログを利用する
・　Kubernetesでのデバッグ

アプリケーション環境、構成、およびセキュリティ - 25%
・　Kubernetes（CRD）を拡張するリソースを見つけて使用する
・　認証、承認、アドミッションコントロールを理解する
・　リソースの要件、制限、および割り当てを理解して定義する
・　ConfigMapを理解する
・　シークレットを作成して使用する
・　ServiceAccountsを理解する
・　SecurityContextsを理解する

サービスとネットワーキング - 20%
・　NetworkPoliciesの基本的な理解を示す
・　サービスを介したアプリケーションへのアクセスの提供とトラブルシューティング
・　Ingressルールを使用してアプリケーションを公開する
```

## 勉強方法
私の場合は、書籍で基本概念を学び、UdemyやGitHubで公開されているCKAD演習より実践形式で勉強しました。

### 書籍 ： Kubernetes完全ガイド 第2版

https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E7%AC%AC2%E7%89%88-Top-Gear-%E9%9D%92%E5%B1%B1/dp/4295009792

この書籍はKubernetesについて網羅的に学べるため、基本概念を理解する書籍として優秀だと思います。
特に、CKAD対策として重要な章をピックアップしました。
```
第1章  Dockerの復習と「Hello,Kubernetes」
第4章  APIリソースとkubectl
第5章  WorkloadsAPIsカテゴリ
第6章  ServiceAPIsカテゴリ
第7章  Config & StorageAPIsカテゴリ
第9章  リソース管理とオートスケーリング
第10章 ヘルスチェックとコンテナのライフサイクル
第13章 セキュリティ
第14章 マニフェストの汎用化を行うオープンソースソフトウェア（Helm）
```

### Udemy ： Kubernetes Certified Application Developer (CKAD) with Tests

https://www.udemy.com/course/certified-kubernetes-application-developer/

CKADに特化しているコースで、講義動画やハンズオンラボが用意されています。
Kubernetes完全ガイドで概念はある程度理解できたので講義動画は見ていません。
コマンドや試験形式に慣れるためにラボ(KodeKloud)のみ実施しました。

#### KodeKloud ： Labs – Certified Kubernetes Application Developer

https://kodekloud.com/courses/labs-certified-kubernetes-application-developer/

このラボは、KodeKloudというサービスにあるCKADに特化したラボです。
ラボにはKubernetesの各要素のハンズオン学習や模擬試験も含まれています。
ちなみに、UdemyのCKADコースにこのラボを利用できるクーポンが含まれており、無料で実施できました。

一通り実施したのち、模擬試験`Mock Exams`を繰り返し復習しました。
ちなみに、`Lightning Labs`は実際の試験より難しい印象を受けました。
さらに、2021年からのアップデート対策のため`Updates for Sep 2021 Changes`も繰り返し復習しました。

https://training.linuxfoundation.org/ja/ckad-program-change-2021/

### GitHub ： CKAD-exercises
https://github.com/dgkanatsios/CKAD-exercises

CKADの演習ができるリポジトリです。
こちらも、コマンドや試験形式に慣れるために有用だと思います。

## CKAD対策のポイント
CKADを受験する上でのポイントをまとめました。

### 試験中のドキュメント参照について
試験中は、公式ドキュメントなど認められたドメインのみ開くことができます。ただし、試験をしているタブの他に1つのみ開くことができます。
よく参照するものはブックマークしておくのもありです。それ以外で調べたいときは公式ドキュメントから随時検索で良いと思います。
ちなみに公式ドキュメントには、認められていない外部ドキュメントのURLが貼られていることがあるので、参照しないように注意が必要です。

```
https://kubernetes.io/docs/
https://kubernetes.io/blog/
https://github.com/kubernetes/
https://helm.sh/docs/
```

認められているサイトの詳細は下記を参照してください。

https://docs.linuxfoundation.org/tc-docs/certification/tips-cka-and-ckad#resources-allowed-during-exam

### できるだけコマンドを使う
リソースを最初からyamlで書いて作成することもできますが、あまり時間がないのでできるだけコマンドを駆使して作成します。
オプションで対応できない要素があれば、下記のように`--dry-run=client -o yaml`オプションをつけてyamlファイルにリダイレクトさせ、ファイルにオプションを追記してapplyします。
`kubectl run nginx --image=nginx --dry-run=client -o yaml > nginx.yaml`

コマンドの使い方がわからないときは、`-h`オプションでヘルプを見ることができます。
sampleも書いてあるので使い方は大体理解できると思います。

また、すでにデプロイされているリソースをyamlファイルに出力することも覚えておくと便利です。
`kubectl get pod nginx -o yaml > nginx.yaml`

NetworkPolicyやPersistentVolumeなど作成するコマンドがないリソースもあるので、ドキュメント参照でyamlからサクッと作れるようになっておくと良いかもしれません。
すでにリソースがデプロイされている＆ファイルがある状態で、そのファイルを参考に新しいリソースを作れというパターンもあります。

トラブルシュート系は`kubectl get`や`kubectl describe`、`kubectl logs`で原因を見つけて`kubectl edit`などで修正します。

その他、コマンドでどこまでできるのか知りたい場合は、下記を参照すると良いかもしれません。

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

## 試験当日の準備
試験予約後にLinux Foundationから送られてくるメールに注意事項などが書いてあるのでよく確認します。
特に下記ドキュメントに目を通しておくと良いと思います。

https://docs.linuxfoundation.org/tc-docs/certification/tips-cka-and-ckad

身分証明書
・英語表記の証明も必要なようで、自分は運転免許証とクレジットカードを用意しました。
受験場所
・比較的モノが少ない部屋
・机の上にはPC、ディスプレイ、マウス、キーボード、電源タップを置いていました。
Chromeの拡張機能の追加
・事前に指示があると思いますが、画面共有をするために下記拡張機能を追加する必要がありました。

https://chrome.google.com/webstore/detail/innovative-exams-screensh/dkbjhjljfaagngbdhomnlcheiiangfle

# 試験当日
予約時間の15分前から試験サイトにアクセスできます。
その後、試験監督官からチャットが送られてくるので指示に従います。

・カメラのONと画面共有の有効化
画面共有を有効にしようとした時、Chromeを再起動する必要がありますと表示が出て焦りました。
チャットで尋ねたところ再起動しても問題ないですよとのことで、問題なく再度試験サイトにアクセスして画面共有できました。

・身分証明書の提示
準備していた身分証明書をカメラに映します。

・身の回りのチェック
PCのインカメを使って周りを映します。コードが短かったので苦労しました・・・
キーボードの下もチェックしました。

・Chrome以外のアプリケーションを閉じる
Mac OSの場合ですが、`command+option+esc`を押してアプリケーションの強制終了メニューを開き、Chrome以外のアプリケーションを閉じます。

・2つ目の画面共有の有効化
最初の画面共有でディスプレイを指定していましたが、2つ目のPC側の画面も共有してくれと指示がありました。

ここまでの事前作業で45分ほどかかりました・・・
その後、試験自体はトラブルなく終えることができました。
最後の15分前くらいに試験監督官からあと何分ですとチャットで教えてくれます。

結果は試験後24時間以内にメールがきます。

## 試験を終えて
Kubernetesのリソースは、実際にはマニフェストでしっかりと定義してCICDで安全にデプロイするといった運用になると思います。さらに、リソースやログなどはLensやk9sなどのツールを使えば簡単に確認することができると思います。
しかし、今回CKADを通してKubernetesを基礎から学び、コマンドなどもしっかりと身につけることができたので、Kubernetesの本質を理解するという意味で受験して良かったと感じています。