はじめに
この実験では、Kubernetes の PersistentVolumes(PV)を使用してアプリケーションデータを保存する方法を学びます。
PersistentVolume(PV)は、クラスター内のネットワークストレージの一部を表す Kubernetes リソースです。これらを使用することで、コンテナのライフサイクルとは独立した形でアプリケーションデータを保存できます。つまり、コンテナが終了したり別のノードに移動したりした場合でも、データは保持されます。
この実験では、まず PersistentVolume を作成し、それをシンプルなウェブアプリケーションからのデータ保存に使用します。次に、PersistentVolumeClaim(PVC)を使用して PersistentVolume にアクセスするようにアプリケーションを変更します。最後に、特定のストレージリソースを要求するように PVC を変更します。
Minikube クラスターの起動
リソースを作成する前に、実行中の Kubernetes クラスターが必要です。Minikube は、ローカルマシン上で実行できる軽量な Kubernetes 環境です。
作業ディレクトリへの移動:
ターミナルを開き、デフォルトのプロジェクトフォルダーに移動します。
cd /home/labex/projectMinikube の起動:
Minikube を起動して Kubernetes クラスターを初期化します。
minikube start- このコマンドにより、ローカルマシン上にシングルノードの Kubernetes クラスターがセットアップされます。
- お使いのシステムのパフォーマンスによっては、Minikube の起動に数分かかることがあります。
Minikube の稼働確認:
Minikube クラスターの状態を確認します。
minikube statuskubeletやapiserverなどのコンポーネントが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

更新した 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 に永続化されていることを確認しました。


