HackyViolette

人生暇つぶし

PodSpecとContainerフィールドでのSecurityContextの違い

CKAD試験勉強シリーズです。

SecurityContext は PodSpec(spec.securityContext)とContainer(spec.containers[*].securityContext)のどちらでも設定することができます。

基本的にはこれらはスコープが異なります。

spec:
  securityContext:       # Podスコープで適用される
    runAsUser: 1010
  containers:
  - name: hoge
    image: busybox
    securityContext:     # hogeで適用される(Podスコープより強い)
      runAsUser: 1011
  - name: fuga
    image: busybox
    # securityContextが設定されていないのでPodスコープのものが適用される

最初は単に Pod と Container のスコープの違いだけかと思っていましたが、どうやら指定できるフィールドが異なるようです。

PodSpecのSecurityContext

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core

ContainerのSecurityContext

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core

試験で出そうな範囲に絞ると以下の違いがあります。

フィールド PodSpec Container
runAsUser
runAsGroup
privileged
capabilities

権限周りはContainerのフィールドに入れないといけないようです。

spec:
  securityContext:                   # Podスコープで適用される
    runAsUser: 1010
    # ここではcapabilitiesは指定できない
  containers:
  - name: hoge
    image: busybox
    securityContext:
      capabilities:                  # capabilitiesはcontainersの中で指定
        add: ["SYS_TIME"]
  - name: fuga
    image: busybox

一旦ここまで。ありがとうございました。

StorageClass の Dynamic Provisioning と VolumeBindingMode について

CKA受験勉強時にはStorageClassについて全くと言っていいほど知らなかった(なんかあるなぁって感じ)のですが、CKAD受験に向けて基本のキを知ったのでメモします。

StorageClass

kubernetes.io

ストレージの実体をどのようにプロビジョニングするかの定義的なものと理解しました。

主なフィールドは以下の通りです。

  • provisioner: Volumeプラグイン(どのような形でストレージを実装するか)を指定
  • parameters: Volumeプラグインのパラメータを指定
  • reclaimPolicy: Delete / Retain(PVCの削除とともにPVを削除 / PVC削除後にPVが残る)
  • volumeBindingMode: Immediate / WaitForFirstConsumer(PVC作成後即PVを割り当てる / PodでPVCが使われるまでPVを割り当てない)

example-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-sc                 # 本来はこのような名前はNG(容量重視とかパフォーマンス重視とかわかりやすい名前をつける)
provisioner: kubernetes.io/aws-ebs # AWS EBSプラグインを使用(PVの実体)
parameters:
  type: gp3                        # EBSのgp3を指定
reclaimPolicy: Retain              # PVC削除後もPVは残る(再利用できるわけではない)
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate       # PVC作成後すぐにPVが割り当てられる

PVやPVCマニフェストでもこのStorageClassが設定されています。

設定しない場合はデフォルトのStorageClassが当たります(デフォルトがあれば)。

example-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
  labels:
    type: local
spec:
  storageClassName: example-sc # StorageClassを指定
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

example-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  storageClassName: example-sc # StorageClassを指定
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

Dynamic Provisioning

PV を使うためには基本的には以下の流れでリソースを作成していきます。

  1. StorageClass 作成
  2. PV 作成 ※
  3. PVC 作成 ※
  4. Pod 作成(volumesに PVC を指定)

※ PV 作成と PVC 作成は実際にはどちらが先でもよいです。

このような流れで作成した場合、Podを作成するときには PV と PVC が先に存在しなければなりません。

PVC は StorageClassやAccessMode、Resources の要件に合う PV を探すので、この例の場合にはstorageClassName==example-sc, accessMode==ReadWriteOnce, requests.storage==3Gi(以上)を探し、example-pvとバインドされます。PVとしてEBSが10Gi確保され、PVCで3Giリクエストされている状態です。これはPVCに対して過剰な容量のPVが当たっているのでストレージが無駄になります。

それを解決するのが Dynamic Provisioning です。

kubernetes.io

Dynamic Provisioning では PVC が作成されたタイミングでその要件に沿った PV を作成しバインドします。そのため過剰なストレージ容量を食うことなく PV を作成することができます。ただし、Dynamic Provisioning に対応した provisioner を利用する必要があるため注意です(EKS / AKS / GKE を利用し、クラウドストレージを普通に利用する分には問題ないです)。

以下のように用途に合わせてslow, fast といった StorageClass を作成できます(GCP PDを利用する場合の例)。

example-sc-dynamic.yaml

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

PVC を作成する際にこれらの StorageClass を指定することで、用途にあった PD タイプ(pd-standard or pd-ssd)で PV を確保できます。

VolumeBindingMode

VolumeBindingMode は PVC が作成されたあとにどのタイミングで PV とバインドするかをコントロールする仕組みです。

kubernetes.io

Immediate モードの場合には、PVC 作成後すぐに PV のバインディングとプロビジョニングが行われます。

WaitForFirstConsumer モードの場合には、PVC 作成後、Podが作成されるまではバインディングとプロビジョニングは行われません。

