フツーって言うなぁ!

フツーなサラリーマンのフツーな嘆き.

CKAD / CKAを受けてきた

例によって放置しまくってますが,あまり気にせず書きたいことを書くことにします.

タイトルの通り,今年の2月から9月にかけて,Certififed Kubernetes Application Developer(認定Kubernetesアプリケーション開発者.以下,「CKAD」),Certified Kubernetes Administrator(認定Kubernetes管理者.以下,「CKA」)を受けてきたので,何をやっていたかとちょっとした感想を残しておきます.

試験の概要

CKAD:

www.cncf.io

CKA:

www.cncf.io

どちらもCloud Native Computing Foundation(CNCF)が運営する,Kubernetesについてのスキルを認定する資格試験. 実際にKubernetesクラスタを操作することで問題に回答する,ハンズオン形式であることが特徴.

CKADとCKAの違い

注意点として,2020年9月からCKAの出題形式(試験範囲,試験時間,問題数など)が大きく変わっていることに注意.古い記事に当たるときは気をつけること.

training.linuxfoundation.org

CKAD CKA
試験の目的 Kubernetesを利用するアプリケーション開発者(クラスタ利用者)」としてのスキルを認定 Kubernetesクラスタ管理者」としてのスキルを認定
受験料 300USD*1 300USD
有効期限 受験日から3年間 受験日から3年間
試験時間 2時間 2時間
問題数 15-20問 15-20問
合格点 66% 66%
出題範囲
  • Core Concepts(13%)
  • Configuration(18%)
  • Multi-Container Pods(10%)
  • Observability(18%)
  • Pod Design(20%)
  • Services & Networking(13%)
  • State Persistence(8%)
  • Cluster Architecture, Installation & Configuration (25%)
  • Workloads & Scheduling(15%)
  • Services & Networking(20%)
  • Storage(10%)
  • Troubleshooting (30%)

最も大きな違いとして,CKADは,ほぼすべての問題が与えられたKubernetes上のリソースを閲覧/作成/変更することで解答できるものであるのに対し,CKAの試験範囲には,Kubernetesアーキテクチャについての理解と,クラスタのインストール,アップグレード,トラブルシューティングなどのオペレーションも含まれる点が挙げられる.

個人的な所感として,CKADは一問一問の実装量がそれなりに多く,ちゃんと対策していかないととうてい時間が足りない. 対して,CKAはカバーする範囲が広い分,ひとつひとつの問題は易しめ,といった感じ.

どちらから始めればよいか

「マネージドサービスのKubernetesを雰囲気で使ってきたけどそろそろ覚えたい」とか,「Kubernetesそんなに知らないけどこれからガッツリやっていきたい」のであれば,CKADから始めるのがよいかと思う. Kubernetesを利用する機会と運用する機会であれば,たぶん利用する機会の方が多いし,試験内容が「Kubernetesを利用してアプリを作る」ことにフォーカスしていることが理由だ.

逆に,「SREとしてKubernetesを運用できるようになりたい」とか,「Kubernetesアーキテクチャについても知りたい」のであれば,CKAから始めることをおすすめする. Kubernetesはもともと複雑な分散システムなので,この試験だけでKubernetesのすべてがわかるわけではないが,これからどういう勉強をしていけばいいかの指針にはなると思う.

試験範囲はわりとかぶっているので,ある程度理解に自信があるのであれば,両方一気に受けてしまうのもよいと思う.

受験記的ななにか

受験前のスペック

以前からクラスタ利用者としてはKubernetesを使っていたが,当時はせいぜい,DeploymentとServiceを作るのと,デバッグが必要になったときkubectl execでコンテナにログインしてログを読むぐらいだった. デバッグに必要なコマンド(kubectl get / describeとか)は知っていたが,それ以外は全然.

2019年秋

8月からアサインされたプロジェクトでKubernetesやIstioに触れる機会ができ,そろそろ体系的に理解したいなぁと思っていた.

社内プライベートクラウドKubernetesを管理している人たちとお酒を飲む機会があり,そこで,

「自分たちの部署に入るなら最低限CKAは取ってて欲しいよねー」

という話になった.

ちょうど今後何をしていくか悩んでいた時期だったこともあり,Kubernetesという技術自体に興味はあったので,「受けてみてもいいかなー」と思うようになった.

