Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Rancher meetup #15で発表したKubernetesの永続化ストレージの必要性と基礎について説明した資料となります。

Ryoma Fujiwara

October 18, 2018
Tweet

More Decks by Ryoma Fujiwara

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 藤原 涼⾺ (@RYoMa_0923) インフラエンジニア Rancher JPコアメンバー 趣味 勉強会で⾊々喋る ⼦供と遊ぶ

    特技 無茶振り対応 いらすとや・ヒューマンピクトグラム2.0の酷使 2 (C)Ryoma Fujiwara, All rights reserved
  2. 注意 & 懸念事項 6 (C)Ryoma Fujiwara, All rights reserved これの品質

    ⾷物アレルギーで 3⽇前に救急搬送 されてる(ry
  3. 最初に 12 (C)Ryoma Fujiwara, All rights reserved 7.5 PersistentVolumeClaim 〜

    7.9 volumeMountsで利⽤可能なオプション をひととおり理解している⼈ ノシ
  4. 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にマウント)
  5. Volumeの種類 emptyDir と hostPath Volumeといえばこの2つ 20 (C)Ryoma Fujiwara, All rights

    reserved https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes いや、違うね!という⽅にはごめんなさい
  6. 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にマウント)
  7. emptyDir Podを削除するとVolumeも消える 22 (C)Ryoma Fujiwara, All rights reserved $ kubectl

    delete pod/sample-pod - ( - ( ) ) - ( /( ίϯςφ΋ ϘϦϡʔϜ΋ શͯফ͑Δ
  8. 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
  9. emptyDirの使い道の例 単⼀Pod、複数コンテナ時にコンテナ間の ファイル連携などに主に利⽤する 24 (C)Ryoma Fujiwara, All rights reserved sample-pod

    comb-volume updater-container update-check -container なにがしか ファイルに書き込む ファイルの更新を 検知して何かする e.g. Amazon S3にアップロードなど
  10. 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にマウント
  11. 1台構成+MySQL+emptyDir 1台構成のKubernetesクラスタ + MySQL + emptyDir 31 (C)Ryoma Fujiwara, All

    rights reserved (Volume) emptyDir DBとして基本的にはNG (意図的に消えて欲しい場合は別)
  12. 1台構成 + MySQL + hostPath 1台構成のKubernetes + MySQL + hostPath

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

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

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

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

    rights reserved NodeA NodeB NodeC NodeAで起動した時だけ うまくいきます DBの正常起動ガチャはふつうやらない (nodeSelectorで頑張れば⽴ち上がるNodeの固定も可能だがあまりしない)
  17. 結果、どのNodeで起動しても期待した データファイルが得られる 41 (C)Ryoma Fujiwara, All rights reserved PersistentVolume Kubernetes

    Nodes どのNodeで起動しても期待した データファイルがあります!感激! ちゃんと ”永続化”できてる
  18. 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
  19. 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 ここには出てないものもあるので注意
  20. PersistentVolumeの作成 • 名前 : ⽂字通り • ラベル : PersistentVolumeの分類・識別⼦ •

    アクセスモード : 別途説明 • 容量 : ボリュームの容量 • リクレイムポリシー: 別途説明(ボリューム再利⽤時の挙動) • ストレージクラス名: どのストレージを使うか 45 (C)Ryoma Fujiwara, All rights reserved
  21. アクセスモード 3種類ある 46 (C)Ryoma Fujiwara, All rights reserved ① ReadWriteOnce:

    単⼀のPodからのみ読み書き可能 ② ReadOnlyMany: 複数のPodからの読み取りアクセスのみ可能 ③ ReadWriteMany: 複数のPodからの読み書きアクセスが可能 PersistentVolume PodA PodB PersistentVolume PodA PodB PersistentVolume PodA PodB
  22. アクセスモード 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
  23. リクレイムポリシー PersistentVolumeの利⽤が完了 (=PersistentVolumeClaimが削除された) した際の挙動 48 (C)Ryoma Fujiwara, All rights reserved

    ① Delete ② Retain ③ Recycle(⾮推奨なので説明しない) PersistentVolumeClaim の削除 PersistentVolume の削除 PersistentVolumeClaim の削除 PersistentVolume の削除 ボリュームはそのまま残る ボリュームは消える データも消える
  24. 何を主張するか 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 ͔ΒҾ༻
  25. 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 ① ②
  26. 59