永続ボリュームを使ったアプリケーション データの保存

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

はじめに

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

PersistentVolumes (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 を使用して環境をリセットします。

永続ボリュームを作成する

このステップでは、データを保存するために使用できる永続ボリュームを作成します。以下の内容を持つ 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 の永続ボリュームを作成します。hostPath フィールドは、データがホスト マシンの /mnt/data のパスに保存されることを指定します。persistentVolumeReclaimPolicy フィールドは Retain に設定されており、これは永続ボリュームが削除された場合でもデータが保持されることを意味します。

以下のコマンドで永続ボリュームをクラスタに適用します。

kubectl apply -f pv.yaml

簡単な Web アプリケーションをデプロイする

このステップでは、ステップ 1 で作成した永続ボリュームにデータを保存する簡単な 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 のパスで永続ボリュームをマウントすることを指定します。volumes フィールドは、コンテナが my-pvc と呼ばれる永続ボリュームクレームを使用することを指定します。

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

kubectl apply -f web-app.yaml

永続ボリュームクレームを作成する

このステップでは、ステップ 1 で作成した永続ボリュームからストレージを要求するために使用される永続ボリュームクレームを作成します。以下の内容を持つ pvc.yaml という YAML ファイルを作成します。

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

このファイルは、ReadWriteOnce のアクセスモードと永続ボリュームからの 500Mi のストレージ要求を持つ永続ボリュームクレームを作成します。

以下のコマンドで永続ボリュームクレームをクラスタに適用します。

kubectl apply -f pvc.yaml

データの永続性を検証する

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

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

kubectl get pods -l app=web-app

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

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

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

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 を変更して、永続ボリュームから特定のストレージ リソースを要求します。500Mi ではなく 1Gi のストレージを要求するように、pvc.yaml ファイルを変更します。

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

以下のコマンドで更新された永続ボリュームクレームをクラスタに適用します。

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

まとめ

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