Certified Kubernetes Application Developer (CKAD) 試験の学習方法

## 概要
2024年11月17日にCertified Kubernetes Application Developerの試験を受けて合格しましたが、具体的にどう勉強して良いかを共有したいと思います。ただ、試験内容を口外することはできないので、どんな勉強方法かを教えていければと思います。

## Certified Kubernetes Application Developer (CKAD) 試験とは
実際にKubernetesを動かして、設計や構築、設定、デプロイするスキルを証明する試験とのこと。
* 形式
    * 実技試験
* 試験時間
    * 2時間
* 問題数
    * 15~20問

最低限のLinuxコマンドやVimの操作は必要かなと。あと試験中はKubernetesとDockerとHelmの公式ドキュメントを読むことができます。

## 試験前後の気持ち
### 試験を受ける前まで感想
公式ドキュメントを見ながらテストを受けられて、たったの15問~20問、楽勝じゃん。

### 試験後の感想
公式ドキュメントを読みながら試験受けてたら時間が、、、なくなった:sob:

### 教訓
1問を6分で解くという換算とはいえ、ドキュメントを調べながらだと、1問10分〜15分くらいかかる。
問題の理解やエラーの対応などを行うと1問に20分かかることも、、、私自身の問題だけど。
ドキュメントを読まずに解答できるようになる方が良いです。

## 学習方法
CKADで使うkubectlコマンドを記憶します。
次にコマンドで対応できないところは、ドキュメントを読まずに定義書へ書けるよう記憶します。
ドキュメントが必要な場面もあるので、ドキュメントのどこに記載があるか記憶します。
ドキュメントを読むのは解答の確認するときだけという心意気です。

記憶するというか手癖にしてください。
問題を見たら条件反射で手が動く感じです。

## kubectlコマンド
### Pod
「moonという名前空間にnginxのイメージでポート80番を待ち受けるpod1という名前のPodを作ってください」と問われた時、すぐにkubeコマンドを打てますでしょうか？

```
k run pod1 --image=nginx --port=80 -n moon --dry-client -oyaml > p1.yaml

cat p1.yaml

k apply -f p1.yaml
```
これが一瞬で頭に浮かべば大丈夫です。

CKAD試験では、kubectlのエイリアスで「k」が設定されています。設定が正しいかの確認のためyamlファイルに定義を出力してから、applyした方が安心ですのでオススメです。
あと名前空間の指定`-n`を忘れずに。名前空間を指定する方が多かったので。

### Podの環境変数
次に「起動しているPodに環境変数`PORT=80`を設定する」と問われた時、どう対応するか？

起動しているので、定義ファイルを変更してreplaceするか、直接`k edit`で変更するかを確認します。
```
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    - name: PORT
      value: "80"
```
上記のように編集します。
インデントの位置に注意してください。`image`と同じ位置に`env`を設定します。
「ドキュメントを見れば」と思いますが、試験で使うブラウザからドキュメントを見るとインデントがズレているように見えるので、気をつけてください。
ですので、`env`の書き方も覚えておきましょう。ちなみに`value`は文字列です。

### Replicas
直接Replicasを作るkubectlコマンドはないので、ドキュメントを参考にしてください。でも、Replicasを作成するような問題ってあったかな？模擬試験でもなかったような、、、
ですので、構成だけ理解していれば良いです。

### Deployment
「sunという名前空間にdeploy-testというdeploymentを作ってください。イメージはnginxでポートは80、レプリカは4つでラベルでenv=devをdeploymentに追加してください。」と問われた時は、すぐにコマンドが思い浮かぶでしょうか？

```
k create deply deploy-test -n sun --image=nginx --port=80 --replicas=4 --dry=client -oyaml > deploy.yaml

vim deploy.yaml
```
```
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
    env: dev  // 追記
  name: nginx
  namespace: sun
```
```
k apply -f deploy.yaml
```
上記の流れで対応してください。`k create deply`にラベルを追加するオプションがないので、一旦、定義に落としてから追記する方法になります。

あとvimで編集しますが、補完の設定は特にしなくても良いです。
よく行数やタブの設定をした方が良いという記事があるのですが、そのままの設定でも問題ないです。設定に時間を使えるのであれば、大丈夫かなと。

### Service
「今、名前空間sunで起動中のdeploymentのdeploy-testを公開するservice-testというServiceを作ってください。ポートは80でタイプはNodePort、Nodeのポートは30001で。」をドキュメントを見ずにできますでしょうか？
```
k get deploy -n sun

k expose deploy deploy-test -n sun --port=80 --name=service-test --type=NodePort --dry-run=client -oyaml > service.yaml

vim service.yaml
```

```
apiVersion: v1
kind: Service
metadata:
  name: service-test
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30001 
```
```
k apply -f service.yaml
```
`nodePort`を付与するオプションは`k expose`にないのでvimで編集対応して、`ports`の配下に`modePort`を追記することを覚えておいてください。

### PersistentVolumeとPersistentVolumeClaim
「PersistentVolumeを作成し、PersistentVolumeClaimでボリュームをリクエストし、Podに設定してください」と言う問題を見たら、基本的にkubectlのコマンドは使わずに、公式ドキュメントに行きましょう。PersistentVolume関連は、kubectlのコマンドがなく定義書を記載しますので、下記リンク先を参考にします。

https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

上記リンク先は、下記の手順で構成されているので、多分間違えて構築することはないと思います。
1. PersistentVolumeの定義を作る
1. PersistentVolumeClaimの定義を作る
1. Podの定義を作る

PersistentVolume関連は、上記リンク先のページを知っていてテスト中にたどり着けるかどうかですので、ドキュメントを探して上記の手順で構築できるよう手に覚えさせましょう。

### ComfigMaps
「キーがkeyで、値がvalueのtest-configと言う名前のConfigMapsを作って、Podの環境変数に設定してください」と言う問題を見た時に下記のコマンドがすぐに頭に浮かぶでしょうか?

```
k create cm test-config --from-literal=key=value
```
次にPodにenv以下の設定を追記します。
```
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: nginx
    image: nginx   
    env: # env以下の記載の仕方を覚えておく
    - name: TEST_KEY
      valueFrom:
        configMapKeyRef:
          name: test-config
          key: key
```
公式ドキュメントでConfigMapsの記載内容は多くて、欲しい情報が探しにくいので、ConfigMaps作成コマンドからPodの環境変数の編集までの流れは覚えてください。内容は簡単ですが、公式ドキュメントを読みながら解こうとすると、期待する答えにたどり着くまで少し時間がかかります。
ですので、覚えた方が手っ取り早いです。

## 最後に
CKADの試験は時間との勝負ですので、ドキュメントを読みながらの解答では時間が確実になくなるので、コマンドで対応することをオススメします。
Kubernetesでの開発や運用は定義書ベースで進めると思いますので、コマンドを覚える必要性はあるのかなぁと考えていました。ただ、一刻を争う状況でのトラブルシューティングを想定しますと、コマンドを叩いての即時対応は必須で、コマンドを覚える意味があると言えます、、、多分。実務でKubernetesを使ったことがないので、本当に想定です。
いずれKubernetesを使った案件に参画することを想定して、CKAやCKSを取得していこうと思います。
もしご指摘等ありましたら、コメント等でお知らせいただけるとありがたいですので、よろしくお願いいたします:bow_tone1: