こんにちは!今日は、Kubernetesアプリケーション開発者なら必ず乗り越えるべき山、ボリューム(Volume)について学びましょう。KubernetesのPodは、いつでも死んで再起動できる「一時的な」存在です。では、その中に保存されたデータはどうなるのでしょうか?Podが死んでもデータを救う方法、そして一時的に使って捨てるデータを効率的に管理する方法を15分でマスターしましょう!

📑 目次
- 概要:なぜボリュームが必要なのか? (Stateless vs Stateful)
- 一時ボリュームの代名詞:emptyDir
- 永続データの核心:PV(Persistent Volume)とPVC(Claim)
- 動的プロビジョニングの魔法:StorageClass
- CKAD実践ヒント:ボリューム設定時によくある間違い
- ハンズオン:実践演習問題
0. 概要:なぜボリュームが必要なのか? 🤔
Kubernetes Pod内のコンテナは、基本的に**揮発性(Ephemeral)**です。コンテナがクラッシュして再起動されると、実行中に生成されたすべてのファイルは消滅します。
- 一時ボリューム: Podが実行されている間だけデータが保持されればよい場合(例:キャッシュ、スクラッチスペース)。Podが削除されるとデータも一緒に削除されます。
- 永続ボリューム: Podが削除されてもデータがクラスター外部(クラウドストレージ、NFSなど)に安全に保管される必要がある場合(例:データベース、ユーザーアップロードファイル)。
1. 一時ボリュームの代名詞:emptyDir 🧹
emptyDirは、Podがノードに割り当てられたときに初めて作成され、そのPodがそのノードで実行されている間だけ存在します。
- 特徴: Pod内のすべてのコンテナが共有できます。あるコンテナが書き込み、別のコンテナが読み込む「サイドカー」パターンでよく使われます。
- 注意: Podがノードから削除されると、emptyDirのデータも永久に削除されます。
💡 emptyDir YAML例
apiVersion: v1
kind: Pod
metadata:
name: sidecar-pod
spec:
containers:
- name: main-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: helper-container
image: busybox
command: ["/bin/sh", "-c", "while true; do date >> /data/index.html; sleep 5; done"]
volumeMounts:
- name: shared-data
mountPath: /data
volumes:
- name: shared-data
emptyDir: {} # ここに設定!
2. 永続データの核心:PVとPVC 💾
大企業環境や運用環境では、データ保存が必須です。このため、KubernetesはPV(Persistent Volume)とPVC(Persistent Volume Claim)という2つのリソースを使用します。
- PV (Persistent Volume): 実際のストレージスペース(SSD、NFSなど)を定義します。インフラ管理者が事前に準備しておく「実際のパイプ」のようなものです。
- PVC (Persistent Volume Claim): 開発者が「このくらいの容量のストレージスペースが必要だ!」と要求する「注文書」です。
💡 核心パラメータ:AccessModes
- ReadWriteOnce (RWO): 1つのノードからのみ読み書き可能。
- ReadOnlyMany (ROX): 複数のノードから読み取りのみ可能。
- ReadWriteMany (RWX): 複数のノードから同時に読み書き可能(NFSなどでサポート)。
3. 動的プロビジョニングの魔法:StorageClass ✨
管理者が毎回PVを事前に作成するのは非効率です。そのため、実務(特に大企業やクラウド環境)ではStorageClassを使用します。
開発者がPVCに特定のstorageClassNameを記述して要求すると、Kubernetesがクラウドプロバイダー(AWS、GCP、Azureなど)に要求し、リアルタイムでPVを生成します。これを**動的プロビジョニング(Dynamic Provisioning)**と呼びます。
4. CKAD実践ヒント:時間短縮とミス防止 ⏱️
試験でのボリューム問題は、設定する内容が多く、タイプミスしやすいです。
- 両方に記述する: spec.volumesでボリュームを定義し、必ずコンテナ内のspec.containers.volumeMountsで接続する必要があります。どちらか一つでも欠けていると、PodはContainerCreatingから先に進みません。
- AccessModeの一致: PVとPVCのaccessModesが互いに一致している必要があります。そうでないとバインディング(Binding)されません。
- 迅速なYAML生成: ボリューム設定はコマンドだけで全て行うのは難しいです。基本的なPodのYAMLを抽出し、ボリューム部分だけを直接入力してください。
5. ハンズオン:実践演習問題 🛠️
シナリオ:
- safedata-pvcという名前のPVCを作成してください。(容量:1Gi、モード:ReadWriteOnce、StorageClass:standard)
- nginxイメージを使用し、data-appという名前のPodを作成してください。
- 作成したPVCをPodの/var/www/htmlパスにマウントしてください。
[解答ガイド]
# 1. PVCを作成 (pvc.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: safedata-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
---
# 2. Podを作成 (pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: data-app
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: storage-vol
mountPath: /var/www/html
volumes:
- name: storage-vol
persistentVolumeClaim:
claimName: safedata-pvc
まとめ 🏁
ボリュームは、Kubernetesアーキテクチャにおいて「インフラの複雑さを開発者から隠す」最も素晴らしい機能の一つです。emptyDirで効率的な協調Podを作成し、PV/PVCで安全なデータストレージを構築してみてください。
今日学んだ内容が、皆さんのCKAD合格と実務能力向上に大いに役立つことを願っています!🌟
コメントを残す