Traffine I/O

日本語

2022-07-03

KubernetesのPVとPVC

はじめに

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を指定しています。

persistent_volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  storageClassName: manual
  capacity:
    storage: 100M
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/pvc"

以下の設定を使用して、この設定を適用できます。

bash
$ kubectl apply -f persistent_volume.yaml

persistentvolume/pv created

PVの検査

PVが作成されると、kubectl describe pvコマンドを使用してその詳細を取得できます。

bash
$ 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を定義しています。

persistent_volume_claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10M

以下の設定を使用してPVCを作成できます。

bash
$ kubectl apply -f persistent_volume_claim.yaml

persistentvolumeclaim/pvc created

PVCの検証

PVCが作成されると、kubectl get pvcコマンドを使用してその詳細を確認できます。

bash
$ 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をリストすることによってこれを確認できます。

bash
$ 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をマウントする方法を示しています。

pod_pvc.yaml
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コマンドを実行します。

bash
$ kubectl apply -f pod_pvc.yaml

pod/helloworld-pvc created

Podが作成されると、PVCで指定されたストレージにアクセスできるようになり、Podの再起動や終了を超えてデータを永続的に読み書きすることができます。

Pod内でのファイル操作

PVCがボリュームとしてマウントされると、Podはこのボリュームにファイルの読み書きを行うことができます。kubectl execコマンドを使用して、実行中のPodとそのコンテナ内でコマンドを実行することで、Podとやり取りすることができます。

ボリューム内に新しいファイルを作成するには、コンテナ内でシェルを実行し、通常のファイル操作コマンドを使用します。例えば、次のコマンドを実行して、from_pod.txtという新しいファイルを作成します。

bash
$ kubectl exec -it helloworld-pvc sh
bash
/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接続してファイルを確認できます。

bash
$ minikube ssh
bash
docker@minikube:~$ cat /mnt/pvc/from_pod.txt

from pod

このコマンドは、「from pod」という文字列を出力し、Pod内で作成したファイルがノード上に永続的に存在していることを示しています。これにより、Podが再起動や終了しても、Podによって書き込まれたデータが永続化され、Kubernetesにおけるデータの永続性の問題が解決されます。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!