CKAD(認定Kubernetesアプリケーション開発者)に合格したので、対策をまとめた

# CKAD対策

## これは何
- KubernetesDeveloperの公式資格であるCKADに挑戦し、合格したので、自分の行った対策を時系列順にまとめた


## 試験までの流れ
### 体験談で試験の傾向を調査する
- CKADの合格体験記や試験対策をざっくり読み、試験のイメージを掴む。
    - [How to beat Kubernetes CKAD certification](https://medium.com/@nassim.kebbani/how-to-beat-kubernetes-ckad-certification-c84bff8d61b1)
        - 合格に必要なことは殆どこの記事に書いてある。必読。
    - [CKADをさっさと合格するためのTips](https://qiita.com/kentakozuka/items/c1a30f1545752264dfe6)
    - [CKA/CKADに合格したので比較してみた + Tips](https://qiita.com/oke-py/items/e8bf3863c8f48d750427)
    - [CKAD合格ログ～事前学習/申し込み/試験～](https://qiita.com/gashirar/items/e66ad5a15124febce661)
    - [Linux経験ゼロからCKAD（Certified Kubernetes Application Developer）に合格するまで](https://qiita.com/suke_masa/items/e48d7fe544fdedd64659)
    - [ckad-prep-notes](https://github.com/twajr/ckad-prep-notes)

### 教科書を読む
- [Kubernetes完全ガイド](https://www.amazon.co.jp/Kubernetes完全ガイド-impress-top-gear-青山/dp/4295004804/ref=sr_1_1)を一通り読む
    - 章ごとの読み方
        - 1~4章をサラッと読み、Kubernetesの世界観を掴む
            - ここでピンとこなくても、5章以降で手を動かす過程で理解できることもある
        - 5~7章(Workload, Service, ConfigMap)が試験のキモ。自分でもyamlを書いてガンガンapplyしてみる
        - 8~13章(ヘルスチェック、オートスケール、スケジューリング、セキュリティ)も、概念は理解しておく。yamlは書かなかった
        - 14~20章は直接試験と関連しないが、純粋にk8sユーザーとして知っておいたほうが良い
    - 時間がなくて全て熟読はできない場合、[試験範囲](https://qiita.com/gashirar/items/e66ad5a15124febce661#%E5%AD%A6%E7%BF%92%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84)を参考にじっくり読むところの軽重を判断
- [Kubernetes チートシート](https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/)を読んで、kubectlのサブコマンドに何があるか確認
    - k8s完全ガイドではkubectlコマンドの細かい紹介があまりないので、こちらで補完する

### 試験の傾向を調査する
- 最初に読んだ合格体験記をもう一度読み直す
    - 試験の傾向と対策を頭に叩き込む
- 公式の試験ガイドを読む
    - 重要なことはほとんど体験記に書いてあるので、細かい情報漏れがないか確認する
        - [試験Tips](https://www2.thelinuxfoundation.org/ckad-tips)
        - [FAQ](https://www.cncf.io/certification/cka/faq/)
        - [カリキュラム](https://github.com/cncf/curriculum)

### 模擬試験を解く
- [このリポジトリ](https://github.com/dgkanatsios/CKAD-exercises)を2~3週やれば受かると言われている
    - が、たぶんそれは実務経験が一定ある人の話で、自分は2週しただけだと落ちた。この模試には長文問題がないので、実務経験ない人は後述のLinux Academyも解くのが吉
- ある程度慣れてきたら、分からない問題が有っても、できるだけ試験中と同様自力で解決できるように下記のリソースだけで答えられるようにしていく
    - 何のコマンドを打てばいいかすら分からないときは[公式Doc](https://kubernetes.io/docs/home/)を検索
    - コマンドは見当がつくが使い方がわからないときは、`kubectl <SUBCOMMAND> -h`
    - マニフェストの書き方がわからないときは`kubectl explain`

### Linux Academyの問題を解く
- 1度落ちてしまったので、満を持するために[Linux Academyのコース](https://linuxacademy.com/course/certified-kubernetes-application-developer-ckad/)の問題を2周説いた
    - 1月＄50だが、1wだけ無料。試験直前に集中的に解くのもあり。
        - 自分は＄50払った。もし2回目も落ちると再度＄300かかるので、保険と思えば安いもの
    - githubの模擬試験には長文問題が一切ないが、このコースでそれを補うことができる。最強の試験対策
- 講義動画（英語）もあるが、これは見なかった。余裕があれば復習も兼ねて見て良いかもしれない

### シェル環境の設定を覚えておく
- 本番ではブラウザから試験が用意したシェル環境を使うので、試験を素早く済ませるための設定が最初に必要。覚えておいて再現できるようにしておく。
    - aliasの設定
        - `alias k="kubectl"`,`alias ka="k apply -f"`...等、主要サブコマンドを延々と設定した
    - エディタの設定
        - 試験前にクリップボードに記憶させることも考えたが、試験中は画面共有されておりカンニングと間違われる可能性もあるので、李下に冠を正さず。

## 試験の感想と反省
- 上に挙げた体験記とかぶる部分は割愛。

### 1回目
#### 結果
- 66%必要なところを59%で不合格。

#### 試験環境
- 試験開始時は試験官とチャットで英語でやりとりする。割と親切だった
- ブラウザが落ちると、その間試験時間を止めたりしてくれた
- 試験環境のシェルを使うので、aliasの設定や、エディタのタブの設定を覚えておく必要がある
    - nanoのタブ設定の方法が分からずスペース地獄で死んだ。。。
        - nanoを使ったのは、.vimrcがでかすぎて試験環境で再現できないため

#### 試験問題
- 半分くらいの問題は模試と同じ要領で瞬殺できるが、残り半分はかなり歯ごたえがある
- 言われている通り、時間は本当に足りない。捨てた問題が3問くらいあった。
    - 問題の重要度（＝配点？）が表示されているので、高い問題から優先的に手を付けたほうが良い。長大な問題の重要度が非常に小さいということがよくある
- 「リソースで問題が起きているので解決しろ」という形式の、模試には見られない問題が3問程度出た
    - この手の調査から入る問題に備えるためには、リソースの異常ステータスの意味と、トラブルシューティングの典型例は抑えておかないと、当たりがつけられない
- シェルスクリプトのwhile文の仕様やcron記法等、LINUXの知識の部分で手が止まることもあるので、模試に出てくるLINUXコマンドくらいはある程度練習しておいた方が良さそう
- 解法が分からなくてもキーワードで公式Docをググると答えに近い例が載っていたりするので、諦めてはいけない

### 2回目
#### 結果
- 66%必要なところを75%で合格

#### 1回目との差分
- 事前にLinux Academyで長文問題対策したので、2問以外はすべて自信を持って回答できた
    - 「これLinux Academyでやったやつだ！」というノリで、面白いように問題が解けた
- 問題を解くときは必ず重要度と難易度を確かめ、優先度の低い問題は飛ばして後回しにした
    - 試験環境にNotepad機能があるので、問題をとばすときはここに問題番号、重要度、難易度をメモしておく
    - 重要度は表示されている、難易度は問題をざっと眺めたときに「ウッ」となるかで判断
    - 次の順番で解くのが効率的
        1. 重要度5%以上かつ標準的
        1. 重要度5%未満かつ標準的
        1. 重要度5%以上かつ難しい
        1. 重要度5%未満かつ難しい
    - 難しい問題に手間取って時間ロスするのが一番やってはいけないことなので、まず解ける問題を潰す。
- Podで起きる様々なエラーの種類をインプットしておいたので、デバッグ系の問題もスムーズに解けた
- 85%いったかとおもったが、意外にいかなかった。namespace間違いとかあったかもしれない。みなさんもお気をつけて

## 全体通しての感想
- 試験問題を通してKubernetesの基本的な使い方を手に馴染ませることができるという点で、この試験は非常に有用だった
    - 初期は「Podって何？」という状態だった。。。
- 1度落ちてしまったが、そのおかげでPodエラーの種類やVPのタイプ等、より深い知識を習得することができた。2回チャンスがあるのは本当にありがたい
- この試験はあくまで基本的な技能を問うもので、ボリュームの動的プロビジョニングのような実践的な知識の多くがカバーされていないので、そこはこれからも勉強していく必要がある
    - 試験範囲以外のk8s完全ガイドの内容殆ど忘れてしまった気がするので読み返さねば。。。