Dynamic Provisioning と VolumeBindingMode の関係

きちんと手元で検証したわけではないですが、以下のような動きになると思います。間違っていたらすみません。

Dynamic Provisioning VolumeBindingMode PVC 作成後の動作
Immediate 即時 PV が払い出されバインドされる。
WaitForFirstConsumer PV は払い出されない。
PVC を利用する Pod がスケジュールされるタイミングで PV が払い出されバインドされる。
Immediate PV は手動で作成する。
PVC と PV は条件が合うものが見つかり次第即時バインドされる。
WaitForFirstConsumer PV は手動で作成する。
PVC を利用する Pod がスケジュールされるタイミングで PV と PVC がバインドされる。

※手動というのはあくまでも「Dynamic Provisioning の機能を使わない」という意味です。

ローカルストレージの場合(no-provisioner)

ローカルボリュームの場合には Dynamic Provisioning はサポートされません。provisioner として no-provisioner を指定します。

example-sc-local.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

とりあえず今日はここまでにします。ありがとうございました。

CKA合格の道のり

Certified Kubernetes Administrator(CKA)試験に合格したので対策をまとめます。

前提

開始時スキルはLinuxの超基本的なコマンドはなんとなく打てるレベル、「コンテナオーケストレーションとは?」と聞かれたらなんとなく答えられるレベルでした。勉強期間は2022/1〜2022/3の3ヶ月で合計150〜200時間程度を勉強に費やしました。最初の方は効率のよくない勉強を50時間くらいしていたので、それをしなければもう少し短い時間で取れたのかなと思います。

結果

結果は 86/100点 で合格でした。66点が合格ラインなのでまあまあの結果ではないでしょうか。

f:id:hackyviolette:20220414191923p:plain

f:id:hackyviolette:20220414192303p:plain

勉強法(最短)

必要なものはこの4つだけです。

コンテンツ 内容 完了基準
Kubernetes完全ガイド 第2版 Kubernetes初学者のための教科書 どこに何が書いてあるかわかればOK
Kubernetes公式ドキュメント 公式ドキュメント KodeKloud, Killer.shの解答に必要なページをブックマークできていればOK
Udemy: Certified Kubernetes Administrator (CKA) with Practice Tests に付随のハンズオン(KodeKloud) 講座と1:1のハンズオン すべて自力で解答できるまでやる
Killer.sh 本番試験よりも若干難易度の高い模試 制限時間内に満点取れるまでやる

完了基準を見てもらえればわかるように、完全ガイドと公式ドキュメントは完璧に読む必要はなく、ハンズオンと模試を完璧にすればよいということです。超マニアックな知識を問われることはないため書籍や公式ドキュメントの隅まで理解しなくていいです。

以下の流れで勉強を進めました。

f:id:hackyviolette:20220414194125p:plain

一旦完全ガイドを1周読みきった時点で、理解できてようとできてなかろうとハンズオンをやってしまいましょう。わからないことはハンズオンを進める中で書籍に立ち返ればよいです。

ここからは各コンテンツの補足説明をします。

Kubernetes完全ガイド 第2版

book.impress.co.jp

もはやKubernetes初心者のバイブルといって良いのではないでしょうか。 この本にエッセンスが詰まっているので、まずは1周読み込んでKubernetesの機能の全体像やどこに何が書かれているのかを把握しましょう。

最初は何がなんだかわけわからないと思いますがとりあえず読み切ることを優先すればよいと思います。細かなことを言うと、CKAの試験範囲から逸脱している単元もあります。しかし、「試験範囲に絞って読むことができる」ということは「Kubernetesについてある程度知識がある」ということなので、初学者の時点でそういったフィルタリングは難しいのではないでしょうか。まずは難しいことを考えずに全体像を掴むために軽く読み切るのが近道かと思います。

Kubernetes公式ドキュメント

kubernetes.io

試験では公式ドキュメントの閲覧が許可されています(タブ1つだけ)。事前のブックマークもOKのため、ハンズオンや模試の復習を行うときに必要なページはブックマークしておくとよいと思います。

公式ドキュメントの検索は優秀なので必要な情報がすぐに見つかる可能性が高いです。そのため、大量にブックマークするというよりは、本当に使用頻度の高いものだけをブックマークするのがよいと思います。私がブックマークしたページに関しては別記事で紹介しようと思います。

Udemy: Certified Kubernetes Administrator (CKA) with Practice Tests

www.udemy.com

Udemyなのでセールのときに買いましょう。¥2,000程度で購入できたと思います。

この講座では、Kubernetes基本講座(英語)+ハンズオン環境・基本問題を利用することができます。購入する目的としては講座そのものというより、付随するハンズオン環境・基本問題を利用するためです。

講座はすべて英語のため、英語がよっぽど得意でない限りは素直に完全ガイドを読んだ方がよいと思います。ハンズオンを完璧にしましょう。 実際私はUdemy講座は15%しか達成していませんが、ハンズオンは100%です。

f:id:hackyviolette:20220414200213p:plain

Killer.sh

killer.sh

