PersistentVolume を使用したアプリケーションデータの保存

KubernetesBeginner
オンラインで実践に進む

はじめに

この実験では、Kubernetes において PersistentVolume (PV) を使用してアプリケーションデータを保存する方法を学びます。

PersistentVolume (PV) は、クラスター内のネットワークストレージの一部を表す Kubernetes リソースです。これを使用することで、コンテナのライフサイクルとは独立してアプリケーションデータを保存できます。つまり、コンテナが終了したり別のノードに移動したりしても、データは保持されます。

この実験では、PersistentVolume を作成し、それを使用してシンプルな Web アプリケーションのデータを保存します。次に、PersistentVolumeClaim (PVC) を使用して PersistentVolume にアクセスするようにアプリケーションを変更します。最後に、PVC を修正して特定のストレージリソースを要求する方法を学びます。

Minikube クラスターの起動

リソースを作成する前に、Kubernetes クラスターを起動する必要があります。Minikube は、ローカルマシン上で動作する軽量な Kubernetes 環境です。

  1. 作業ディレクトリへの移動:

    ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。

    cd /home/labex/project
    
  2. Minikube の起動:

    Minikube を起動して Kubernetes クラスターを初期化します。

    minikube start
    
    • このコマンドにより、ローカルマシン上にシングルノードの Kubernetes クラスターがセットアップされます。
    • システムのパフォーマンスによっては、Minikube の起動に数分かかる場合があります。
  3. Minikube の動作確認:

    Minikube クラスターの状態を確認します。

    minikube status
    
    • kubeletapiserver などのコンポーネントが Running と表示されていることを確認してください。
    • クラスターが実行されていない場合は、再度 minikube start を実行してください。

Minikube の起動で問題が発生した場合は、必要に応じて minikube delete を使用して環境をリセットしてください。

PersistentVolume の作成

このステップでは、データの保存に使用できる PersistentVolume を作成します。以下の内容で pv.yaml という名前の YAML ファイルを作成してください。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data

このファイルは、容量 1Gi、アクセスモード ReadWriteOnce の PersistentVolume を作成します。hostPath フィールドは、データがホストマシンの /mnt/data パスに保存されることを指定しています。persistentVolumeReclaimPolicy フィールドは Retain に設定されており、PersistentVolume が削除されてもデータが保持されることを意味します。

以下のコマンドを使用して、PersistentVolume をクラスターに適用します。

kubectl apply -f pv.yaml

シンプルな Web アプリケーションのデプロイ

このステップでは、ステップ 1 で作成した PersistentVolume にデータを保存するシンプルな Web アプリケーションをデプロイします。以下の内容で web-app.yaml という名前の YAML ファイルを作成してください。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: web-app
          image: nginx
          volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html/data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: my-pvc

このファイルは、1 つのレプリカを持ち、nginx イメージを実行するコンテナを含む Deployment を作成します。volumeMounts フィールドは、コンテナが /usr/share/nginx/html/data パスに PersistentVolume をマウントするように指定しています。volumes フィールドは、コンテナが my-pvc という名前の PersistentVolumeClaim を使用するように指定しています。

以下のコマンドを使用して、Deployment をクラスターに適用します。

kubectl apply -f web-app.yaml

PersistentVolumeClaim の作成

このステップでは、ステップ 1 で作成した PersistentVolume からストレージを要求するための PersistentVolumeClaim (PVC) を作成します。以下の内容で pvc.yaml という名前の YAML ファイルを作成してください。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

このファイルは、アクセスモード ReadWriteOnce を持ち、PersistentVolume から 500Mi のストレージを要求する PersistentVolumeClaim を作成します。

以下のコマンドを使用して、PersistentVolumeClaim をクラスターに適用します。

kubectl apply -f pvc.yaml

データ永続性の確認

このステップでは、データが PersistentVolume に永続的に保存されていることを確認します。コンテナで実行されている Web アプリケーションにアクセスし、PersistentVolume にデータを書き込みます。

まず、以下のコマンドを実行して、アプリケーションを実行している Pod の名前を確認します。

kubectl get pods -l app=web-app

アプリケーションを実行している Pod が 1 つ表示されるはずです。その Pod 名をメモしてください。

次に、以下のコマンドを実行して、アプリケーションを実行しているコンテナ内のシェルセッションを開きます。

kubectl exec -it pod-name -- /bin/sh

pod-name は、先ほどメモした Pod 名に置き換えてください。

シェルセッションに入ったら、以下のコマンドを実行して test.txt ファイルを追加します。

echo "This is a test file." > /usr/share/nginx/html/data/test.txt

このコマンドにより、PersistentVolume のデータディレクトリ内に "This is a test file." というテキストを含む test.txt というファイルが作成されます。

以下のコマンドで Web アプリケーションを削除します。

kubectl delete deployment web-app

以下のコマンドで Web アプリケーションを再作成します。

kubectl apply -f web-app.yaml

以下のコマンドを使用して、データディレクトリに作成したファイルがまだ存在することを確認します。

kubectl get pods -l app=web-app
kubectl exec pod-name -- cat /usr/share/nginx/html/data/test.txt

pod-name は、先ほどメモした Pod 名に置き換えてください。

PVC ストレージリソースの変更

このステップでは、PVC を変更して PersistentVolume から特定のストレージリソースを要求するようにします。pvc.yaml ファイルを修正し、500Mi ではなく 1Gi のストレージを要求するように変更します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

StorageClass に allowVolumeExpansion: true フィールドを追加します。

kubectl edit storageclass standard

PVC ストレージ変更の例

以下のコマンドを使用して、更新された PersistentVolumeClaim をクラスターに適用します。

kubectl delete deployment web-app
kubectl delete pvc my-pvc
kubectl apply -f web-app.yaml
kubectl apply -f pvc.yaml

まとめ

この実験では、Kubernetes において PersistentVolume を使用してアプリケーションデータを保存する方法を学びました。PersistentVolume を作成し、それを使用するシンプルな Web アプリケーションをデプロイし、PersistentVolume からストレージを要求するための PersistentVolumeClaim を作成し、特定のストレージリソースを要求するように PersistentVolumeClaim を変更しました。また、コンテナが終了したり別のノードに移動したりしても、データが PersistentVolume に永続的に保存されることを確認しました。