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などのサービスも直接使えるぽいです。
筆者もすべて知っているわけではありませんので、需要に応じて調べて使うのが一番ありかなと思います。
コメント