[CKAD] 私のデータは大切だから!永続ボリューム(PV/PVC)と一時ボリューム(emptyDir)を徹底解説

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


📑 目次

  1. 概要:なぜボリュームが必要なのか? (Stateless vs Stateful)
  2. 一時ボリュームの代名詞:emptyDir
  3. 永続データの核心:PV(Persistent Volume)とPVC(Claim)
  4. 動的プロビジョニングの魔法:StorageClass
  5. CKAD実践ヒント:ボリューム設定時によくある間違い
  6. ハンズオン:実践演習問題

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実践ヒント:時間短縮とミス防止 ⏱️

試験でのボリューム問題は、設定する内容が多く、タイプミスしやすいです。

  1. 両方に記述する: spec.volumesでボリュームを定義し、必ずコンテナ内のspec.containers.volumeMountsで接続する必要があります。どちらか一つでも欠けていると、PodはContainerCreatingから先に進みません。
  2. AccessModeの一致: PVとPVCのaccessModesが互いに一致している必要があります。そうでないとバインディング(Binding)されません。
  3. 迅速なYAML生成: ボリューム設定はコマンドだけで全て行うのは難しいです。基本的なPodのYAMLを抽出し、ボリューム部分だけを直接入力してください。

5. ハンズオン:実践演習問題 🛠️

シナリオ:

  1. safedata-pvcという名前のPVCを作成してください。(容量:1Gi、モード:ReadWriteOnce、StorageClass:standard)
  2. nginxイメージを使用し、data-appという名前のPodを作成してください。
  3. 作成した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合格と実務能力向上に大いに役立つことを願っています!🌟


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です