2020年1月

正月特有の謎のやる気のままCKADに申し込んだ.

たぶんこの時にはCKAも受けようと思っていたと思う. 最初がCKAではなかったのは,両方チラッと比較した上で,CKADの方がすでに知っていることが多かったし,とりあえずちゃんとManifestが書けるようになりたかったから,だったかな.

ちなみに申し込んだのは日本版のCKAD-JP. 試験としての違いはないが,日本語で試験監督が受けられる.

2020年2月

そのまま1ヶ月放置してしまったが,重い腰を上げて試験日を決めた(CKAD/CKAは申込日から1年間の間,試験日を自由に選べる.受験場所さえ自分で確保すればわりといつでも予約できるので,かえってモチベーションが上がらなかった).

とりあえずいろいろググってみて,

Kubernetes Slack

の#ckad-exam-prepチャンネルでおすすめされていたUdemyの講座*2をやった.

www.udemy.com

この講座は,

  • 動画の講義
  • 実際にクラスタを使った理解度テスト
  • 模擬試験

に分かれており,講義パートで覚えたことを理解度テストですぐに試せる構成になっているのが良い点. 講師はインド人のようだが,英語の訛りもさほどきつくなく,非常に聞き取りやすかった(英語字幕もある).

最終的に1週間ほどでこの講座を2週したが,試験対策としてはこれで十分だったと思っている.

その他には,

公式ドキュメントのブックマーク(後述)をしたり,

Kubernetes完全ガイド(当時は第1版)

で知識を確認したり,

github.com

www.youtube.com

このあたりで試験範囲とTipsを確認したり,

界隈では有名なKubernetes the hard way(自動化ツールに頼らずVM上にKubernetesクラスタを構築するハンズオン)をやってみたりしていた.*3

github.com

試験対策はトータルで2週間ちょいだったと思う.

CKAD当日

CKAD/CKAはリモートで行う試験のため,受験者の責任で「片付いていて」「人の入ってこない」部屋を選んで,受験会場とする必要がある. 試験のために自室を片付けるのは面倒だったので,休日の午前中を選んで会社の会議室を会場にした.

持ち物は,

  • パスポート(身分証明用)
  • MacBook ProWebカメラが付属しているのでわざわざ用意する必要がないのが便利)
  • キーボード(いつも使っているHHKB)
  • ディスプレイ(会社に転がっていたもの)

予定した時間の15分前ぐらいに試験用のポータルサイトが開くので,そこで待っていると監督者からチャットで指示が来る. パスポートをWebカメラで見せた後,不正防止のために会議室全体や机のまわりをWebカメラで写すように言われる(MacBookだとここがしんどい). その後試験に関しての注意事項が伝えられたあとで,試験開始となる.

普通に時間が足りなくて,3問ぐらい一瞥もできなかった問題があったと思う.

あと,最初は試験問題の言語を日本語にしていたが,翻訳の質があまり良くなく,出題意図がわからなかったので,すぐに英語に変更した. ここは改善してもらえると嬉しい…

翌日,合格通知があった. 得点は86%.

f:id:lethe2211:20201003195619p:plain

2020年4月

受かった直後はすぐにCKAも受けようと思っていたが,気づいたら1ヶ月経っていた(ちょうどこの頃仕事が忙しかったのもある).

申し込む.

2020年8月

長過ぎた五月病(笑)から復帰したので受験日を決める.

ちょうど前述のカリキュラム変更があったこともあり,変更後の9月に受けることを決めた.

2020年9月

すでにCKADを取っていたこともあり,試験対策としては,

前述のKubernetes完全ガイドを副読本にしながら,

上記のUdemyの講義のCKA版

www.udemy.com

を2周したのと,

kubernetes.io

の内容を読んだことぐらいしかない.

特に,クラスタをインストール/アップグレード/トラブルシューティングするタイプの問題については,アーキテクチャを念頭に置きながら,動きを理解するために手順含め何回も試して覚えた.

トータルで1週間程度.

CKA当日

こちらも休日に会社の会議室で受けた.

試験のポータルサイトがアップグレードされていてUXが良くなっていた. 試験全体の流れはCKADと同様.

試験慣れしていたこともあってか,終了20分前には完答できた.

こちらも,翌日に合格通知が来たが,得点は81%だった.