CKAの受験を申し込んだ際にKiller.sh(模試)の2回分のチケットがもらえます。本番よりも若干難しいですが、この模試を完璧にすることで知識と自信がつくと思います。

Killer.shについても追々別記事で紹介しようと思います。

勉強法で失敗したこと

失敗したなぁと思うことを共有します。

●完全ガイドのすべてのハンズオンを試していたこと

完全ガイドはとてもよい本で、一つ一つの説明の後にマニフェスト例とコマンド実行例が書かれています。これらを一つひとつ自分でもやってみることで学びにはなるのですが、時間がかかりすぎてしまいます。

書籍の半分くらいまでこの方法で勉強していたのですが、埒が明かないと思ってやめました。

マニフェストを何も見ずに完璧にかけるように練習していたこと

マニフェストの構造をしっかりと理解しなければ」との思いからマニフェストファイルを0から自力で書く練習をしていた時期がありました。試験では基本的にkubectl run hoge-pod --image=nginx --restart=Never --dry-run=client -o yaml > po_hoge-pod.yaml のようにコマンドからyamlファイルを出力し、それを編集するといった方法で作成します。試験中に自分で0から書いていては時間が足りないですし、実務上においても自分で0から書くことはない(少なくとも公式ドキュメントを参考にする)ため0から書けることになんの意味もないです。

Kubernetes公式トレーニング付きバウチャーを購入してしまったこと

これが一番イタイ失敗でした。。

lpi.or.jp

LPI-Japanから申し込みをする場合、バウチャーには「試験のみ」「トレーニングのみ」「試験とトレーニングセット」があります。

f:id:hackyviolette:20220414202748p:plain

レーニングと抱合せがお得感がありついポチってしまったのですが、結局最後までトレーニング教材を使うことはありませんでした。めっちゃお値段高いので購入する際には注意してください。CKAに合格することを考えた場合、トレーニング教材はやりすぎです。CKAに合格後に読む分にはよいと思いますが、初学レベルでいきなりトレーニング教材はキツいと思います。

●知らないLinuxコマンドについて深入りしすぎていたこと

CKA試験ではLinuxをある程度さわれる人であることが前提の試験です。試験を解くために基本的なコマンドを使うことがあります。私の場合には, ps, ss(netstat) らへんは触ったことがあるのですが、service, systemctl, journalctl等については全くの初見でした。これらのコマンドについて一つ一つ深入りして調べていたのですが合格に向けてはもったいない時間でした。CKAで必要とされる使い方さえできればOKということにして先に進めばよかったです。

とはいえ、さすがに「Kubernetesの資格持ってます。Linuxわかりません。コンテナわかりません。」ではあまりにもダサいのでLPIC受けるとかしたいです。

次に取得する資格

鉄が熱いうちにCKADを取得しようと思います。CKAと大部分の範囲がかぶっているようなので今度は1ヶ月程度で合格できるかなぁと思ってます。

ミニマリストとは正反対

今週のお題「わたしの部屋」

部屋が汚すぎて全部は見せられないのですが、作業スペースと趣味スペースくらいはなんとかなるかなということで晒します。

作業スペース

机の上がだいぶ汚いですね。。本も崩れたままです。

言い訳をすると、先日リモートで試験を受ける必要があり、モニターや備品をまるまま別室に持っていった後に急いで現状復帰をしたので配線周りがぐちゃぐちゃなままになっています。本棚が汚いのは言い訳のしようがありません。

f:id:hackyviolette:20220412224856j:plain

モニターをいっぱい置きたく、本広げたりノート書いたりするのに机の奥行きも欲しかったので大きめを買いました。 サンワダイレクトの幅180cm×奥行き60cmのデスクです。 「机の上にモノが散乱してて机広い意味ないじゃん」というツッコミはなしでお願いします。普段はきれいなんです、本当です信じてください。

椅子

オカムラのSabrinaモデルです。オプションでヘッドレスト+ランバーサポートをつけています。かなりお値段が張るのですが一生モノと考えると踏ん切りがつきます。ゲーミングチェアを作業用にするのもアリかとは思いますが、私の場合ゲーミングチェアは合いませんでした(主に腰の調子)。

PC

机に置いているのは会社のPCです。通常はデスクの右下にラックがあり、そこでセットしていますが昨日出社する必要があったので出しっぱなしになっています。 ラックには他に以下のPCがあります。

  • 音楽や動画制作用のWindowsデスクトップPC
  • 普段使い用のMacbookPro
  • もう稼働していないUbuntuサーバ用ノートPC

モニター

モニターはWQHDが2枚とFullHDが1枚です。

その他

キーボードはRealforce、あとは適当にウェブカメラとスピーカーフォン、安物のペンタブ、オーディオインターフェースですかね。

趣味スペース

f:id:hackyviolette:20220412233317j:plain

鍵盤はこんな感じです。

  • ALESISの安い電子ピアノ
  • ROLAND JP-8000
  • YAMAHA DX100

他にも制作用のMIDIキーボードとかミニシンセとかが写真の外にいろいろ転がっています。

あとは歌録音用のコンデンサーマイクとポップガード、リフレクションフィルターです。