CKAD合格したので学習ロードマップを考えてみる

# はじめに
4月から3カ月Dockerを、7月から1カ月Kubernetesを勉強して、
本日[Certified Kubernetes Application Developer](https://training.linuxfoundation.org/certified-kubernetes-application-developer-ckad-jp/) に合格しました。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108008/5f061398-e063-6512-b5df-a93891f1ea5e.png)

試験内容については記載できないのですが、振り返ってみると**「勉強の順番とポイントを気にしていればもっと早く上達しただろうな」**と思うことがあり、今まで勉強した内容をロードマップとして整理してみます。
もしかしたら偏った勉強法かもしれませんが、これから勉強を始める方の参考になれば幸いです。

# 前提
- Linuxコマンドが実行できる環境を準備できる
- Linuxの基本的なコマンドが手に馴染んでいる
- Docker/Kubernetesは聞いたことあるけど触ったことがない
- DockerとKubernetesについてそれぞれ2～30時間程度の勉強時間

#ロードマップ
### Dockerについて理解しよう
まずはKubernetesのメインとなるコンテナ実行環境の理解から始めます。
コンテナ実行環境は実は種々あるのですが、現時点でメジャーなDockerが適当でしょう。
一番最初には、共有されている**スライド資料をサラッと眺めて**イメージをつかみましょう。
たとえば[@zembutsuさんが公開されているスライド](https://www.slideshare.net/zembutsu/introduction-to-docker-management-and-operations-2nd?qid=6f7a79f3-05f7-45d0-bbf8-8d5e814471a6&v=&b=&from_search=2)は非常によくまとまっていて、概念を理解するにはP1～79を眺めてもらうのが良いかと思います。

次のインプットとしては、**書籍を購入**して入門部分を重視して読んでみるのが良いかと思います。
入門大体の書籍がカバーしているので、好みのものを選んで大丈夫です。
私は[Docker 実践ガイド](https://book.impress.co.jp/books/1115101002)を購入しました。良い本でした。
Twiiterなどでは[Docker/Kubernetes 実践コンテナ開発入門](https://gihyo.jp/book/2018/978-4-297-10033-9)が評判だった印象があります。
Dockerの理解を最優先した場合、以下の読み方を採用することを検討してみて下さい。
 
- コマンド部分は後ほど写経するため、まずは**説明を中心に一周読み進める**
- Kunbernetes部分は後ほどまとめて学習するため、眺める程度にする

### Docker環境を準備しよう
手を動かす環境を準備しましょう。
私自身はWindows機なのですが、[KatacodaのDocker Playground](https://www.katacoda.com/courses/docker/playground)をお勧めします。
**環境構築で結構はまりがち**なためです。
賽の河原で小石を積むような体験をする可能性があります。
Macの方は[ドットインストール](https://dotinstall.com/lessons/basic_docker)などを参考に準備してみたらよいのかなと思います。

### dockerコマンドをてに馴染ませよう
Web上の様々な入門向けリソース、または購入した書籍に記載されているコマンドを実行してみて、何が起きるか確認してみましょう。
のちほどKubernetes環境で実行する`kubectl`とコマンドは違えど似ている部分が多いです。
エラーが発生した場合もメッセージから原因を調べたり、書き直したりして**エラーを解消する経験を積むことで手に馴染んでいきます**。

エラーが解消できなくて挫折しそう、、、という方は同じコマンドを検索してコピペし、自分のコマンドとの差分を確認しても勉強になると思っています。挫折するよりは百倍良いです。


### CKADについて理解しよう
Dockerの概念を理解して記法が手に馴染んだ時点で、Kubernetesに内容を移していきましょう。
Kubernetesについて深く理解した上で楽々資格取得が理想ではあるのですが、普段の業務に追われている方、直接業務で関わらない方はモチベーションの維持が大変なのが実情かと思います。
ここでは**資格取得を自信に**学習していくという思想で、CKADの学習すべき範囲を確認します。

出題範囲については[クリエーションライン社のページ](https://www.creationline.com/cka-ckad-exam)の説明がイメージしやいと思います。CKADの概要については以下のように記載されています。

- 基本コンセプト
- 設定
- マルチコンテナPod
- ログなどによる確認
- Podの設計
- Serviceとネットワーク
- 状態の永続性

一方でCKAの概要については以下のように記載されています。共通する部分もありますが、ノードの操作など差分もあります。

- アプリケーションのライフサイクルの管理
- インストール、設定および確認
- 基本コンセプト
- ネットワーク
- スケジューリング
- セキュリティ
- クラスタの管理
- ロギング/モニタリング
- ストレージ
- トラブルシューティング

今はなんのこっちゃ？と思うかもしれませんが、この**CKADのカリキュラムに関わる部分を重視**しながらリソースを探していった方が良いと思っています。
なぜならKubernetesが非常に多機能であり、便利なツールも数多くリリースされていることが魅力の一つで、それに伴い手に入るリソースの守備範囲も広いと感じたからです。私自身も寄り道しました。

### Kubernetesについて理解しよう
まずは共有されている**スライド資料をサラッと眺めて**イメージをつかみましょう。
[@daebum_leeさんが公開されているスライド](https://www.slideshare.net/daebumlee/kubernetes-introduction-92397497?qid=ab89b5ad-5a08-4236-8b9c-956107f98747&v=&b=&from_search=7)が図が多くてとっつきやすいかなと思います。

Kubernetesについては概念だけでなくしっかり理解した方が良いため、こちらも**書籍の購入**をお勧めします。
私自身は[Kubernetes完全ガイド](https://book.impress.co.jp/books/1118101055)を以下の条件で選び、実際に読んで条件にベストマッチだったので満足しています。

- 図が多く、新しい概念が連続してもとっつきやすい
- CKADに限らずKuberneteについて広く解説されていて、資格取得後も使える
- コマンドとマニュフェストの記述が多く、後述の演習に利用しやすい

覚えておいてほしい事項として、この時点では**マニュフェストの記法まで完全に覚えなくてよい**と考えています。理由は後述します。

### Kubernetes環境を準備しよう
Dockerと同様に[Katacoda](https://www.katacoda.com/courses/kubernetes/playground)でもコマンドは試せるのですが、Kubernetesについては真面目に環境を準備した方が良いです。
CKADはCKAより**時間の短い演習形式の試験**のため、コマンド入力にラグの少ない環境で学習するのが望ましいためです。

構築方法については色々と試行錯誤したのですが、以下のQiita記事を参考にしながらminikube環境を`--vm-driver=none `オプションを利用して起動するのが手間が少ないかなと思います。

- [CentOS7.5にminikubeをインストールする](https://qiita.com/okcoder/items/5381e5ad08ae5562c1dd)
- [Minikubeを使ってローカルにkubernetes環境を構築](https://qiita.com/Esfahan/items/f5c846088281c39f73a4)

Docker for Windowsを利用する方、または社内プロキシ環境配下の方はパブリッククラウドなどを利用してLinux環境を用意することをお勧めします。
構築がうまくいかなかった場合の切り分けが難しいためです。

### --dry-run でyamlファイルを作ってみよう
この記事で一番伝えたい箇所です。
環境も準備できたし、さあ書籍のコマンドを写経！というタイミングです。
マニュフェストを写しながら、こんな様々な記法を覚えなきゃならないのか、、、と**マニュフェストの写経で挫折しかける**かもしれません。そんな方はちょっとだけ待ってください。
[Kubernetes Tips: kubectl でマニフェストの雛形を作る](https://qiita.com/tkusumi/items/4f63cea4c4d910b368c4)を参考に、`--dry-run -o yaml`オプション付きで`kubectl run`コマンドをyamlファイルを確認し、作成された中身を確認してみて下さい。

```bash
$ kubectl run foo --restart=Never --image=nginx --dry-run -o yaml > foo.yaml
$ cat ./foo.yaml
```

上記の例では下記のようなファイルが生成されていると思います。
`kubectl run --help`でオプションを見ながら追加すると、もっと多くの項目を生成できます。

```yaml:foo.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: foo
  name: foo
spec:
  containers:
  - image: nginx
    name: foo
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}
```

怪しい裏技と感じるかもしれませんが、`--dry-run`自体は[kubernetes.io](https://kubernetes.io/docs/reference/kubectl/conventions/)でも紹介されいるテクニックです。
`--dry-run`で生成できない項目（volumeMountなど）を中心に後の演習を進めていくと、**自分で覚えて書く項目が絞れ**、学習コストの削減が期待できます。

### kubectlコマンドを手に馴染ませよう
先ほど読んだ書籍で出てきた`kubectl`コマンド実行したり、マニフェストファイルを作成して実行してみましょう。
minikube環境の方は一つの端末で`minikube tunnel`コマンドを実行しておくとLoadBalancerのExternalIPを利用できます。

```bash
$ minikube tunnel
Status:
        machine: minikube
        pid: XXXXXX
        route: <Kubernetes内部ネットワーク> -> <ノードのIPアドレス>
        minikube: Running
        services: []
    errors:
                minikube: no errors
                router: no errors
                loadbalancer emulator: no errors
```

実行時にエラーが発生する場合は内容を確認し、**エラー修正する動きに慣れる**方が試験でエラーが出た時も時間をロスせずに済みます。
エラーが解消できない場合、覚えきれないようなオプションや記法については[kubernetes.ioの公式ドキュメント](https://kubernetes.io/ja/docs/home/)内で検索し、サンプルで記載されているマニュフェストが役に立ちます。
本番でも参照できるドキュメントのため、慣れておくことをお勧めします。

ほとんどの受験記に書かれているように[CKAD-exercise](https://github.com/dgkanatsios/CKAD-exercises)は素晴らしい演習リソースで、**スラスラ解けるように**なるまで繰り返し説いておいた方が良いです。
試合に向けた素振りのようなもので、基礎力として役に立ちます。

他に演習ができそうなリソースについても紹介します。
私自身は1回目の受験で合格したのですが、もし不合格した場合は以下を利用して再受験ようと考えていました。

- [[Linuc Academy] Certified Kubernetes Application Developer (CKAD)](https://linuxacademy.com/course/certified-kubernetes-application-developer-ckad/)
- [[Cloud Academy] Preparation Exam: Certified Kubernetes Application Developer (CKAD)](https://cloudacademy.com/quiz/35346/?context_resource=lp&context_id=451)
- [[Udemy] Kubernetes Certified Application Developer (CKAD) with Tests](https://www.udemy.com/course/certified-kubernetes-application-developer/)


### 試験を申し込もう
ついに試験をスケジュールするタイミングです。
申し込み先は2つ選べるのですが、先ほど紹介した[クリエーションライン社のページ](https://www.creationline.com/cka-ckad-exam)を参照すれば違いが記載してあります。

試験日までの不安の対策として、受験記を読んで受験のイメトレをしても良いかと思います。
最初に試験を受けようと調べ出してから日が経っているので、新しい受験記が書かれていたりします。
自分が見落としていた試験のポイントや、ひょっとしたら新しいTipsが見つかるかもしれません。
実際に私自身は試験の直前で[この受験記](https://medium.com/@ameenalam202/tips-for-successful-certified-kubernetes-application-developer-ckad-exam-preparation-efaed88500fe)を見つけて、見落としている部分があり役に立ちました。

#最後に
私が特に伝えたいことを改めてまとめます。

- スライド→文章→演習の順で学習する
- マニュフェストファイルは見慣れるまで極力手で書かない。
- コマンドを手に馴染ませる。エラーの解消にも慣れる。

この記事を読んだ方、CKADにトライしてみましょう！！