概要
このラボでは、PersistentVolume と PersistentVolumeClaim を設定します。PersistentVolume は、Kubernetes クラスタで利用可能なストレージです。PersistentVolumeClaim は、Pod が PersistentVolume にアクセスできるようにします。PersistentVolumeClaim を使用しないと Pod はほとんどの場合に一時的なものになるため、Pod のスケーリング、更新、移行が行われてもデータが維持されるようにするには PersistentVolumeClaim を使用する必要があります。
目標
このラボでは、次のタスクについて学びます。
- (動的に作成される、または既存の)Google Cloud 永続ディスク用 PersistentVolume(PV)および PersistentVolumeClaim(PVC)のマニフェストを作成する
- Google Cloud 永続ディスク PVC をボリュームとして Pod にマウントする
- マニフェストを使用して StatefulSet を作成する
- Google Cloud 永続ディスク PVC をボリュームとして StatefulSet にマウントする
- Pod を停止して再起動した後に、StatefulSet 内の Pod が特定の PV に接続されていることを確認する
ラボの設定
ラボにアクセスする
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。
左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] パネルでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] パネルでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

-
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
出力:
Credentialed accounts:
- @.com (active)
出力例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project =
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注:
gcloud ドキュメントの全文については、
gcloud CLI の概要ガイド
をご覧ください。
タスク 1. PV と PVC を作成する
このタスクでは、PVC を作成します。これにより、Kubernetes で自動的に PV が作成されます。
ラボの GKE クラスタに接続する
- Cloud Shell で次のコマンドを入力して、ゾーンとクラスタ名の環境変数を設定します。
export my_region={{{project_0.default_region|Region}}}
export my_cluster=autopilot-cluster-1
- kubectl コマンドライン ツールのタブ補完を構成します。
source <(kubectl completion bash)
- kubectl がクラスタにアクセスできるよう構成します。
gcloud container clusters get-credentials $my_cluster --region $my_region
PVC でマニフェストを作成して適用する
ほとんどの場合、PV オブジェクトを直接構成したり、Compute Engine の永続ディスクを作成したりする必要はありません。代わりに PVC を作成することで、Kubernetes で自動的に永続ディスクをプロビジョニングできます。
hello-web-disk
という名前の 30 GB の PVC を作成します。この PVC は、読み書き可能なボリュームとして一度に 1 つのノードにマウントできます。
-
pvc-demo.yaml
というファイルを作成し、次のコマンドを実行して nano で開きます。
nano pvc-demo.yaml
- nano が開いたら、以下を
pvc-demo.yaml
ファイルに貼り付けます。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hello-web-disk
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
-
Ctrl+O キーの次に Enter キーを押し、編集したファイルを保存します。
-
Ctrl+X キーを押して nano テキスト エディタを終了します。
-
現時点で PVC が存在しないことを確認するには、次のコマンドを実行します。
kubectl get persistentvolumeclaim
出力:
No resources found in default namespace.
- PVC を作成するには、次のコマンドを実行します。
kubectl apply -f pvc-demo.yaml
- 新たに作成された PVC を表示するには、次のコマンドを実行します。
kubectl get persistentvolumeclaim
出力の一部:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
hello-web-disk Pending standard-rwo unset 15s
注: 次のステップが完了するまでステータスは保留(Pending)のままになります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
PV と PVC を作成する
タスク 2. Google Cloud 永続ディスク PVC を Pod にマウントして確認する
このタスクでは永続ディスク PVC を Pod に接続し、マニフェストの一部として、その PVC をボリュームとして Pod にマウントします。
PVC を Pod にマウントする
マニフェスト ファイル pod-volume-demo.yaml
を作成して nginx コンテナをデプロイし、pvc-demo-volume
を Pod に接続して、そのボリュームを nginx コンテナ内のパス /var/www/html
にマウントします。このコンテナ内のディレクトリに保存されたファイルは永続ボリュームに保存され、Pod とコンテナがシャットダウンされて再作成された場合でも保持されます。
-
pod-volume-demo.yaml
というファイルを作成し、次のコマンドを実行して nano で開きます。
nano pod-volume-demo.yaml
- nano が開いたら、以下を
pod-volume-demo.yaml
ファイルに貼り付けます。
kind: Pod
apiVersion: v1
metadata:
name: pvc-demo-pod
spec:
containers:
- name: frontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: pvc-demo-volume
volumes:
- name: pvc-demo-volume
persistentVolumeClaim:
claimName: hello-web-disk
-
Ctrl+O キーの次に Enter キーを押し、編集したファイルを保存します。
-
Ctrl+X キーを押して nano テキスト エディタを終了します。
-
ボリュームがマウントされた Pod を作成するには、次のコマンドを実行します。
kubectl apply -f pod-volume-demo.yaml
- クラスタ内の Pod を一覧表示します。
kubectl get pods
出力:
NAME READY STATUS RESTARTS AGE
pvc-demo-pod 0/1 ContainerCreating 0 18s
Pod の作成後すぐに一覧表示を行うと、ボリュームがマウントされている間のステータスは「ContainerCreating」と表示され、その後「Running」に変わります。
- PVC が Pod 内でアクセス可能であることを確認するには、Pod へのシェルアクセスを取得する必要があります。シェル セッションを開始するには、次のコマンドを実行します。
kubectl exec -it pvc-demo-pod -- sh
- Pod でシンプルなテキスト メッセージをウェブページとして作成するには、次のコマンドを入力します。
echo Test webpage in a persistent volume!>/var/www/html/index.html
chmod +x /var/www/html/index.html
- テキスト ファイルにメッセージが含まれていることを確認します。
cat /var/www/html/index.html
出力:
Test webpage in a persistent volume!
- 次のコマンドを入力して、nginx コンテナの対話型シェルを終了します。
exit
PV の永続性をテストする
クラスタから Pod を削除し、PV がまだ存在することを確認してから、Pod を再デプロイして PV の内容が変更されていないことを確認します。
- pvc-demo-pod を削除します。
kubectl delete pod pvc-demo-pod
- クラスタ内の Pod を一覧表示します。
kubectl get pods
出力:
No resources found in default namespace.
クラスタに Pod がなくなっているはずです。
- PVC を表示するには、次のコマンドを実行します。
kubectl get persistentvolumeclaim
出力の一部:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
hello-web-disk Bound pvc-8...34 30Gi RWO standard-rwo unset 22m
PVC はまだ存在しており、Pod が削除された時点で削除されませんでした。
- pvc-demo-pod を再デプロイします。
kubectl apply -f pod-volume-demo.yaml
- クラスタ内の Pod を一覧表示します。
kubectl get pods
出力:
NAME READY STATUS RESTARTS AGE
pvc-demo-pod 1/1 Running 0 15s
PV はすでに存在しており作成する必要がないため、今回は Pod がデプロイされるとすぐにステータスが「Running」に変わります。
- PVC が Pod 内で引き続きアクセス可能であることを確認するには、Pod へのシェルアクセスを取得する必要があります。シェル セッションを開始するには、次のコマンドを実行します。
kubectl exec -it pvc-demo-pod -- sh
- テキスト ファイルにまだメッセージが含まれていることを確認するには、次のコマンドを実行します。
cat /var/www/html/index.html
出力:
Test webpage in a persistent volume!
Pod をクラスタから削除して再作成しても、永続ボリュームの内容は削除されませんでした。
- 次のコマンドを入力して、nginx コンテナの対話型シェルを終了します。
exit
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Google Cloud 永続ディスク PVC を Pod にマウントして確認する
タスク 3. PVC で StatefulSet を作成する
このタスクでは、StatefulSet で PVC を使用します。StatefulSet は、Pod に一意の識別子が付与されるという点を除いて Deployment と似ています。
PVC を解放する
- StatefulSet で PVC を使用するには、現時点でその PVC を使用している Pod を削除する必要があります。次のコマンドを実行して Pod を削除します。
kubectl delete pod pvc-demo-pod
- Pod が削除されたことを確認します。
kubectl get pods
出力:
No resources found in default namespace.
StatefulSet を作成する
マニフェスト ファイル statefulset-demo.yaml
を作成します。これによって、LoadBalancer サービス、nginx コンテナを含む Pod の 3 つのレプリカ、hello-web-disk
という名前の 30 GB PVC 用の volumeClaimTemplate を含む StatefulSet が作成されます。nginx コンテナは、前のタスクと同様に、hello-web-disk
という名前の PVC を /var/www/html
にマウントします。
-
statefulset-demo.yaml
というファイルを作成し、次のコマンドを実行して nano で開きます。
nano statefulset-demo.yaml
- nano が開いたら、以下を
statefulset-demo.yaml
ファイルに貼り付けます。
kind: Service
apiVersion: v1
metadata:
name: statefulset-demo-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-demo
spec:
selector:
matchLabels:
app: MyApp
serviceName: statefulset-demo-service
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: MyApp
spec:
containers:
- name: stateful-set-container
image: nginx
ports:
- containerPort: 80
name: http
volumeMounts:
- name: hello-web-disk
mountPath: "/var/www/html"
volumeClaimTemplates:
- metadata:
name: hello-web-disk
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 30Gi
-
Ctrl+O キーの次に Enter キーを押し、編集したファイルを保存します。
-
Ctrl+X キーを押して nano テキスト エディタを終了します。
- ボリュームを持つ StatefulSet を作成するには、次のコマンドを実行します。
kubectl apply -f statefulset-demo.yaml
出力:
service "statefulset-demo-service" created
statefulset.apps "statefulset-demo" created
これで、statefulset-demo-service
という名前の Service の背後で StatefulSet が実行されるようになりました。
StatefulSet で Pod の接続を確認する
- StatefulSet の詳細を表示するには、以下のように「kubectl describe」を使用します。
kubectl describe statefulset statefulset-demo
出力の末尾に示されているイベント ステータスに注目すると、Service と StatefulSet が正常に作成されているのがわかります。
Normal SuccessfulCreate 10s statefulset-controller
Message: create Claim hello-web-disk-statefulset-demo-0 Pod statefulset-demo-0 in StatefulSet statefulset-demo success
Normal SuccessfulCreate 10s statefulset-controller
Message: create Pod statefulset-demo-0 in StatefulSet statefulset-demo successful
- クラスタ内の Pod を一覧表示します。
kubectl get pods
出力:
NAME READY STATUS RESTARTS AGE
statefulset-demo-0 1/1 Running 0 6m
statefulset-demo-1 1/1 Running 0 3m
statefulset-demo-2 1/1 Running 0 2m
- PVC を一覧表示するには、次のコマンドを実行します。
kubectl get pvc
出力:
NAME STATUS VOLUME CAPACITY ACCESS
hello-web-disk Bound pvc-86117ea6-...34 30Gi RWO
hello-web-disk-st...-demo-0 Bound pvc-92d21d0f-...34 30Gi RWO
hello-web-disk-st...-demo-1 Bound pvc-9bc84d92-...34 30Gi RWO
hello-web-disk-st...-demo-2 Bound pvc-a526ecdf-...34 30Gi RWO
元の hello-web-disk がまだ存在しており、新しい StatefulSet の Pod 内で各 Pod 用に作成された個別の PVC を確認できます。
- StatefulSet の最初の PVC の詳細を表示するには、「kubectl describe」を使用します。
kubectl describe pvc hello-web-disk-statefulset-demo-0
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
PVC で StatefulSet を作成する
タスク 4. StatefulSet によって管理される Pod への永続ボリュームの接続性を確認する
このタスクでは、Pod を停止して再起動した後に、StatefulSet 内の Pod が特定の PV に接続されていることを確認します。
- PVC が Pod 内でアクセス可能であることを確認するには、Pod へのシェルアクセスを取得する必要があります。シェル セッションを開始するには、次のコマンドを実行します。
kubectl exec -it statefulset-demo-0 -- sh
-
/var/www/html
ディレクトリに index.html
テキスト ファイルが存在しないことを確認します。
cat /var/www/html/index.html
- Pod でシンプルなテキスト メッセージをウェブページとして作成するには、次のコマンドを入力します。
echo Test webpage in a persistent volume!>/var/www/html/index.html
chmod +x /var/www/html/index.html
- テキスト ファイルにメッセージが含まれていることを確認します。
cat /var/www/html/index.html
出力:
Test webpage in a persistent volume!
- 次のコマンドを入力して、nginx コンテナの対話型シェルを終了します。
exit
- PVC 上で、ファイルを更新した Pod を削除します。
kubectl delete pod statefulset-demo-0
- クラスタ内の Pod を一覧表示します。
kubectl get pods
StatefulSet が statefulset-demo-0
Pod を自動的に再起動していることがわかります。
注: Pod のステータスが再び実行中として表示されるまで待つ必要があります。
- 新しい
statefulset-demo-0
Pod でシェルに接続します。
kubectl exec -it statefulset-demo-0 -- sh
- テキスト ファイルにまだメッセージが含まれていることを確認します。
cat /var/www/html/index.html
出力:
Test webpage in a persistent volume!
StatefulSet が Pod を再起動し、既存の専用 PVC を新しい Pod に再接続するため、その Pod のデータは確実に保持されます。
- 次のコマンドを入力して、nginx コンテナの対話型シェルを終了します。
exit
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。