【CKAD-JP合格体験記】試験申し込み、勉強方法をまとめる

# はじめに

CKAD-JPに合格しました。初めての実技、k8s試験ということもあって、色々混乱したので、記事にすることにしました。これから受ける人の参考になれば幸いです。

# 認定Kubernetes試験の種類

以下の試験があります。

* 認定Kubernetesアプリケーション開発者（CKAD）
Kubernetesクラスタ内のリソースに着目した試験です。
* 認定Kubernetes管理者（CKA）
Kubernetesリソースだけでなくクラスタ自体の設定にも触れた試験です。
* 認定Kubernetesセキュリティスペシャリスト（CKS）
セキュリティについて、KubernetesだけでなくLinuxの知識も必要になってきます。
CKAを合格している必要があります。
* 認定Kubernetesクラウドネイティブアソシエイト（KCNA）
2022年7月に日本語版が出た新しめの試験です。Kubernetesだけでなくクラウドに関する問題が出てきます。
他の試験とは異なり選択式の問題になります。

概要は以下のサイトに書いてあります。

https://lpi.or.jp/k8s/

CKAとCKADの違いが分かりづらいと感じたので、参考にしたサイトを載せておきます。

https://qiita.com/mochizuki875/items/a77d5c495d2fb99bd2f9

難易度について、、、
CKS>CKA>CKADなのかなと思っています。それぞれコンセプトが違うので、何ともですが、必要なスキルが幅広いと勉強量が多いと思います。KCNAは選択式でクラウド全体の話になるので、他とは全く違うものになるかなと思います。

日本語試験について、、、
それぞれの試験で日本語版（CKA-JP／CKAD-JP／CKS-JP／KCNA-JP）があります。ただあまり違いはないイメージです。2023年1月1日から英語を話す試験官になりましたし、日本語の問題文が微妙です。。教材含め問題文は英語だったので試験も英語にしました。言語は試験中に切り替えられます。

※その他参考にしたサイト
https://linuc.spa-miz.com/2022/09/27/kubernetes-crowdnaitiate-kcna-test-of-test/
https://www.linuxfoundation.jp/press-release/2022/07/kubernetes-and-cloud-native-associate-certification-is-now-available-in-japanese/
https://github.com/moabukar/Kubernetes-and-Cloud-Native-Associate-KCNA/blob/main/mock-exam-questions/questions.md
https://github.com/moabukar/CKS-Exercises-Certified-Kubernetes-Security-Specialist
https://kubernetes.io/ja/training/

# 実技試験の方法について

詳細は以下のページに書いてあります。受験日までに読んでおくことをお勧めします。
オンライン受験の要件やショートカットキーの違いなど詳しく書かれています。

https://docs.linuxfoundation.org/tc-docs/certification/tips-cka-and-ckad

:::note warn
注意点としては自分のブックマークが使えないことです。
たまにブックマークを作るような試験対策を見かけますが、現在は使えません。
:::

試験ではPSIというブラウザをインストールします。PSI上でVMを操作してブラウザやターミナルを立ち上げます。私はブラウザからk8sのドキュメントを見て、検索窓を使って、欲しいリファレンスが載っているページを探していました。

![230211_search_k8s_docs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/13bd3c3f-ae7d-4e1b-19d6-f2c9679f4396.png)

文字だけだとイメージがわかないと思います。恥ずかしながら、初見は「どうやってターミナル立ち上げるんだ！？」ってなりました。。そのため、後述する模擬試験を１度はやっておくことをお勧めします。

# 試験の申し込みの流れ

以下のサイトの通りです。
https://lpi.or.jp/k8s/exam/
再受験できるか、予約日は変更できるかなどは以下のサイトを読むことをお勧めします。
https://lpi.or.jp/k8s/faq/

予約自体も色々なサイトを行き来して混乱するのでまとめておきます。

