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

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

はじめに

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

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

この実験では、まず PersistentVolume を作成し、それをシンプルなウェブアプリケーションからのデータ保存に使用します。次に、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

シンプルなウェブアプリケーションのデプロイ

このステップでは、ステップ 1 で作成した PersistentVolume にデータを保存する、シンプルなウェブアプリケーションをデプロイします。以下の内容で 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.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 に永続化されていることを確認します。コンテナで実行されているウェブアプリケーションにアクセスし、PersistentVolume にデータを書き込みます。

まず、次のコマンドを実行して、アプリケーションを実行しているポッドの名前を見つけます。

kubectl get pods -l app=web-app

アプリケーションを実行している単一のポッドが表示されるはずです。ポッドの名前を控えておきます。

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

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

pod-name を先ほど控えたポッド名に置き換えてください。

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

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

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

次のコマンドでウェブアプリケーションを削除します。

kubectl delete deployment web-app

次のコマンドでウェブアプリケーションを再作成します。

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 を先ほど控えたポッド名に置き換えてください。

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

このステップでは、PersistentVolume から特定のストレージリソースを要求するように PVC を変更します。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 storage modification example

更新した PersistentVolumeClaim を次のコマンドでクラスターに適用します。

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

まとめ

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