f:id:lethe2211:20201003195652p:plain

自分の感触的にはほぼ完答だと思っていたので,なんか問題文の誤読が多かったのかな… すこしもやもや.

Tips

以下,試験対策時,試験時に使えそうなTipsをまとめておく. 基本的にCKAD/CKAに共通して使えると思われる.

1. aliasを登録する

試験の性質上,コマンドのタイプ数はどうしても多くなるので,(指を壊さないためにも)できるだけ減らしたい. 毎回入力するコマンドについてはalias登録しておく癖をつけておくとよい.

$ alias k=kubectl

2. リソースのshort nameを覚えておく

Kubernetesの一部のリソースには,"short name"というものが定義されている. 例えば,PersistentVolumeClaimのresource nameは"persistentvolumeclaims",short nameは"pvc"であり,kubectlを使って取得する際には,

$ k get persistentvolumeclaims

$ k get pvc
  # こちらでも可

のようにできる. 必須ではないが,タイプ数が減らせるなら減らした方がよい.

ちなみに,

$ k api-resource

で,各リソースの有効なshort nameを確認できる.

3. YAMLのテンプレートを作る

Kubernetesの魅力の1つは,YAMLファイルのManifestを使うことでInfrastructure as Codeを実現できることだが,この試験に関して言うと,毎回エディタでYAMLファイルを書いてkubectl apply -fしていると率直に時間が足りない. うまい時短の方法を考える必要がある.

ひとつの方法として,YAMLのテンプレートを作るコマンドを使うことができる. おそらくほとんどの受験者がこの方法を使っているとみられ,この試験の必勝法のようになっている.

例えば,testという名前の,nginxコンテナを持つPodを作る際には,

$ k run test --image=nginx --restart=Never --dry-run=client -o yaml > 01-pod.yaml
$ cat 01-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: test
spec:
  containers:
  - image: nginx
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}
$ k apply -f 01-pod.yaml

のようにすればよい. コマンドを覚える必要はあるが,これでかなり時短できる.

コマンドだけで望みのManifestが作れない場合は,テンプレートを作った後にエディタで編集するようにするとよい.

この方法は,DeploymentやServiceなど,主要なリソースについてはだいたい使える. リソースによって使うコマンドが微妙に違うので,kubectl runkubectl createあたりのヘルプを確認するとよい.

4. kubectlの命令的コマンドを使う

3.に関連して,さらに時短したい場合は,kubectlの命令的(Imparative)コマンドを使うという手がある.

よく使っていたのは,

$ k edit svc mysvc
  # "mysvc"という名前のServiceを直接編集する

$ k set image deploy mydeploy nginx=nginx:1.9.1 --record
  # "mydeploy"という名前のDeploymentの,"nginx"という名前のコンテナイメージを"nginx:1.9.1"に差し替える.それを履歴に残す

$ k expose deploy mydeploy2 nginx --name=mysvc2 --type=ClusterIP --port=80 --target-port=8080
  # タイプClusterIPのService"mysvc2"を作成し,"mydeploy2"という名前のDeploymentが内包するPodのポート8080番を,"mysvc2"のポート番号80番で露出する

$ k label po mypod foo=bar
  # "mypod"という名前のPodにfoo=barというLabelを付与する

$ k taint no mynode foo=bar:NoSchedule
  # "mynode"という名前のNodeにfoo=bar:NoScheduleのTaintを付与する

こんな感じ(もっとあったかも). 全部覚えることは不要だが,覚えてちゃんと使えるようにしておけば有利にはなる.

5. kubernetes.ioをブックマークする

試験中には,試験用のWebアプリ以外にもう一つブラウザのタブを開くことができ,

と,これらの子ページの参照が可能.

特によく使うのは https://kubernetes.io/docs/Kubernetes公式ドキュメント)だが,毎回必要なページをサイト内検索しているとけっこう時間がかかる. ブラウザのブックマーク機能を使うことは許されているので,よく使いそうなものについては登録しておくとよい.

以下,自分が使ったものを雑に晒しておく.

kubectl Cheat Sheet | Kubernetes

Ingress | Kubernetes

Persistent Volumes | Kubernetes

Volumes | Kubernetes

Secrets | Kubernetes

Jobs | Kubernetes

CronJob | Kubernetes