1. EDUCO-IDの登録
以下のサイトにアクセスしてEDUCOのアカウントを作成します。
https://ma.educo-j.or.jp/
1. 受験用のクーポンの購入
以下のサイトで購入します。
https://k8s.stores.jp/items/5f5b082df4cd006a5c33d521
クーポンが発行されるまで１日ほどかかりました。メールにて連絡が来ました。
1. LFIDの登録
以下のサイトにアクセスしてlinuxfoundationのアカウントを作成します。
https://training.linuxfoundation.org/ja/
アカウントログインは上記サイトの「マイトレーニングポータル」から行います。
![230211_login_lfid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/8b236dd8-c54a-8ea4-ac22-338e60813eb3.png)
1. 受験結果共有への承諾
以下のサイトにアクセスして承諾します。
https://www.surveymonkey.com/r/JPVFYN8
ここで、これまで作成したアカウントを使います。
   * EID
   EDUCO-IDにログインした画面で確認でます。
![230211_show_eid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/35dbe95f-6a0b-6438-8aed-2adb41be2eb6.png)
   * LF-ID
   Linux Foundation Trainingにログインするときに使うIDを入力します。
   もしくは以下のサイトから確認できます。
   https://identity.linuxfoundation.org/
   * クーポンコード
   クーポン購入後に発行をお知らせするメールに記載してあります。
1. 試験の登録
以下のサイトから試験を登録します。
https://training.linuxfoundation.org/ja/certification/certified-kubernetes-application-developer-ckad-jp/
1. 受験日の予約
案内に従って受験日を予約します。途中ブラウザを閉じてしまっても再度アクセスすれば再開できます。

# 勉強方法

:::note warn
私は１年以上Kubernetesの実務経験があります。そのため、勉強目的はインプットというよりは試験問題に慣れることの方が大きかったです。その前提で読んでいただければ幸いです。
参考までに点数はkiller.sh１回目で87/112（77%）、試験本番で94/100（94%）でした。
:::

勉強するために使ったサイトは以下の通りです。

## Udemy（KodeKloud）

:::note alert
間違えてCKA用のコースを買ってしまいました。問題量としては後述する外部サイトも使って補いました。
:::

以下のコースを使いました。

https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/

実際にコマンドを打てる環境を用意してくれていて便利でした。ちょっとわかりづらいと感じたのが、環境はUdemyではなくKodeKloudから使います。
Udemyでコースを買った後、受講すると以下のサイトとクーポンコードを使うように案内されます。追加でお金はかかりません。

https://uklabs.kodekloud.com/courses/labs-certified-kubernetes-administrator-with-practice-tests/

上記サイトにアクセス後、「Enroll in this Course」を押します。

![230211_kodekloud_enroll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/01a58913-af07-3f48-4560-25f31b7671d5.png)

ページ移動したら、上の方にある「Click here to enter your code」をクリックすると、クーポンコードを入力する欄が出てきます。

![230211_kodekloud_input_coupon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/cd1e62ef-1aa9-b494-396c-c2c7fcd54554.png)

クーポンコードを適用すると、追加でお金を払うことなく使えるようになります。

## その他外部サイト

以下の外部サイトで公開されている問題集を解きました。実技試験だと答え方に迷うことが多いので、問題集毎の解き方を比べると参考になるのかなと思います。

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

https://medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam-2f42d1228552

## 模擬試験（killer.sh）

試験を登録すると、２回分の模擬試験が付いてきます。模擬試験は試験予約した際のページから受けることができます。
本番に近い環境で、より難しく作られているので、一度受けておくことをお勧めします。
試験予約ページから「Click here to access the Exam Simulator」をクリックします。
![230211_killer.sh1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/363331f8-f2bd-dc2d-31a1-f4b136d2fc20.png)
２回分の模擬試験がNot Activatedとなっています。選択するとActivateになり模擬試験を開始できます。
![コメント 2023-02-09 022630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474054/c2586783-94a7-438d-9520-ed6cad14eed2.png)

# 役に立ったコマンド

試験と実務で覚えておいて損ないなと思ったコマンドを紹介します。

## kubectl describe ＜resource＞

リソースがうまく動いていないとわかった場合にまず実行するコマンドです。Eventとしてエラーログが出ている場合があります。
もしPODがエラーで終了した場合には、kubectl logsコマンドも合わせて実行するとよいと思います。

## kubectl ＜command＞ -h

コマンドをど忘れすることがあります。そんな時にとりあえずhelpを呼ぶと、オプションの使い方が出てきます。kubectlの場合はオプションの種類だけでなく実行例が出てくるので便利です。

```bash
$ kubectl create job -h
Create a job with the specified name.

Examples:
  # Create a job
  kubectl create job my-job --image=busybox
  
  # Create a job with a command
  kubectl create job my-job --image=busybox -- date
  
  # Create a job from a cron job named "a-cronjob"
  kubectl create job test-job --from=cronjob/a-cronjob

Options:
    --allow-missing-template-keys=true:
        If true, ignore any errors in templates when a field or map key is
        missing in the template. Only applies to golang and jsonpath output
        formats.

    --dry-run='none':
        Must be "none", "server", or "client". If client strategy, only print
        the object that would be sent, without sending it. If server strategy,
        submit server-side request without persisting the resource.

    --field-manager='kubectl-create':
        Name of the manager used to track field ownership.

    --from='':
        The name of the resource to create a Job from (only cronjob is
        supported).

    --image='':
        Image name to run.

    -o, --output='':
        Output format. One of: (json, yaml, name, go-template,
        go-template-file, template, templatefile, jsonpath, jsonpath-as-json,
        jsonpath-file).

    --save-config=false:
        If true, the configuration of current object will be saved in its
        annotation. Otherwise, the annotation will be unchanged. This flag is
        useful when you want to perform kubectl apply on this object in the
        future.

    --show-managed-fields=false:
        If true, keep the managedFields when printing objects in JSON or YAML
        format.

    --template='':
        Template string or path to template file to use when -o=go-template,
        -o=go-template-file. The template format is golang templates
        [http://golang.org/pkg/text/template/#pkg-overview].

    --validate='strict':
        Must be one of: strict (or true), warn, ignore (or false).             "true" or
        "strict" will use a schema to validate the input and fail the request
        if invalid. It will perform server side validation if
        ServerSideFieldValidation is enabled on the api-server, but will fall
        back to less reliable client-side validation if not.            "warn" will
        warn about unknown or duplicate fields without blocking the request if
        server-side field validation is enabled on the API server, and behave
        as "ignore" otherwise.          "false" or "ignore" will not perform any
        schema validation, silently dropping any unknown or duplicate fields.

Usage:
  kubectl create job NAME --image=image [--from=cronjob/name] -- [COMMAND]
[args...] [options]

Use "kubectl options" for a list of global command-line options (applies to all
commands).
```

## kubectl api-resources

さらにリソースタイプをど忘れしてしまった時のコマンドです。カスタムリソース含め、リソースタイプ、ショートカットの一覧が出てきます。

```bash
$ kubectl api-resources 
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume
pods                              po           v1                                     true         Pod
podtemplates                                   v1                                     true         PodTemplate
replicationcontrollers            rc           v1                                     true         ReplicationController
resourcequotas                    quota        v1                                     true         ResourceQuota
secrets                                        v1                                     true         Secret
serviceaccounts                   sa           v1                                     true         ServiceAccount
services                          svc          v1                                     true         Service
...
```

## alias k=kubectl; source <(kubectl completion bash); complete -F __start_kubectl k

まず、`alias k=kubectl`についてですが、一番使うコマンドなので、`alias`を設定すると楽です。
`source <(kubectl completion bash)`は自動補完を可能にします。コマンドのオプションだけでなく、デプロイされているリソース名も補完してくれるので、焦っているときのタイプミスを防止できます。
`complete -F __start_kubectl k`は自動補完を`alias k=kubectl`設定後でも使えるようにするためのコマンドです。省略した`k`コマンドでも補完してくれるようになります。

※参考
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

## Ctrl+R

同じコマンドを再度実行するショートカットが役に立つと思います。`kubectl`はオプションが多いので、自動補完を使っても何か付け忘れることがあります。
Ctrl+Rはコマンド履歴から過去に実行したコマンドを探すことができます。

※参考

https://qiita.com/quwa/items/3a23c9dbe510e3e0f58e

# おわりに

CKADに合格して、技術が身についている自信を持つことができました。
実務経験はあるといっても、いざ試験勉強してみるとベストプラクティス的なものを知ることができて楽しかったです。別のk8s試験も受けてみたいなと思いました。
これからも勉強します。