アプリ系エンジニアが CKA & CKAD を受験してみた

# はじめに
私はアプリ系エンジニアですが、Kubenrnetesを仕事で使って行くために CKA と CKAD の両方の資格受験してみました。
Kubenrnetesは、インフラ系エンジニアもアプリケーション系エンジニアも必要な技術で、使いこなすにはインフラもアプリも両方のスキルが必要になってくると思います。そこで、自分のスキルアップのためにもCKAとCKADの両方の資格を持っておこうと考えました。

私は最初にCKA、次にCKADの順番で受験しました。本当は連続で取得しようと思ったのですが、業務多忙でCKAとCKADの受験日が２ヶ月ぐらいの間隔があいてしまいました。


# CKA と CKADの両方を受験した感想

## CKA、CKAD 試験概要
| 項目 | CKA  |  CKAD |
| --- | ---  | --- |
| 試験時間 | 3時間 | 2時間 |
| 設問数 | 24 | 19 |
| 1問あたり（分） | 7.5 | 6.3 |
| 合格ライン | 74% | 66% |

## CKA（Certified Kubernetes Administrator）
システム管理者向けの資格で、クラスター構築から運用、クラスターのトラブルシューティングなど幅広く出題されます。
トラブルシューティングは状況分析と問題解決のパターンを理解しておかないと、結構厳しいものがあると思います。アプリ系エンジニアの場合は、特に設定や調査のためのコマンドを覚えておきましょう。
また、AWS EKS、GCP GKSなどのマネージドサービスでは、構築や運用の作業をする必要がありませんが、CKAでは素のKubernetesを触っておく必要があります。

## CKAD（Certified Kubernetes Application Developer）
アプリケーション開発者向けの資格で、アプリリリースに必要なリソースを作る問題が中心に出題されます。
CKADのみで出題されるリソースがありますが、そこさえ追加対応しておくことで、CKAの合格者であればそんなに苦ではないかなと思いました。

先に受験された人の体験記で時間が足らなくなるという話を聞いていたので、受験時に時間配分には気をつけました。時間がかかりそうな問題やわからない問題は後回しにして、わかる問題だけを選んで先に回答するようにしました。
そうすれば、後半で焦ることなく、自分のペースで回答できます。


## 受験の流れ
- 受験した場所
試験会場でなく、条件を満たす場所であればどこでもOKとのことだったので、私は自宅で受験しました。
なるべく物が少ない部屋を選び、事前に室内の物を別の部屋に片付けるくらいで、特に問題なく受験ができました。

- Webコンソール画面の操作感
Webのコンソール画面で受験するとのことで、レスポンスや操作感が気になりしたが、レスポンスも素早く、操作感も問題ありませんでした。
問題文に作成対象の名称をコピーするボタンがあるので、とても便利ですよ。（先に受けたCKAの受験時にはなかったので改善されたんだと思います。）

- 受験結果の連絡
３６時間以内に通知が来ます。２回とも３０時間ぐらい後にメールが来ました。
日本時間の真夜中でもメールは来ます。

# CKA、CKADの試験勉強でなにをやったか？
### 書籍で理解する
- Kubernetes完全ガイド  
出題されるほとんどリソースを網羅されています。ひと通り読み試して覚えましょう。

### Webサイトの情報で理解する
- Kubernetes公式サイトのDocumentation
https://kubernetes.io/docs/home/
受験中に唯一検索してよいサイトです。どこに何が書いてあるのかを把握しておきましょう。

- Kubernetes Hard Way 
https://github.com/kelseyhightower/kubernetes-the-hard-way
GCP上にすべて手動でkubernetes環境を構築するチュートリアルです。参考までにやってみました。

- Installing kubeadm
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Kubeadmを利用したセットアップ方法のチュートリアルも試しておきました。

### より早く回答するテクニックを身につける
試験中は時間も限られているため、より早くコマンドを実行し、素早くリソースを作成する必要があります。そのために試験対策用のテクニックを身に着けておくことをおすすめします。

- kubectlコマンドをエイリアスで短縮化、コード補完を設定

```bash:kubectlのエイリアス、コード補完設定
alias k=kubectl
complete -F __start_kubectl k
```

- コマンドでリソースを作成

本来の運用であればyamlを書いてリソースを作成すべきですが、短時間でリソースを作成できるように、極力コマンドで作成するようにします。
ただし、コマンドによって作成できるリソースの種類が異なっていたり、コマンドで設定できるパラメーターに制限がある為、どうやって作成するかを事前に把握しておく必要があります。
またコマンド上で指定できないパラメーターは、コマンドオプションで--dey-run -o yamlを指定し、まずファイルに出力します。その後、出力したファイルをvimで編集して実行します。

（1） kubectl runで作成
以下のようなイメージです。

```yaml:Pod
kubectl run (pod-name) --restart=Never --image=(image-name) --dry-run -o yaml
```

```yaml:Deployment
kubectl run (deployment-name) --image=(image-name) --replicas=3
```

```yaml:Job
kubectl run (pod-name) --restart=OnFailure --image=(image-name)
```

```yaml:CronJob
kubectl run (cronjob-name) --restart=OnFailure --schedule="*/1 * * * *" --image=(image-name)
```

（２） kubectl Createで作成
以下のようなイメージです。

```yaml:ConfigMap
kubectl create configmap (configmap-name) --from-literal=key=value
```

```yaml:Secret
kubectl create secret generic (secret-name) --from-literal=key=value
```

（3） kubectl exposeで作成
以下のようなイメージです。

```yaml:Service_ClusterIP
k expose deployment (deployment-name) --name=(service-name) --type=ClusterIP --port=80
```

```yaml:Service_NodePort
kubectl expose deployment deployment-name --name=service-name --type=NodePort --port=80
```

（4） Kubernetes公式サイトのDocumentationのからyamlソースをコピーして作成  


### 模擬テストで練習する
私の場合は試験に慣れるために、Udemyの模擬テスト付きKubernetesコースを購入し、ひらすら模擬テストを繰り返し練習しました。
模擬テストで、時間内で素早くリソースを作成したり、トラブルシューティングの問題に慣れることが出来ます。

- Udemy 「Certified Kubernetes Administrator (CKA) with Practice Tests」
https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/

- Udemy 「Kubernetes Certified Application Developer (CKAD) with Tests」
https://www.udemy.com/course/certified-kubernetes-application-developer/

- CKAD-exercises
https://github.com/dgkanatsios/CKAD-exercises
CKAD向けですが、CKA向けでも使えます


# 合格してみての感想
資格取得を取得しても実際に使えるわけではありませんし、資格取得のためのテクニックも身につける必要もありましたが、自分の不得意な部分を含めて全体の理解し再確認するいい機会になりました。
CKA、CKADで出題される範囲は、Kubernetesの世界の最初の基礎部分だけに過ぎません。
きちっと基礎を理解して、Kubernetesをもっとより良く活用していきたいと思います。