Slide 1

Slide 1 text

Kubernetesの 永続化ストレージ基礎 1

Slide 2

Slide 2 text

⾃⼰紹介 藤原 涼⾺ (@RYoMa_0923) インフラエンジニア Rancher JPコアメンバー 趣味 勉強会で⾊々喋る ⼦供と遊ぶ 特技 無茶振り対応 いらすとや・ヒューマンピクトグラム2.0の酷使 2 (C)Ryoma Fujiwara, All rights reserved

Slide 3

Slide 3 text

⽬的 Kubernetesの永続化ボリュームの 必要性 と 基礎 について理解してもらう 3 (C)Ryoma Fujiwara, All rights reserved

Slide 4

Slide 4 text

注意 & 懸念事項 4 (C)Ryoma Fujiwara, All rights reserved

Slide 5

Slide 5 text

注意 & 懸念事項 5 (C)Ryoma Fujiwara, All rights reserved これの品質

Slide 6

Slide 6 text

注意 & 懸念事項 6 (C)Ryoma Fujiwara, All rights reserved これの品質 ⾷物アレルギーで 3⽇前に救急搬送 されてる(ry

Slide 7

Slide 7 text

まあ、あれだ。 7 (C)Ryoma Fujiwara, All rights reserved

Slide 8

Slide 8 text

まあ、あれだ。 まさか33もなって ⾷物アレルギー(きくらげ) 追加されるとは思わな かったよ & 現代医療は偉⼤ & お医者さんありがとう 8 (C)Ryoma Fujiwara, All rights reserved

Slide 9

Slide 9 text

9 (C)Ryoma Fujiwara, All rights reserved 間違いの指摘歓迎

Slide 10

Slide 10 text

最初に 10 (C)Ryoma Fujiwara, All rights reserved 買った⼈?

Slide 11

Slide 11 text

最初に 11 (C)Ryoma Fujiwara, All rights reserved 買ってない⼈は 使う予定があるなら ひとまず買いましょう

Slide 12

Slide 12 text

最初に 12 (C)Ryoma Fujiwara, All rights reserved 7.5 PersistentVolumeClaim 〜 7.9 volumeMountsで利⽤可能なオプション をひととおり理解している⼈ ノシ

Slide 13

Slide 13 text

最初に 13 (C)Ryoma Fujiwara, All rights reserved あまり追加情報はないですが、 何かしら持って帰って もらえるように頑張ります

Slide 14

Slide 14 text

⽬的 Kubernetesの永続化ボリュームの 必要性 と 基礎 について理解してもらう 14 (C)Ryoma Fujiwara, All rights reserved

Slide 15

Slide 15 text

⽬的 Kubernetesの永続化ボリュームの 必要性 と 基礎 について理解してもらう 15 (C)Ryoma Fujiwara, All rights reserved その前に

Slide 16

Slide 16 text

その前にVolumeについておさらい 永続化ボリュームについて理解してもらう前にVolumeに ついてざっくりおさらい 16 (C)Ryoma Fujiwara, All rights reserved Volume PersistentVolume + PersistentVolumeClaim

Slide 17

Slide 17 text

その前にVolumeについておさらい 永続化ボリュームについて理解してもらう前にVolumeに ついてざっくりおさらい 17 (C)Ryoma Fujiwara, All rights reserved Volume PersistentVolume + PersistentVolumeClaim Volumeの課題感がわかれば PersistentVolumeの意義もわかるはず

Slide 18

Slide 18 text

Volume コンテナにマウントできる(そりゃそうだ) 18 (C)Ryoma Fujiwara, All rights reserved apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - image: nginx:1.12 name: sample-container volumeMounts: - mountPath: /opt name: sample-volume volumes: - name: sample-volume emptyDir: {} sample-pod sample-container sample-volume (/optにマウント)

Slide 19

Slide 19 text

Volumeの種類 Volumeはプラグインを介していろいろ実装できる 19 (C)Ryoma Fujiwara, All rights reserved https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes

Slide 20

Slide 20 text

Volumeの種類 emptyDir と hostPath Volumeといえばこの2つ 20 (C)Ryoma Fujiwara, All rights reserved https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes いや、違うね!という⽅にはごめんなさい

Slide 21

Slide 21 text

emptyDir Pod⽤の⼀時的なディスク領域を準備してPodにマウント する。 21 (C)Ryoma Fujiwara, All rights reserved apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - image: nginx:1.12 name: sample-container volumeMounts: - mountPath: /opt name: sample-volume volumes: - name: sample-volume emptyDir: {} sample-pod sample-container sample-volume (/optにマウント)

Slide 22

Slide 22 text

emptyDir Podを削除するとVolumeも消える 22 (C)Ryoma Fujiwara, All rights reserved $ kubectl delete pod/sample-pod - ( - ( ) ) - ( /( ίϯςφ΋ ϘϦϡʔϜ΋ શͯফ͑Δ

Slide 23

Slide 23 text

emptyDirの使い道の例 単⼀Pod、複数コンテナ時にコンテナ間の ファイル連携などに主に利⽤する 23 (C)Ryoma Fujiwara, All rights reserved apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - image: updater:1.12 name: updater-container volumeMounts: - mountPath: /opt name: comb-volume - image: update_checker:1.12 name: update-check-container volumeMounts: - mountPath: /mnt name: comb-volume volumes: - name: comb-volume emptyDir: {} sample-pod comb-volume updater-container update-check -container /mnt /opt

Slide 24

Slide 24 text

emptyDirの使い道の例 単⼀Pod、複数コンテナ時にコンテナ間の ファイル連携などに主に利⽤する 24 (C)Ryoma Fujiwara, All rights reserved sample-pod comb-volume updater-container update-check -container なにがしか ファイルに書き込む ファイルの更新を 検知して何かする e.g. Amazon S3にアップロードなど

Slide 25

Slide 25 text

hostPath Kubernetesのノード(≒dockerホスト)のディスク領域を コンテナにマウントする 25 (C)Ryoma Fujiwara, All rights reserved apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - image: nginx:1.12 name: sample-container volumeMounts: - mountPath: /mnt name: sample-volume volumes: - name: sample-volume hostPath: path: /opt type: DirectoryOrCreate sample-container sample-volume KubernetesのNode /opt /mnt sample-pod k8sのノードの/optをsample-volume として切り出し、sample-containerは これを/mntにマウント

Slide 26

Slide 26 text

hostPathの使い道(例) なにかしらの理由があってKubernetesのノード側に ファイルを出⼒したい場合に利⽤する 26 (C)Ryoma Fujiwara, All rights reserved sample-container sample-volume KubernetesのNode /opt /mnt sample-pod

Slide 27

Slide 27 text

Kubernetesの永続化ボリュームの 必要性 と 基礎 について理解してもらう 27 (C)Ryoma Fujiwara, All rights reserved

Slide 28

Slide 28 text

1台構成のKubernetesクラスタの世界 28 (C)Ryoma Fujiwara, All rights reserved

Slide 29

Slide 29 text

1台構成 + MySQL 1台構成のKubernetesクラスタ + MySQL を考える 29 (C)Ryoma Fujiwara, All rights reserved

Slide 30

Slide 30 text

1台構成+MySQL+emptyDir 1台構成のKubernetesクラスタ + MySQL + emptyDir 30 (C)Ryoma Fujiwara, All rights reserved (Volume) emptyDir Podを消すとVolumeも消える

Slide 31

Slide 31 text

1台構成+MySQL+emptyDir 1台構成のKubernetesクラスタ + MySQL + emptyDir 31 (C)Ryoma Fujiwara, All rights reserved (Volume) emptyDir DBとして基本的にはNG (意図的に消えて欲しい場合は別)

Slide 32

Slide 32 text

1台構成 + MySQL + hostPath 1台構成のKubernetes + MySQL + hostPath 32 (C)Ryoma Fujiwara, All rights reserved (Volume) hostPath よさげ

Slide 33

Slide 33 text

1台構成 + MySQL + hostPath 1台構成のKubernetes + 複数MySQL + hostPath 33 (C)Ryoma Fujiwara, All rights reserved (Volume) hostPath 複数のMySQLが同じデータファイルを ⾒てしまう可能性⼤(hostPathの管理が超煩雑に) やっぱりダメだったよ…

Slide 34

Slide 34 text

複数台構成+MySQL+emptyDir or hostPath 複数台構成のKubernetesクラスタ + MySQL + emptyDir or hostPath 34 (C)Ryoma Fujiwara, All rights reserved (Volume) emptyDir or hostPath

Slide 35

Slide 35 text

複数台構成+MySQL+emptyDir 複数台構成のKubernetesクラスタ + MySQL + hostPath 35 (C)Ryoma Fujiwara, All rights reserved NodeA NodeB NodeC

Slide 36

Slide 36 text

複数台構成+MySQL+emptyDir 複数台構成のKubernetesクラスタ + MySQL + hostPath 36 (C)Ryoma Fujiwara, All rights reserved NodeA NodeB NodeC 起動するたびにデータファイル があったりなかったりなんですが… (期待したデータで起動できたりできなかったり……)

Slide 37

Slide 37 text

複数台構成+MySQL+emptyDir 複数台構成のKubernetesクラスタ + MySQL + hostPath 37 (C)Ryoma Fujiwara, All rights reserved NodeA NodeB NodeC NodeAで起動した時だけ うまくいきます

Slide 38

Slide 38 text

複数台構成+MySQL+emptyDir 複数台構成のKubernetesクラスタ + MySQL + hostPath 38 (C)Ryoma Fujiwara, All rights reserved NodeA NodeB NodeC NodeAで起動した時だけ うまくいきます DBの正常起動ガチャはふつうやらない (nodeSelectorで頑張れば⽴ち上がるNodeの固定も可能だがあまりしない)

Slide 39

Slide 39 text

PersistentVolumeの意義 ここまでで出てきた課題への解決策が Persistent (永続的な) Volume (ボリューム) 39 (C)Ryoma Fujiwara, All rights reserved

Slide 40

Slide 40 text

Kubernetes Nodeとボリュームを (可能な限り)疎な関係にする ※ネットワーク経由のボリュームを使うのが⼀般的 40 (C)Ryoma Fujiwara, All rights reserved PersistentVolume Kubernetes Node 疎

Slide 41

Slide 41 text

結果、どのNodeで起動しても期待した データファイルが得られる 41 (C)Ryoma Fujiwara, All rights reserved PersistentVolume Kubernetes Nodes どのNodeで起動しても期待した データファイルがあります!感激! ちゃんと ”永続化”できてる

Slide 42

Slide 42 text

Kubernetesの永続化ボリュームの 必要性 と 基礎 について理解してもらう 42 (C)Ryoma Fujiwara, All rights reserved

Slide 43

Slide 43 text

PersistentVolumeの作成 • 名前(オプション) • ラベル • アクセスモード • リクレイムポリシー • ストレージクラス名 43 (C)Ryoma Fujiwara, All rights reserved apiVersion: v1 kind: PersistentVolume metadata: name: sample-volume labels: type: longhorn-pv environment: dev spec: accessModes: - ReadWriteOnce capacity: storage: 8Gi storageClassName: longhorn persistentVolumeReclaimPolicy: Delete

Slide 44

Slide 44 text

PersistentVolumeの作成 & 構成要素 • 名前 • ラベル • アクセスモード • 容量 • リクレイムポリシー • ストレージクラス名 44 (C)Ryoma Fujiwara, All rights reserved apiVersion: v1 kind: PersistentVolume metadata: name: sample-pv-volume labels: type: longhorn-pv environment: dev spec: accessModes: - ReadWriteOnce capacity: storage: 8Gi persistentVolumeReclaimPolicy: Delete storageClassName: longhorn ここには出てないものもあるので注意

Slide 45

Slide 45 text

PersistentVolumeの作成 • 名前 : ⽂字通り • ラベル : PersistentVolumeの分類・識別⼦ • アクセスモード : 別途説明 • 容量 : ボリュームの容量 • リクレイムポリシー: 別途説明(ボリューム再利⽤時の挙動) • ストレージクラス名: どのストレージを使うか 45 (C)Ryoma Fujiwara, All rights reserved

Slide 46

Slide 46 text

アクセスモード 3種類ある 46 (C)Ryoma Fujiwara, All rights reserved ① ReadWriteOnce: 単⼀のPodからのみ読み書き可能 ② ReadOnlyMany: 複数のPodからの読み取りアクセスのみ可能 ③ ReadWriteMany: 複数のPodからの読み書きアクセスが可能 PersistentVolume PodA PodB PersistentVolume PodA PodB PersistentVolume PodA PodB

Slide 47

Slide 47 text

アクセスモード 3種類ある 47 (C)Ryoma Fujiwara, All rights reserved ① ReadWriteOnce: 単⼀のPodからのみ読み書き可能 ② ReadOnlyMany: 複数のPodからの読み取りアクセスのみ可能 ③ ReadWriteMany: 複数のPodからの読み書きアクセスが可能 PersistentVolume PodA PodB PersistentVolume PodA PodB PersistentVolume PodA PodB どのaccessModeが使えるかは、 ボリュームプラグイン次第 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes

Slide 48

Slide 48 text

リクレイムポリシー PersistentVolumeの利⽤が完了 (=PersistentVolumeClaimが削除された) した際の挙動 48 (C)Ryoma Fujiwara, All rights reserved ① Delete ② Retain ③ Recycle(⾮推奨なので説明しない) PersistentVolumeClaim の削除 PersistentVolume の削除 PersistentVolumeClaim の削除 PersistentVolume の削除 ボリュームはそのまま残る ボリュームは消える データも消える

Slide 49

Slide 49 text

ストレージクラス名 ストレージクラスを指定することで、 ストレージクラスに対応したprovisionerを介してどのボ リュームプラグインを使ってPersistentVolumeをプロビ ジョニングするかが定まる 49 (C)Ryoma Fujiwara, All rights reserved StorageClass provisioner Volume Plugin PersistentVolume プロビジョニング

Slide 50

Slide 50 text

どうやって作成したPersistentVolumeを使う? 50 (C)Ryoma Fujiwara, All rights reserved

Slide 51

Slide 51 text

どうやって作成したPersistentVolumeを使う? 51 (C)Ryoma Fujiwara, All rights reserved PersistentVolumeClaim

Slide 52

Slide 52 text

PersistentVolumeClaim PersistentVolumeの所有権を主張して割り当ててもらう 52 (C)Ryoma Fujiwara, All rights reserved https://eikaiwa.dmm.com/blog/21699/ Claim = 権利(ここでは所有権) を主張する

Slide 53

Slide 53 text

何を主張するか 53 (C)Ryoma Fujiwara, All rights reserved ラベルが〜〜〜(ラベルセレクタ) で 容量がxxxx、 かつ アクセスモードがyyyy、 で ストレージクラスがzzzz な PersistentVolume をよこせ kind: PersistentVolumeClaim apiVersion: v1 metadata: name: sample-pvc spec: selector: matchLabels: type: "nfs” matchExpressions: - {key: environment, operator: In, values: [stg]} accessModes: - ReadWriteOnce resources: requests: storage: 4Gi storageClassName: longhorn この要求をsample-pvcとする! https://thinkit.co.jp/article/14195?page=0%2C1 ͔ΒҾ༻

Slide 54

Slide 54 text

Podへのボリュームのマウント 54 (C)Ryoma Fujiwara, All rights reserved 先ほどの主張 (sample-pvc)で得られた ボリュームにnginx-pvcの 名前を与え①、 sample-pvc-podの nginx-containerに マウント②せよ https://thinkit.co.jp/article/14195?page=0%2C1 ͔ΒҾ༻ apiVersion: v1 kind: Pod metadata: name: sample-pvc-pod spec: containers: - name: nginx-container image: nginx ports: - containerPort: 80 name: "http” volumeMounts: - mountPath: "/usr/share/nginx/html" name: nginx-pvc volumes: - name: nginx-pvc persistentVolumeClaim: claimName: sample-pvc ① ②

Slide 55

Slide 55 text

ざっくりと定義の流れをまとめ 55 (C)Ryoma Fujiwara, All rights reserved PersistentVolume Persistent VolumeClaim volumes container Podఆٛ

Slide 56

Slide 56 text

(補⾜)Dynamic Provisioningやリサイズ PersistentVolumeClaimのみで動的にプロビジョニングし たり、PersistentVolumeをリサイズしたりもできますがこ のあたりは書籍・他資料を参照してください 56 (C)Ryoma Fujiwara, All rights reserved https://speakerdeck.com/masayaaoyama/cndjp8-pvcr 書籍 他資料 https://speakerdeck.com/hhiroshell/kubernetesbiao-zhun- falsesutoreziji-neng-woosaraisiyou

Slide 57

Slide 57 text

……あれ? 57 (C)Ryoma Fujiwara, All rights reserved

Slide 58

Slide 58 text

Rancherではどうなのよ? 58

Slide 59

Slide 59 text

59

Slide 60

Slide 60 text

できないとでも? 60

Slide 61

Slide 61 text

もちろんできますとも ただし、事前にストレージの準備等は必要 ボリュームの⼀覧 61 (C)Ryoma Fujiwara, All rights reserved

Slide 62

Slide 62 text

もちろんできますとも 作成(動的プロビジョニング) 62 (C)Ryoma Fujiwara, All rights reserved

Slide 63

Slide 63 text

もちろんできますとも !? 63 (C)Ryoma Fujiwara, All rights reserved

Slide 64

Slide 64 text

もちろんできますとも 作成(動的プロビジョニング) 64 (C)Ryoma Fujiwara, All rights reserved

Slide 65

Slide 65 text

もちろんできますとも ボリュームできた 65 (C)Ryoma Fujiwara, All rights reserved

Slide 66

Slide 66 text

Enjoy! 66