Deployments | Kubernetes

ReplicaSet | Kubernetes

Configure a Pod to Use a ConfigMap | Kubernetes

Labels and Selectors | Kubernetes

Taints and Tolerations | Kubernetes

Assigning Pods to Nodes | Kubernetes

Managing Resources for Containers | Kubernetes

Configure a Security Context for a Pod or Container | Kubernetes

Network Policies | Kubernetes

Configure Liveness, Readiness and Startup Probes | Kubernetes

DaemonSet | Kubernetes

JSONPath Support | Kubernetes

Manage TLS Certificates in a Cluster | Kubernetes

Define Environment Variables for a Container | Kubernetes

Init Containers | Kubernetes

Installing kubeadm | Kubernetes

Upgrading kubeadm clusters | Kubernetes

Operating etcd clusters for Kubernetes | Kubernetes

Kubectl Reference Docs

リソースを作る際,kubectl create等で作れるリソースについてはコマンドで作り,PersistentVolume,PersistentVolumeClaim,Ingress,NetworkPolicy,CertificateSigningRequestなど,コマンドで作れないリソースについては,ドキュメントからのコピペで作れるようにしておくとよい.

6. kubectl explainを使う

Manifestを編集する必要がある問題が出された際に,どこにどのkey/valueを追加すべきかわからなくなることがよくある. こういう場合,ドキュメントを調べるより,kubectl explainを使う方が早く見つけられる場合が多い.

$ k explain po.spec.securityContext
  # Pod("po")のspec.securityContextについてのヘルプドキュメントを参照する

これにより,YAMLのどこにどういった型の値を入れれば望みの動作になるかがわかる.

これは普段の運用でも使えるコマンドだと思う.

7. エディタに慣れておく

kubectl edit等で起動するエディタはデフォルトでVimに設定されている. Vimに慣れておくか,

$ export KUBE_EDITOR="nano"

のようにしてエディタを変えておく.

8. 試験時は解いた問題のメモを取る

試験の各問題には傾斜された配点が付いており,難しい問題には多めの配点が付与されている.

試験中,試験用のWebアプリ内のエディタを使ってメモを取ることが許されているので,試験の最初に全問題の配点をメモし,配点の高い問題から取り組むようにした. 加えて,すでに解いた問題をメモにマークしておいた.

結果的に,無駄な時間を使わずに済んだと思う.

9. Chromeの設定をしておく

試験時に使えるブラウザは,所定のChrome拡張をインストールしたChromeChromiumのみ. 他のブラウザを使っている人は動きに慣れておくとよい.

あと,意外とやってしまうのが,誤クリックやショートカットキーでブラウザを閉じてしまうこと. できれば不要なショートカットキーは無効化しておくとよい.

試験の流れや試験環境については,

docs.linuxfoundation.org

docs.linuxfoundation.org

docs.linuxfoundation.org

このあたりに詳しい記載があるので一読しておくとよい.

まとめ

CKAD/CKAともに,Kubernetesの基礎を体系的に理解したい人には非常に良い試験だと思う. 特に,実際にkubectlや他のコマンドを使ってクラスタを操作する体験は,実際のプロジェクトでもかなり役立った.

反面,資格試験としてみると,2/3の得点が取れれば合格してしまうので,「技術力の証明」という観点からだとちょっとよくわからないなとは思った. 逆に考えれば,もっと軽い気持ちで受けてみてもけっこう受かるのかもしれない(CKAD/CKAともに,不合格でも追加費用無しで1回再受験ができる).

これにてKubernetesチュートリアル終了!と思っていたが,今年の11月にCertified Kubernetes Security Specialist(認定Kubernetesセキュリティスペシャリスト.CKS)という新しいKubernetesの試験ができるらしい.

training.linuxfoundation.org

気分が乗ればこっちも受けてみたい,ような気もしないでもない.

*1:"CKAD coupons"とかでググると値引きのためのクーポンコードが見つかる(かも)

*2:いつもは\24,000とけっこうするが,Udemyはちょいちょい95%セールをやってるので,そのタイミングを狙ってみるとよい

*3:Kubernetes the hard way,やってみればわかるが,ちゃんと理解するためにはインフラの知識がかなり必要になる.いちおう手順を最初から最後まで流しはしたが,正直あんまり理解できていなかったと思う