CKSで一度目は不合格となったけど二度目でリベンジできたお話

# はじめに(この記事について)
CKSに合格したので、受験体験談を記録しておくことにしました。
タイトルにある通り、1度目の試験では不合格となり、無料での再受験にてなんとか合格できました。
CKS受験を目指している方に向けて、「1回落ちても合格している人もいるんだな」というのが伝わればいいなと思います。

:::note warn
<font color="red">なお、今回の一度目の不合格の原因は明らかに自身の準備不足であり、紹介している教材に対してのネガティブな意図は一切ございません。</font>
:::

## 筆者について
都内IT企業にてSEとして勤務しております。
コンテナ(特にKubernetes)技術は、今後伸びていく分野と考えて、3年くらい前から学習を続けております。
ただ直接Kubernetesを扱う業務には携わっていないため、実運用などの経験は皆無です。

## Kubernetes関連資格の取得履歴
|時期|資格取得|
|:---|:---|
|2021/11|CKA取得|
|2022/03|CKAD取得|
|2023/02|CKS取得(上旬に1度目受験、その約3週間後に2度目受験)|

## CKS(Certified Kubernetes Security Specialist)とは

https://training.linuxfoundation.org/ja/certification/certified-kubernetes-security-specialist/

Kubernetes認定資格のうち、セキュリティに関する資格です。
Kubernetesの実行環境(クラスタ)をセキュアにする方法、実行されるPodをセキュアな設計にするために設定すべき項目、イメージや定義内容の脆弱性をどのように評価するかなどが問われる試験です。
資格取得にはCKAの合格している必要があります。そのため、勉強内容もCKADよりはCKAに近い(一歩進んだ内容)が多かったかなと思います。

# 学習開始～一度目の受験まで

## 勉強方法

### kodekloud
https://kodekloud.com/

CKA及びCKADの受験時は以下のUdemy教材を購入して、KodeKloudの対象コンテンツを利用することができました。KodeKloudでの学習スタイルが自分に合っていると感じたためCKSも同様に学習したいと考えましたが、CKS向けのコンテンツはUdemyでは未配信(2023/02時点)でした。そのため、値は張りましたがKodeKloudに登録してCKS向けコンテンツを受講することとしました。運よく、半額セールのタイミングで登録できたのは良かったです。

https://www.udemy.com/course/certified-kubernetes-application-developer/

CKAやCKADと同じく、動画による説明と練習問題(ハンズオン)で構成されており、研修の最後には総仕上げ問題(Mock Exam)も用意されています。私の勉強方法は、動画やハンズオンで学んだ内容や関連するWebサイトのリンクなどをGooogleドキュメントへまとめながら学習しました。この時にまとめた学習メモも、余力があれば公開したいと思います。

### Killer Shell CKS
https://killercoda.com/killer-shell-cks

無料で練習問題が解けると聞いたので、こちらも一通り解いてみました。約40のテーマに分かれていて、1テーマあたり1~3問の構成となっております。KodeKloudのコンテンツを一回りしたあと、練習問題として解くようにしました。



### コンテナセキュリティの書籍

https://www.amazon.co.jp/dp/4839970505

CKSの受験ブログで常に紹介されている書籍で、今回の試験学習を進めるために必要と思い、Kindleで購入しました。
ただ、自分はこの書籍を頭から読むというよりは、必要な項目を調べるのに利用していました(これが一度目に不合格だった一つの要因だったかもしれません)

## 1回目の受験
研修最後のMock Examも時間内に全問解ける実力が身についたので、試験に受験してみることとしました。かなり自信満々に受験したのですが、惨敗でした。
試験では設問毎のWeightが表示されています。そのWeightが他よりも大きい3問が、どれもすっきりと回答できたとはいえない状況でした。試験中も「これは厳しいかな…」と思っており、予想通り不合格でした。
ちなみに不合格になると自身のスコアと合格に必要なスコア、特に回答できていなかった項目について記載されたメールが届きます。

# 不合格から二回目の受験まで
惨敗とはいえ、ゼロから勉強をやり直そうという程でもなかったので、不合格通知がきた次の日に2回目の受験日(約3週間後)を予約しました。最初にターゲットを決めたのは良かったと思います。Kubernetesのバージョンが変わる前に再受験できたのと、デッドエンドが決まっていること(特に期末評価までに取得したいという事情もあり)で緊張感を持って学習ができました。

## 勉強方法(試験準備)

### 模擬試験
不合格となった一番の要因は、Kubernetes認定試験の挑戦時に無料で受けれる模擬試験(シミュレーター)を受験していなかったことです(CKA/CKADの際にも利用しており存在は認識していたのですが、前回とリンクの設置場所が変わったのか1回目の受験前に見つけられず「無くなっちゃったのかな…」と思いこんでました)

シミュレーターは2022年からの新試験方式と同様に、Linuxの仮想デスクトップ上で操作します。ターミナルでオペレーションを実施したり、導入済みのブラウザ(Firefox)で調べながら解いていきます。2回利用することが可能(設問は同じ)で、利用開始から36時間は試験環境を利用可能(仮想デスクトップにログイン可能)です。私は試験までの土日や祝日を活用して、シミュレーターは2回利用しました。2時間以内に解き終わらなくても、全く解法が分からない問題では解説を読みながらでも、Scoreが満点になるまで解き続けました。難易度が高い問題が多いので、実試験での難問に対する耐性を身に着けることができたと思います。

