がじぇ

お金と家電とプログラミングのブログ

Kubernetesにおけるストレージ

こんにちわ

がじぇったー (@hackmylife7) | Twitter


です。ガジェット情報をいち早くツイートすることを生きがいにしているのでよかったらフォローください。


今日はk8sのストレージについてです。



f:id:gadgeterkun:20190731000258j:plain


TL;DR(要約)

  • 基本的にPersistentVolumeを使うことが多いと思うので、Dynamic volume provisioningでのPersistent Volumeの自動作成手法を抑える

Volumeの種類

以下3つの観点で抑える

  • エフェメラル(一時ストレージ): データの永続性は保証されない。コンテナが作成されると同時に作成され、コンテナが終了する時に削除される。コンテナが消失した場合、エフェメラルに保存されているデータは削除される
  • ボリューム: Pod単位で使用されるボリューム。コンテナがクラッシュしてもデータは残るが、Podが削除されるとそのボリュームに保存していたデータも失われる。
  • 永続ボリューム(PersistentVolume):Podやコンテナのライフスタイルと紐づかない形でデータを保存するために使われる。実態としてはネットワークストレージクラスタに存在する。Podのライフサイクルには紐づかないので、Podを削除しても永続ボリュームは削除されない


PersitantVolumeのマニフェストファイル

apiVersion: v1
kind: PersistentVolume  ※ kindで指定
metadata:
  name: pv0003
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs: ※NWストレージの場所とマウントパスを指定
    path: /tmp 
    server: 172.17.0.2

Persistent Volume Claim

Persistent Volume Claimは永続化ストレージの要求を行うリソース。
PodとPersistent VolumeをBindするための設定がPersistent Volume Claim
(ストレージをどれくらいの容量、アクセスモードで使うか、マニフェストファイル内で記載し、要求する)

KubernetesのスケジューラははPersistant Volume Claimの定義をみてPodに対応するPersistent Volumeを探し、紐づける

マニフェストファイル

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim ※Podではこのmetadataを指定して紐づける
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi ※ストレージを8gくれ!
  storageClassName: slow
  selector:
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}

Dynamic Volume Provisioning

Persistent Volume Claimの内容に基づいて、動的にPersistent Volumeを作成してくれるのがDynamic Volume Provisioningである

事前に別でPersistent Volumeを作成する必要がない

また、Storageのtype(ssdか標準HDか等)を指定することができる

使い方

Dynamic Volume Provisioningを使用するには事前にStorage Class Objectの定義が必要。これらがPersistent Volume Claimに渡すパラメータとなる

また、Storage Classはssd(高速永続ディスク)かpd-standard(標準永続ディスク)等、パラメータを指定することにより、どんなStorageが欲しいのか選ぶことができる
どの程度IOPSが必要かによる


これは標準永続ディスクの例
Storage Class :slow

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


これはSSDライクな永続ディスクである高速永続ディスクの例。

Storage Class :fast

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

そしてPersistentVolumeClaimで、作成したストレージクラスを指定するとPersistentVolumeがプロビジョニング時に自動で作られる

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: claim1
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast   ←これ
  resources:
    requests:
      storage: 30Gi

参考(Kubernetesの最強参考書)

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

Kubernetesの他の記事へは下記の一覧から飛べるようにしているので参照ください。

gadgeterkun.hatenablog.com