CKAD受験の振り返り(2023/3)

# はじめに

認定Kubernetesアプリケーション開発者（CKAD-JP）に合格したので、振り返りをまとめました。

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/218755a5-c060-d3bf-a0e1-017f3f5d9d3a.png" alt="CKAD cerrification" width=400px>

※試験内容は公開禁止のため、問題に関する話はできません。予めご了承ください。

# スケジュール
## 試験勉強前のk8s経験
- 業務で扱っている
- DeploymentやServiceの概念はふわっとわかる
- [Kubernetes完全ガイド](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) を通読
    - リソースの役割の理解はまだあいまい

## 学習時間
- 約100時間 (1日40分くらい * 5か月)

記憶力が悪く一夜漬けがとにかく苦手なので、ちょっとずつ進めました。
点数には少し余裕があった[^score]ので、もう少し早く受けてもよかったかもしれません...

# 勉強したこと
~~n番煎じですが...~~

## UdemyのCKADコース

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

講義は、動画での座学と、Linux上でリソースを操作する演習を交互に行う形式です[^practice]。

CKADは全て実技試験（選択問題ではなく、`kubectl` 等で実際にリソースを作成する）のため、とにかくコマンドに慣れるのが大切です。
また、素早く解くためのテクニックとして、命令的なコマンドを多用するのも特徴です。~~業務でこんなことしたら怒られちゃう~~

- 例： pod作成
    - :x: マニフェストを書いて `kubectl apply -f hoge.yaml`
    - :o: `kubectl run hoge ...`

このコースだけでも、試験対策を十分に網羅できると思います。（最後に模試も2回分付いています）

## CKAD-exercises

https://github.com/dgkanatsios/CKAD-exercises

