広告

kubernetes – Volume

infrastructure as code

PersistentVolumeClaimの説明を始める前に、前提知識として、k8sのVolumeとPresistentVolumeについてしておかなければなりません。今回はVolumeについてご紹介します。

Volumeとは

kubernetesのVolumeについて、公式ドキュメントに以下の記載があります。

On-disk files in a Container are ephemeral, which presents some problems for non-trivial applications when running in Containers. First, when a Container crashes, kubelet will restart it, but the files will be lost - the Container starts with a clean state. Second, when running Containers together in a Pod it is often necessary to share files between those Containers. The Kubernetes Volume abstraction solves both of these problems.

kubernetesにおいてVolumeとは、k8sクラスタで利用可能なデータ保存領域を使って、作られた仮想ボリュームのことです。

Volumeの存在は、基本以下の二つのためにあります。

  • コンテナが壊れた場合、中のデータがすべて飛んでしまうため、そのデータを保持するために使う
  • Pod内のコンテナ間のデータ共有のために使う

Volumeプラグインとして、様々な種類のものがあります。以前紹介したSecretとConfigMapもその一つです。
一部挙げると以下となります。

  • Secret:機密設定情報を保持するためのk8sのリソースです
  • configMap:設定情報を保持するためのk8sのリソースです
  • emptyDir:ホスト(Node)上の領域を使って、Podの一時領域としてマウントするプラグインです。
    • Podが終了すると、一時領域も消されます
  • hostPath:ホスト(Node)上の任意の領域をPodにマウントするためのプラグインです。
  • downwardAPI:Podの設定情報をファイルとしてマウントするプラグインです。
  • projected:Secret、ConfigMap、downwardAPI、serviceAccountTokenのボリュームを一箇所のディレクトリに集約するためのプラグインです。
  • ...

Volumeとして使用可能なものはもっとあります。詳しく知りたい場合、公式ドキュメントを参照してください。

emptyDirマウント例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}  # emptyDirの指定

hostPathマウント例

apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  containers:
  - name: test-webserver
    image: k8s.gcr.io/test-webserver:latest
    volumeMounts:
    - mountPath: /var/local/aaa
      name: mydir
    - mountPath: /var/local/aaa/1.txt
      name: myfile
  volumes:
  - name: mydir
    hostPath:
      # Ensure the file directory is created.
      path: /var/local/aaa
      type: DirectoryOrCreate
  - name: myfile
    hostPath:
      path: /var/local/aaa/1.txt
      type: FileOrCreate

spec.volumes[].hostPath.typeは以下の種類が指定できます

  • '':マウント先をチェックしない、マウント先に合わせる(デフォルト設定)
  • Directory:ディレクトリが存在していることを前提
  • DirectoryOrCreate:ディレクトリが存在しない場合、作成される(権限:0755)
  • File:ファイルが存在していることを前提
  • FileOrCreate:ファイルが存在しない場合、作成される(権限:0644)
  • *Socket:UNIX socketが存在していることを前提
  • *BlockDevice:block deviceが存在していることを前提
  • *CharDevice:character deviceが存在していることを前提

downwardAPIマウント例

以前containerの環境変数にPod情報を使用する説明がdownwardAPIに該当します。
詳細の使い方は公式ドキュメントのリンクを参考としてお出しします。ここでは割愛します。

downwardAPIでは2つの使用方法があります。

  • 環境変数として使用
  • ボリュームとしてファイルをマウントする

projectedマウント例

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:  # Volumeをコンテナにマウントする
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one  # Volume名
    projected:
      sources:
      - secret:  # Secret
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - downwardAPI:  # downwardAPI
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:  # configMap
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

最後に

今回はざっくりk8sが扱っているVolumeのプラグインの一部をご紹介しました。
公式ドキュメントからでは、現時点で以下のVolumeプラグインがあります。

  • awsElasticBlockStore
  • azureDisk
  • azureFile
  • cephfs
  • cinder
  • configMap
  • csi
  • downwardAPI
  • emptyDir
  • fc (fibre channel)
  • flexVolume
  • flocker
  • gcePersistentDisk
  • gitRepo (deprecated)
  • glusterfs
  • hostPath
  • iscsi
  • local
  • nfs
  • persistentVolumeClaim
  • projected
  • portworxVolume
  • quobyte
  • rbd
  • scaleIO
  • secret
  • storageos
  • vsphereVolume

名前見ればわかるように、GCP、AWS、Azureなどのサービスも直接使えるぽいです。
筆者もすべて知っているわけではありませんので、需要に応じて調べて使うのが一番ありかなと思います。

コメント

タイトルとURLをコピーしました