このシミュレーターでは、設問の内容の他にもう一つ意識した点があります。それはデスクトップ上での各ウィンドウの配置です。CKA/CKADは新試験方式へ切り替える前だったため、仮想デスクトップを利用した新試験方式は今回が初めてでした。ウィンドウの並べ方や切り替えに手こずったり、テキストエディタはどれを使っていいのか分からなかったり(結局テキストエディタはあきらめた)など、試験の本質でない部分でのタイムロスが多かったのも敗因の1つだと思います。自分にとってのベストなウィンドウの配置を見つけて、それに慣れるようにしました。

### KodeKloudの模擬試験をやり直す
あらためてお伝えしますが、KodeKloudの教材がCKS対策として役に立たないということは一切ございません。上記のシミュレーターは利用できる回数が決まっているという制約があります。KodeKloudはハンズオン環境の利用回数には制限はありません。

カリキュラムの最後にあるMock Examでは、CKSの出題範囲をある程度カバーした基礎的な問題が揃っているので、効率よく出題範囲のおさらいができます。CKSの試験でWeightが低い問題でも、それらを素早く正確に対処するスキルも大事と考え、Mock Examも改めてやり直しました。

### 試験で分からなかった問題の復習
試験終了後、記憶が新しいうちに解けなかった問題についてメモしておきました。
後日、Kubernetesドキュメントのどの部分に該当する記述があったのかを見直して、同様の問題が出たら解けるように(少なくとも全く手もつかないという状況は避ける)しておきました。

### 苦手部分の補強
試験問題としては出題されなかったが、理解が足りてなさそうな部分を追加学習するようにしました。
私の場合はkubeconfigの部分で不明瞭な部分があったので、自身で納得できるように検証環境で試したりしました(これは個別で記事書くかもしれません)。
検証環境においてもKillercodaにはお世話になりました。1時間という利用時間の制約はありますが、1マスター＋1ワーカーノードの環境をブラウザから利用できるのは便利です。

### Dockerイメージのセキュリティ
CKSの「対象領域とコンピテンシー」の中に、

>ユーザー ワークロード（Kubernetesリソース、Dockerファイルなど）の静的分析を使用する

という項目が含まれてます。自分はKubetnetesの勉強ばかりでDockerはほぼ未学習であったため、Dockerに関する設問へ対応できませんでした。
Dockerのセキュリティのうち、最低限の知識を身に着ける必要があると考えて、以下のサイトは目を通しておきました。

- DockerFile書き方のベストプラクティス
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
- イメージビルドのベストプラクティス
https://docs.docker.com/get-started/09_image_best/
- DockerのSecurity
https://docs.docker.com/engine/security/

### コマンドライン操作の効率化

#### 行単位、ファイル単位の繰り返し処理
例えば、複数のポッドやファイルに対する操作を、その数だけ手作業で繰り返す場合、2、3個であればそこまで時間はかからないですが、10個近くになると結構な時間がかかります。さらに手作業だとミスをする可能性もあります。
そこで、`while read〜`のようなBASHコマンドを知っていれば、やりたい作業を短時間で処理するための選択肢が増え、ミスも少なくできると考えました。Kubernetesの学習に加えて、そのようなBASHのテクニックも少しおさえておくようにしました。

一例として、`image.lst`にコンテナイメージの一覧が記載されており、一番脆弱性が少ないイメージをtrivyを使って見つける場合だと、以下コマンドのようなイメージです。

```BASH
while read LINE
do
  trivy image ${LINE} | head -n 20
done < image.lst
```

:::note warn
もちろん、「どうやったら効率的にコマンド実行できるかな・・・」と悩む/試してみることに時間を費やす過ぎるのは本末転倒です。すぐに思いつかない場合、非効率だったとしても1つずつ手作業で実行することも必要かと思います。
:::

参考にした記事
https://qiita.com/Jazuma/items/0bd013b3981cd04a5319
https://www.server-memo.net/shellscript/for.html

#### Ctrl-Rでの履歴参照
「確か同じコマンドを少し前に実行したなー」と思いながらカーソルの↑キーでコマンド履歴を漁っていくのも、すぐお目当てのコマンドが見つかればよいですが、思った以上に過去にあったり見過ごしたりということもあります。その場合は`Ctrl-R`で過去に実行したコマンドを探すことができます。

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

#### エイリアスを活用する
`alias kubectl=k`がデフォルトで設定されています。
kubectlコマンドを実行するときは短縮化された`k`を使うようにしました。

# 合格発表と今後について

## 二度目の受験
まったく分からない/お手上げという問題はほぼ無かったので、勉強した成果はあったのかなと思いました。
とはいえ、配点が高めの問題で満点回答できているという自信もなかったので、絶対に合格できているとは思ってなかったです。合格9:不合格1くらいの感覚でした。
結果的には86%で合格できていたので良かったです。

## CKSの所感
自分としては、CKAより少し難易度が高いという位置づけでしょうか。CKSはKubernetesだけでなく、LinuxやDockerの知識が必要になる部分も多いと感じたので、CKAよりも広い分野での知識が求められると思います。
ただAssociateとProfessionalレベルの差があるわけではないので、CKA/CKAD取得した方なら同じように学習継続すれば無理なく取得できるレベルだと思います。

## 今後について
Kubernetesとしては、EKSみたいなマネージドサービスに触れていないので、次はその部分の学習を深めて、Kubernetesについてもっと知見を広めることができればと考えております。
一方で、KodeKloudの利用期間も残っているので、DCAの勉強もしてみながらDocker部分にも手を広げてみたいとも考えております。
あとは今年の11月にCKA受験から2年経つので、更新するかも検討したいと思います(受験費用も高くて、会社から補助があるわけでもないので…)

長い文章でしたが、最後までお読みいただきありがとうございます。この記事が、CKS受験者のお役に少しでも立てれば嬉しいです。