リソースの操作方法を集めた問題集です[^exercise]。
もう少し演習問題が欲しかったのでこちらも解きました。NetworkPolicy以外はローカルの [kind](https://kind.sigs.k8s.io/) で試せました。

## 時短テクニックの練習
多くの合格体験記に「時間が足りない」と書かれていたため、最後の1か月は↑2つの模試を繰り返してひたすら時間を短くする練習をしていました。
~~概念を理解しているだけでは合格できないのがまさに実技試験ですね... :sob:~~

### 環境設定

まずは環境設定です。おそらく2分くらいは節約できます。

```bash
# kubectl editのエディタ設定
# (デフォルトはvim。私はキーバインドを覚えていないので使えません...)
$ export KUBE_EDITOR=nano

# マニフェストのひな型を作るオプションのショートカット
$ export do="--dry-run=client -oyaml"
# これが
$ k run hoge --image nginx --dry-run=client -oyaml > hoge.yaml
# こうなる
$ k run hoge --image nginx $do > hoge.yaml
```

### kubectlのエイリアス
続いてはkubectlのタイピングを減らす練習です。私はタイピングが遅いので、リソース名とよく使うオプションのエイリアスをすべて覚えました。

```bash
# 遅い！
$ kubectl get service --namespace kube-system

# ok
# ※ `alias k=kubectl` がもともと登録されている
$ k get svc -n kube-system
```

エイリアスを強制的に覚えるツールも作ってみたので、良ければこちらもご覧ください（宣伝）

https://qiita.com/Syuparn/items/092fa8ae65d8ce2d3a28

### チートシート（合法）

`kubectl explain` でマニフェストの形式を参照可能です。kubernetes.ioのページを開くより速いので基本こちらを参照しました。

```bash
# --recursiveで子プロパティも表示
$ kubectl explain pods.spec.containers.readinessProbe.httpGet --recursive
KIND:     Pod
VERSION:  v1

RESOURCE: httpGet <Object>

DESCRIPTION:
     HTTPGet specifies the http request to perform.

     HTTPGetAction describes an action based on HTTP Get requests.

FIELDS:
   host <string>
   httpHeaders  <[]Object>
      name      <string>
      value     <string>
   path <string>
   port <string>
   scheme       <string>

# 前の章を読んでくださった貴方はこう入力するはず😄
$ k explain po.spec.containers.readinessProbe.httpGet --recursive
```

### 紛らわしいプロパティ名を覚える

チートシートも参照にかかる時間はゼロではないので、よく使うプロパティ名はなるべく覚えました。特に、volumeとenv周りは名前が紛らわしいので念入りに確認しました。

```yaml
# pod
spec:
  containers:
  - volumeMounts:
     - name: hoge
       mountPath: # pathではなくmountPath!
```

```yaml
# pod
spec:
  volumes:
  - name: cm
    configMap:
       name: mycm
  - name: mysecret
    secret:
       secretName: mysecret # nameではなくsecretName
  - name: pvc
     persistentVolumeClaim:
       claimName: mypvc # nameではなくclaimName
```

```yaml
# pod
spec:
  containers:
  - envFrom:
    - configMapRef: # refがつく
         name: mycm
    - secretRef:
         name: mysecret # refがつく
```

## 公式の模試を受ける

受験を申し込むと、2回模試を受けることができます（問題は同じ）。

- 時間: 本番と同じ2時間
- 難易度: 本番より難しい
- 復習: 答えと解説がついている
    - 36時間以内であれば試験環境内で解きなおしも可能

文章が長く、想像通り時間が足りなくなってしまいました。最後の1週間はここで間違えた範囲の復習に充てました。

# 直前の準備
自宅受験のため、前日~当日に部屋を片付けました。

- 条件
    - 壁にものを張ってはいけない
    - 机の上にものを置いてはいけない（電子機器、紙等）
    - 机の下にものを置いてはいけない（ゴミ箱、紙等）
    - 使えるスクリーンは1枚のみ
    - PCのカメラを有効にする（試験中に不正が無いかの確認に利用）


ワンルームなので冷蔵庫や空気清浄機が映ってしまうのが不安でしたが、特に問題ありませんでした。
（もちろんクレラップや輪ゴムは片づけておきました）

- 片づけた結果
  - サイドデスク：白いビニール袋で中が見えないように覆う
  - 本棚：布で覆う
  - 机や棚の上の物：すべて押し入れにしまう

# 当日

試験30分前から「`Take Exam`」を実行可能です。開始前に専用ブラウザのインストールや身分証明書の確認等があるため、早めの入室をおすすめします。
（確認が終わるまで試験は開始しないので焦る必要はありません）

身分証明書の撮影が終わると、不正がないかProctor(試験監督)の方からチェックを受けます。カメラで部屋や自分の様子を映し、チャットで会話します。
チェックが終わると試験開始します。試験中もチャットは使用可能です。

ちなみに、CKAD-JPを申し込みましたがやり取りはすべて英語でした。~~JPとは~~
私のタイピングが遅すぎて「メッセージ届いてますか？」と何度も聞かれてしまったので、身振り手振りで伝えたほうが良いかもしれません...

## やっておけばよかったこと

- ヘッドホンではなくPCから直接音を出す
  - ヘッドホン着用禁止のため
  - 専用ブラウザの登録画面には警告が書かれていなかった罠
- カメラの画角は顔と両手が映るようにする
  - 試験中に顔と手元の両方を確認されるため
  　- 両耳を見せる必要があるので体の正面に設置する
- スマホは手元に置いておく
  - チェックで「電源オフのスマホを見せてから遠くへ持っていく」という指示があるため
  - 試験だからと先んじてしまっておいたのが裏目に...

# おわりに

以上、CKAD受験記でした。実践に近い出題形式だったので、kubectl力を身に着けることができたと感じています。
~~後は、せっかく覚えたことを忘れないようにしたいです...~~

[^score]: 正答率82%でした (66%以上で合格)
[^practice]: 演習問題では[kodekloud](https://kodekloud.com/) を利用します。
[^exercise]: 試験と全く同じ形式ではなく、あくまでリソースの操作方法の問題集です (前述の通りCKADの問題は公開不可のため)