はじめに
Kubernetesは、Pod内でのライフサイクルを管理することにより、コンテナのワークロードをオーケストレーションします。各Podは仮想ホストと見なすことができ、一時的な存在として機能します。Podの揮発性のため、いつでも消える可能性があり、データの永続性に関して重大な問題が生じます。
Pod内でConfigMapsやSecretsをReadOnly Volumesとしてマウントすることもできますが、データの永続性が必要なデータベースファイルなどには理想的なアプローチではありません。Podが消えると、関連するデータも消えてしまい、情報の潜在的な損失を引き起こします。
この問題の解決策は、データをPodのレベルではなく、ノード自体に、Persistent Volume(PV)という機能を使用して格納することにあります。このコンポーネントは、Podが存在しなくなってもデータを維持するために重要な役割を果たします。
Persistent Volume(PV)
Persistent Volume(PV)は、管理者によってプロビジョニングされたKubernetesクラスタ内のストレージの一部です。PVは、ノードと同様にクラスタ内のリソースであり、ユーザーが個々のPodのライフサイクルを超えてデータを永続的に保存するためのものです。
PVの作成
データを永続的に格納するには、PVをノード上に作成することができます。これは、PVのプロパティを定義する設定ファイルを使用して、kubectl apply -f
コマンドを使用して実現できます。例えば、次のYAML設定ファイルは、ホスト上の/mnt/pvc
に存在し、100Mのストレージ、マニュアルなストレージクラス、ReadWriteOnceアクセスモードを持つPVを指定しています。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
spec:
storageClassName: manual
capacity:
storage: 100M
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/pvc"
次の設定を使用して、この設定を適用できます。
$ kubectl apply -f persistent_volume.yaml
persistentvolume/pv created
PVの検査
PVが作成されると、kubectl describe pv
コマンドを使用してその詳細を取得できます。
$ kubectl describe pv pv
このコマンドは、PVの詳細を含むPVの説明を返します。ストレージ容量、アクセスモード、再利用ポリシー、ステータス、およびバインドされたPVCなどが含まれます。このコマンドから得られる情報は、PVの状態を理解し、潜在的な問題の診断に重要です。
Persistent Volume Claim(PVC)
Persistent Volume Claim(PVC)は、ユーザーによるストレージの要求です。Podがノードリソースを消費するのと同様に、PVCはPVリソースを消費します。つまり、PVCを使用すると、ユーザーはKubernetesクラスタ内のPVのストレージを要求することができます。
PVCの作成
PVを使用するには、PVCを作成する必要があります。PVCは、必要なストレージクラス、アクセスモード、およびストレージ容量を指定します。例えば、次のYAML設定ファイルは、マニュアルなストレージクラス、ReadWriteOnceアクセスモード、および10Mのストレージを要求するPVCを定義しています。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10M
次の設定を使用してPVCを作成できます。
$ kubectl apply -f persistent_volume_claim.yaml
persistentvolumeclaim/pvc created
PVCの検証
PVCが作成されると、kubectl get pvc
コマンドを使用してその詳細を確認できます。
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc Bound pv 100M RWO manual 11s
このコマンドは、PVCの名前、ステータス、バインドされたボリューム、容量、アクセスモード、ストレージクラス、および作成からの経過時間を返します。
バインドされたPV
PVCがPVに正常にバインドされると、kubectl get pv
コマンドでPVをリストすることによってこれを確認できます。
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv 100M RWO Retain Bound default/pvc manual 54s
このコマンドは、クラスタ内の全てのPVとその詳細を表示します。PVCがPVにバインドされている場合、出力でステータスが「Bound」と表示されます。
PodでのPVCのボリュームとしてのマウント
PVCがPVにバインドされると、Pod内でボリュームとして使用できます。これにより、Pod内のコンテナがPVでプロビジョニングされたストレージにアクセスすることができます。
PVCは、Podの設定ファイルのvolumesセクションでPVCの名前を指定することによって、Podにマウントすることができます。通常、YAML形式のファイルで表されるこの設定ファイルには、Podが実行するコンテナやマウントするボリュームなどのプロパティが記述されます。
次のYAMLは、Podの設定ファイルでPVCをマウントする方法を示しています。
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: helloworld-pvc
name: helloworld-pvc
spec:
containers:
- image: bhargavshah86/kube-test:v0.1
name: helloworld-pvc
ports:
- containerPort: 8080
resources: {}
volumeMounts:
- name: my-pv
mountPath: /mnt/pvc
volumes:
- name: my-pv
persistentVolumeClaim:
claimName: pvc
この設定では、単一のコンテナを持つPodが指定されています。コンテナはパス/mnt/pvc
にボリュームをマウントします。このボリュームは、以前に作成したPVCを参照しています。
Podを作成するには、Podの設定ファイルを使用してkubectl apply -f
コマンドを実行します。
$ kubectl apply -f pod_pvc.yaml
pod/helloworld-pvc created
Podが作成されると、PVCで指定されたストレージにアクセスできるようになり、Podの再起動や終了を超えてデータを永続的に読み書きすることができます。
Pod内でのファイル操作
PVCがボリュームとしてマウントされると、Podはこのボリュームにファイルの読み書きを行うことができます。kubectl execコマンドを使用して、実行中のPodとそのコンテナ内でコマンドを実行することで、Podとやり取りすることができます。
ボリューム内に新しいファイルを作成するには、コンテナ内でシェルを実行し、通常のファイル操作コマンドを使用します。例えば、次のコマンドを実行して、from_pod.txt
という新しいファイルを作成します。
$ kubectl exec -it helloworld-pvc sh
/usr/share/nginx/html # echo "from pod" > /mnt/pvc/from_pod.txt
/usr/share/nginx/html # cat /mnt/pvc/from_pod.txt
from pod
echo
コマンドは、文字列「from pod」をボリュームのマウントパスにあるfrom_pod.txtというファイルに書き込みます。cat
コマンドは、ファイルの内容を表示し、正常に作成されたかを確認します。
PVCは、ノード上に存在するPVによってバックアップされているため、Podで作成したファイルはノード上に永続的に存在するはずです。これを確認するためには、ノードにSSH接続してファイルを確認できます。
$ minikube ssh
docker@minikube:~$ cat /mnt/pvc/from_pod.txt
from pod
このコマンドは、「from pod」という文字列を出力し、Pod内で作成したファイルがノード上に永続的に存在していることを示しています。これにより、Podが再起動や終了しても、Podによって書き込まれたデータが永続化され、Kubernetesにおけるデータの永続性の問題が解決されます。