新卒エンジニアがCKA取得を目指してKubernetesを勉強したときの記録

大学を卒業して1年になりますが、つい先日 [Certified Kubernetes Administrator](https://training.linuxfoundation.org/ja/certification/certified-kubernetes-administrator-cka/) (CKA; 認定 Kubernetes 管理者) の資格を取得したので、この1年を振り返りつつ、受検記録を残したいと思います。

**2023-03-30 更新**  
CKAD も取得したので受検記録を書きました → [CKAD受検記録【2023年版】](https://sogo.dev/posts/2023/03/certified-kubernetes-application-developer)

## 対象読者

* CKA 取得を考えている人
* 新卒エンジニアで Docker や Kubernetes などのコンテナ技術に興味がある人

## タイムライン

やったことと時期を簡単にまとめておきます。順番に CKA 取得までの過程を書いていきます。

| 時期 | 内容 |
|:-:|:-:|
| 2021年8月 | [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way) |
| 2021年11月〜 | [Kubernetes 完全ガイド 第2版](https://book.impress.co.jp/books/1119101148) |
| 2022年12月 | CKA 申し込み（購入） |
| 2022年12月 | Kubernetes を利用したアプリ開発 |
| 2022年1月〜 | [Certified Kubernetes Administrator (CKA) with Practice Tests](https://fujitsu.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/) (Udemy) |
| 2022年2月 | kubeadm でクラスタ構築 |
| 2022年3月 | CKA 受検 |

### 入社時のスペック

入社時の私はコンテナを以下の通り、**コンテナを使ったことはあるが仕組みはよく分かっていない**という状態でした。

* Docker を使ったことはある
  * Dockerfile は書けるがコンテナの仕組みは分かっていない
* Kubernetes? なにそれ美味しいの？　どうやって読むの？
* ラスパイ上で docker compose を使ってサーバー運用

### 新人研修

新人研修中にチームに入って業務を学ぶという期間があり、私はマネージド Kubernetes サービス ([Kubernetes Service Hatoba](https://pfs.nifcloud.com/service/kubernetes-service-hatoba.htm)) の開発チームに入りました。

当時 Kubernetes の読み方以上のことは全然分からなかった私は、そのチームに入って仕事ができるか不安しかなかったですが、結果的に Kubernetes について理解を深める機会になりました。

やった内容としては主に以下の2つです。

* [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way)
* Elasticsearch と Kibana を Kubernetes にデプロイするハンズオン資料作成

Kubernetes The Hard Way の記録については別の記事にまとめていますのでそちらに譲ります。

https://qiita.com/SogoK/items/192d475c20e07dd38984

ES / Kibana のハンズオン資料の成果物はこちらです。 Deployment や Service (type: LoadBalancer) の他に PersistentVolume や StorageClass の使い方も知ることができました。

https://blog.pfs.nifcloud.com/elasticsearch-kibana-with-hatoba-loadbalancer

### 新人研修完了時のスペック

そんなこんなで以下のような状態になりました。この時点で周りに **「CKA 取るぞ！」と宣言** してしまったので、残された課題点を潰していきつつ、勉強をするよう自分を攻め込むフェーズになります。

* Kubernetes の使い方や構成をわかってきた
  * 手順に沿ってアプリをデプロイしたりすることができる
  * 各コンポーネントの役割を理解した
* 残った課題
  * Kubernetes リソースの体系的な理解
  * Kubernetes ネイティブなアプリの開発
  * kubeadm を使用したクラスタ構築
  * kubectl コマンドの使い方

### 『Kubernetes 完全ガイド 第2版』の学習開始

職場の先輩に「Kubernetes The Hard Way をやったなら、後は『[Kubernetes 完全ガイド 第2版](https://book.impress.co.jp/books/1119101148)』をやっておけば余裕です」と言われたので、とりあえずこの本から学習を始めました。

上述の通り、「Kubernetes リソースの体系的な理解」に課題を感じていたので、この本はとても役に立ちました。ただ、第10章を過ぎたあたりから内容が細かくなってきたので「CKA にはそこまで求められていないんじゃないか」と思い、一旦学習をやめて後述する Udemy の講座を中心に進めていくようにしました（~~実はまだ読み終わっていない~~）。

### CKA 申し込み（購入）

サイバーマンデーで  **半額セール** をやっていたのでそのタイミングで購入しました。購入してから1年以内に受験する必要があります。

時々セールをやるので、 CKA を取ろうと思ったら情報をウォッチしておくと良いと思います。どうしてもタイミングが合わなそうな場合は、後述の **Udemy 講座の受講で 15% OFF** のクーポンがもらえるので、それが使えます。

### Kubernetes を利用したアプリ開発

これは CKA というよりも CKAD な範囲の話ですが、楽しかったので書いておきます。

ちょっと変則的ですが私の会社では去年、新人研修終了後（本配属後）に個人開発演習と称して、2週間自分の好きなものを開発できる期間がありました。

私は "**Slack Bot as a Service**" として Slack Bot を動作させるプラットフォームを作りました。具体的にいうと、ユーザーの作った Slack Bot アプリケーションをサービス側で用意した Kubernetes クラスタ上に Pod としてデプロイする仕組みです。
ユーザーの Pod や Secret をデプロイする API サーバーやワーカーも Kubernetes 上で動作するという、いかにもクラウドネイティブっぽい設計をするのは初めての経験だったので、とてもイキイキと開発していました。

### Certified Kubernetes Administrator (CKA) with Practice Tests (Udemy)

Udemy に [Certified Kubernetes Administrator (CKA) with Practice Tests](https://fujitsu.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/) という講座があり、これもまた **CKA 対策の鉄板** です。

私は会社で Udemy for business が使えたのでそれを利用しましたが、そうでなくとも頻繁に大幅割引きのセールをやっているらしいので、それらの機会を狙うと良さそうです。

『Kubernetes 完全ガイド』をやっていましたが、一回触れただけで完全に理解できた自信はなかったので、（JSONPATH の講座も含め）全部飛ばさずにこなしました。講座に付帯する KodeKloud の環境がより試験に近い環境なので、試験環境や kubectl コマンドの使い方に慣れるという意味で非常に役に立ちました。

試験環境という意味では、 Windows を使う場合

* Ctrl + C -> Ctrl + Insert (コピー)
* Ctrl + V -> Shift + Insert (貼り付け)

のショートカットを使うのに慣れるのは重要だと思います。 Mac の場合は通常通り ⌘ + C, ⌘ + V が使えます。~~私は試験対策後も Shift + Insert を使い続けています。意外と使いやすい 😂~~

`kubectl run` や `kubectl create` は講座のハンズオンをこなしていくうちに自然に慣れていきました。逆に NetworkPolicy や PersistentVolume などは `kubectl create` では作れないので、ドキュメントの参照先を見つけておくことが重要になります。 Kubernetes ドキュメントサイトの検索機能を使いまくりましょう。

個人的に役に立ったと思うページをまとめておきます。

* [Configure a Pod to Use a PersistentVolume for Storage](https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/)
  * [PersistentVolume](https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/) のページには書いていない **hostPath な PersistentVolume** のサンプルがある
* [共有ボリュームを使用して同じPod内のコンテナ間で通信する](https://kubernetes.io/ja/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/)
  * `emptyDir: {}` なボリュームを作って Pod 内の複数コンテナ間でボリュームを共有する時のサンプル

上記以外には各リソースのページをよく見ていましたが、リソース名の検索で一発なのでここでは省略します。
また、 [kubectlチートシート](https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/) はよく紹介されていますが、試験対策時や試験中にこれを使いたくなることはありませんでした。

### Kubeadm でクラスタ構築

これはただの趣味なんですが、同じ時期に Raspberry Pi 4B 8GB 数台を用意して [kubeadmを使用したクラスターの作成](https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) を実践しました。

割とあっさりできてしまったので「あれ、こんなものなの」と拍子抜けした記憶があります。以前に VM で同じようにクラスタ構築を試した時にコケたことがあったので、割と運ゲーな面もあるのかもしれない。。

### 模擬試験

先述の Udemy の講座 (KodeKloud) には3つの、 CKA を申し込むと使える [Killer Shell](https://killer.sh/) には1つの模擬試験（2回まで受験可）があります。

KodeKloud の模試をやって、苦手なところを個別に復習して……という感じで、試験対策をしました。2回ずつ模試をやって、だいぶ自信がついた状態になりました。

CKA を申し込むと使える環境には Killer Shell (模試) と Killercoda (練習問題的な何か) の2つがあります。私は試験前日まで後者を模試だと勘違いして、それをやっていましたが前日夜になって **Killer Shell の方が模試** だと気づいて、慌てて解きました（正確には両者の関係は理解していたのですが、 Killer Shell をクリックした時になぜか Killercoda にリダイレクトされたのでそういうものだと思ってしまった）。
この模試は **実際の試験より数段難しく作られている** とはいえ、2時間測ってやった結果が合格点にギリ届かなかったので、ちょっと不安になりました 🥺

この記事をお読みの皆さんはお気をつけください。。

### 受検

そして、受検本番です。朝が一番頭が冴えているので、午前 9:15 からの枠で予約しました。

**試験時間は2時間、問題数は17問** でした。 CKA-JP ではなく CKA の方を買ったので（ケチった）、「英語を話すのかなあ」と思っていましたが、テキストチャットで済みました。私のウェブカメラのマイクのエコーが酷かったので、試験中はスピーカーをミュートにさせてもらいました。

場所は、一人暮らしのワンルームマンションで受験しました。結構細かく見られると聞いていたので、机の上やお部屋を掃除して、本にはあらかじめタオルをかけておきました。

試験そのものについては、割と入念にやった対策が効いたのか、開始から70分経過した頃に一周解き終わりました。残りの時間は動作確認を一通りやり、（1問動作確認ができなかった問題もありましたが）試験を終えました。
時間配分という点では、試験の環境には残り時間がバーで示されているだけで **明示的に残り何分かが分からないので、開始時間をしっかり見ておく** 必要があります。私は見忘れていて困りました 😅

### 結果

100点中、91点で **合格** しました 💮（合格ラインは66点）

![certificate](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451958/b6a01d59-3cf4-10e9-835e-d532f05af1fd.jpeg)

![screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451958/1295833d-f136-16ef-75a5-9f8e6c3c5f1c.png)

## 感想

* CKA について
  * せっかく勉強するならいい点数で合格したいと思っていたので、9割取れてよかった
  * Kubernetes の各リソースや kubectl の使い方、クラスタ構築について自信を持てるようになった
* そもそも Kubernetes について
  * 入社時はなにも知らなかったし「docker compose でいいや」と思っていたが、便利さを知った
    * マニフェストで細かく設定できる
    * より堅牢で安心感のある運用ができそう
  * 一方でマニフェストは docker compose だけの時と比べるとはるかに複雑
    * Helm を使うのが事実上標準であることも含めると学習コストが高い
* これから
  * CKAD も受けてみようかな
  * docker compose 運用のアプリたちを Kubernetes 上に移行中だが、ただ移すだけではなくアプリの設計も Kubernetes ネイティブにしたい

長くなりましたが、この1年を Kubernetes 学習の観点から振り返ってみました！
この記事が、私の初めての後輩たちや、その他 Kubernetes 学習者の皆さんのお役に立てば幸いです。