CKADをさっさと合格するためのTips

# tldr
CKADのテクニックを紹介します

# はじめに
この前CKADを受けてみました。
kubernetesは今年から使い初め、試験があることもなにも知らなかったのですが、社内の勉強会で存在を知り、なんとなく受けてみました。
結果２回目で~~なんとか~~受かりました。
試験を受けてみてkubernetesの理解と同時にCKAD特有のちょっとしたテクニックも必要かなと感じたので、本記事でそれらをまとめていきます。


<img width="796" alt="Screen Shot 2018-12-09 at 16.57.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/141539/f8b7515e-2eb5-a7bb-5285-3cc1c5037351.png">


# CKADとは
CNCFが運営しているkubernetesを使用する開発者向けの認定試験です。
CKADはCertified Kubernetes Application Developerの略です。
試験内容は

>13% – Core Concepts
18% - Configuration
10% - Multi-Container Pods
18% – Observability
20% – Pod Design
13% – Services & Networking
8% – State Persistence

な感じでカテゴリ分けされて配点が割り振られており、「規定のパーセント」以上を取ることができれば、合格になります。「規定のパーセント」は（たぶん）毎回異なりますが、大体60-７０点ぐらいです。私が受けた２回はどちらも６６％でした。

# 難易度
そんなに難しくありません。kubernetesのユーザーとして普段kubectlを叩いている開発者なら少しの学習で合格できます。
ちなみに私は4月までは「kubernetes、なにそれ、どっかの島の名前？」という感じで、そこから開発で使いはじめ、`kubectl apply`と`kubectl get`をまあまあ使っている程度でした。

# 勉強方法
ここからが本題です。
ここからは大分個人的な意見なので、そのつもりで呼んでください。

## どうやって勉強したか
とりあえず模擬試験をやってみて、わからなかったら回答を見て、その中で知識が足りなかったらドキュメントとかその他資料にあたるという、至ってシンプルな方法です。
模擬試験は以下を参考にしました。
https://github.com/dgkanatsios/CKAD-exercises
ここに書いてある問題を２週して、一回目の試験に挑み、62％で見事に落ちました。
さらに２週して75%で合格しました。


## 試験で使ったテクニック
### やらなかったこと
- screenとかtmuxとかは使わなかった
  使った方が便利だとは思いますが、キーバインドを変えて使っているtmuxのデフォルト設定を覚え直して。。。みたいなことはしませんでした。テスト中余計なつまづきを減らしたかったという思いもあります。

- 用意されたメモはほとんど使わなかった
  ターミナルでほとんど完結するので、よくわからなかった問題にあとから戻るために問題番号をメモった程度でした。

### kubectlのTips
以下のページを大いに参考にさせていただきました。学習を始める前に呼んだのですが本当に助かりました。
https://github.com/twajr/ckad-prep-notes

#### 各リソースを作成する
テスト中はささっとdeploymentやpodなどをささっと作成する必要があります。ドキュメントを見ていると結構時間を使ってしまいます。
以下のコマンドで各リソースのyamlファイルを作成したり、ただしい書き方かどうかをチェックすることができます。

基本形

``` sh
# 標準出力
kubectl run nginx --image=nginx --restart=Never --dry-run -o yaml
# ファイルに出力
kubectl run nginx --image=nginx --restart=Never --dry-run -o yaml > mypod.yaml
```

#### RUNコマンドでPod, Deployment, job, cronJobの作成

これがとてもテストで役に立ちました。
`run`コマンドのフラグを追加したりするだけでPod, Deployment, job, cronJobの作成を自由自在にできます。
下記の表に書いた通り、覚え方もとても簡単です。
~~自信を持って臨んだ１回目の試験でcronJobの作成が出題されたのですが、`--schedule`のそれぞれの時間が何を指しいてるのかがわからず落としてしまいました。笑~~

| リソース |`kubectl run <name>` | `--image=<name>` | `--restart`フラグ | `--schedule`フラグ |
|---|---|---|---|---|
| deplyoment | kubectl run <name> | --image=<name> |                     |                        |
| pod        | kubectl run <name> | --image=<name> | --restart=Never     |                        |
| job        | kubectl run <name> | --image=<name> | --restart=OnFailure |                        |
| cronJob    | kubectl run <name> | --image=<name> | --restart=OnFailure | --schedule="* * * * *" |


#### secretの作成
上記のリソースと同じですが、Secretを作成するときに役に立ちます。

``` sh
kubectl create secret generic my-secret --from-literal=foo=bar -o yaml --dry-run > my-secret.yaml
```

#### 実行中のリソースを編集する

テスト中は結構時間がかつかつになります。
例えば、「実行に失敗しているポッドがあるから直せ」という問題があった場合、
yamlファイルを落としてきて、誤った部分を書き直して、`kubectl apply -f`を叩く
といったことはせずに下記コマンドで直接設定を直した方が早いです。

``` sh 
kubectl edit
```

#### 追加したい設定がspec階層構造のどこに位置しているのかがわからない。

これはテスト中というよりも勉強中の方が多かったのですが、大量の設定項目がspec下に階層的に配置されており、yamlを作成するときに「どこに何を書けばいいんだっけ？」という自体に陥りやすかったです。
そういったときは以下のコマンドで内容を確認することができます。
また、勉強中に「へー、こんなspecがあったのか」と新しい発見ができます。

``` sh
kubectl explain po.spec
# recursively
kubectl explain po.spec --recursive
```

# 最後に
少しでもこれを読んでくださった方々のお役にたてれば嬉しい限りです！