6. PersistentVolume と StatefulSet の使用
このラボでは Kubernetes の Volume や StatefulSet について学習します。
テキストを参照しながら各問題にチャレンジしてください。
必要があればウェブで調べても構いません。
ステップ 1: 問題 1/13
/root/manifests/pod-emptydir.yaml を用意しました。
このマニフェスト ファイルに必要な項目を追加して、以下の設定で Volume をマウントした Pod を作成してください。
- Pod 名:
pod-emptydir - イメージ:
nginx - Volume タイプ:
EmptyDir - Volume 名:
cache-volume - マウントパス:
/cache
Solution
/root/manifests/pod-emptydir.yaml を以下のように更新します。
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
spec:
containers:
- name: nginx-container
image: nginx
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
kubectl apply -f /root/manifests/pod-emptydir.yaml を実行して Pod を作成します。
ステップ 2: 問題 2/13
この環境に StorageClass はいくつ存在しますか。
- 0
- 1
- 2
- 3
Hints
kubectl get storageclasses コマンドを使用します。
短縮名を使用して kubectl get sc と書くこともできます。
Answer
1
ステップ 3: 問題 3/13
StorageClass local-path の volumeBindingMode は何ですか。
- Immediate
- WaitForFirstConsumer
- Manual
- WaitForFirstCreator
Hints
kubectl get sc コマンドまたは kubectl describe sc コマンドを使用します。
Solution
kubectl get sc コマンドを実行して VOLUMEBINDINGMODE 列を確認します。
Answer
WaitForFirstConsumer
ステップ 4: 問題 4/13
StorageClass local-path を指定して PersistentVolumeClaim を作成した場合の動作として正しいのはどれですか。
- PersistentVolumeClaim が作成されると同時に対応する PersistentVolume が作成されバインドされる。
- PersistentVolume は自動作成されず、手動で作成する必要がある。
- PersistentVolumeClaim を使用する Pod が作成される際に PersistentVolume が自動作成されバインドされる。
Hints
以下のドキュメントを参照してください。
https://kubernetes.io/ja/docs/concepts/storage/storage-classes/#%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%BC%E3%83%89
Answer
PersistentVolumeClaim が割り当てられた Pod が起動する際に PersistentVolume が自動作成されバインドされる。ステップ 5: 問題 5/13
/root/manifests/pvc-local-path.yaml を用意しました。
このマニフェストファイルに必要な項目を追加して、以下の設定で PersistentVolumeClaim を作成してください。
- PersistentVolumeClaim 名:
pvc-1 - storageClassName:
local-path - サイズ:
1Gi
Solution
/root/manifests/pvc-local-path.yaml を以下のように更新します。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-1
spec:
storageClassName: local-path
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
kubectl apply -f /root/manifests/pvc-local-path.yaml を実行して PersistentVolumeClaim を作成します。
ステップ 6: 問題 6/13
PersistentVolueClaim pvc-1 の STATUS はどうなっていますか。
- Bound
- Unbound
- Pending
- Failed
Hints
kubectl get pvc コマンドを使用します。
Solution
kubectl get pvc を実行して STATUS 列を確認します。
Answer
Pending
この PersistentVolumeClaim を使用した Pod が作成されるまで PersistentVolume の作成が Pending 状態で待機されます。
ステップ 7: 問題 7/13
いま作成した pvc-1 を使用して PersistentVolume を利用する Pod を作成します。
/root/manifests/pod-pv.yaml を用意しました。
このマニフェスト ファイルに必要な項目を追加して、PersistentVolume をマウントした Pod を作成してください。
- Pod 名:
pod-pv - イメージ:
nginx - 使用する PersistentVolume:
pvc-1 - Volume 名:
data-volume - マウントパス:
/var/www/html
Solution
apiVersion: v1
kind: Pod
metadata:
name: pod-pv
spec:
containers:
- name: frontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: data-volume
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: pvc-1
ステップ 8: 問題 8/13
PersistentVolueClaim pvc-1 の STATUS はどうなっていますか。
- Bound
- Unbound
- Pending
- Failed
Hints
kubectl get pvc コマンドを使用します。
Solution
kubectl get pvc を実行して STATUS 列を確認します。
Answer
Bound
この PersistentVolumeClaim を使用した Pod が作成された際に PersistentVolume が作成され、PersistentVolumeClaim にバインドされました。
ステップ 9: 問題 9/13
/root/manifests/statefulset-nginx.yaml を用意しました。
このマニフェスト ファイルに必要な項目を追加して、以下の設定で StatefulSet を作成してください。
- StatefulSet 名:
nginx - イメージ:
nginx:latest - レプリカ数:
3 - マウントパス:
/data - StorageClass:
local-path - ストレージサイズ:
50Mi
Solution
/root/manifests/statefulset-nginx.yaml を以下の内容に更新します。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: backend
serviceName: nginx-h
replicas: 3
template:
metadata:
labels:
app: backend
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 8080
name: nginx
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: local-path
resources:
requests:
storage: 50Mi
kubectl apply -f /root/manifests/statefulset-nginx.yaml を実行します。
ステップ 10: 問題 10/13
StatefulSet nginx に管理されている Pod は以下のどれですか。
- nginx-1, nginx-2, nginx-3
- nginx-0, nginx-1, nginx-2
- nginx-a, nginx-b, nginx-c
- nginx-<ランダムな文字列>
Solution
kubectl get pods を実行して StatefulSet nginx の現在の Pod を確認します。
Answer
nginx-0, nginx-1, nginx-2
ステップ 11: 問題 11/13
StatefulSet nginx の Pod である nginx-2 の /data/mydata.txt に my_data という文字列を保存してください。
Hints
kubectl exec コマンドを使用します。
https://cloud.google.com/migrate/containers/docs/troubleshooting/executing-shell-commands?hl=ja
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_exec/
Solution
kubectl exec -it nginx-2 -- bash -c "echo my_data > /data/mydata.txt" を実行します。kubectl exec -it nginx-2 -- cat /data/mydata.txt を実行して、ファイルに my_data が書き込まれたことを確認します。
ステップ 12: 問題 12/13
StatefulSet nginx の Pod である nginx-2 を削除してください。
削除を実行した後の StatefulSet nginx Pod はどれですか。
- nginx-1, nginx-3
- nginx-0, nginx-1
- nginx-0, nginx-1, nginx-2
- nginx-0, nginx-1, nginx-3
Solution
kubectl delete pod nginx-2 を実行して Pod nginx-2 を削除します。kubectl get pods を実行して StatefulSet nginx の現在の Pod を確認します。
Answer
nginx-0, nginx-1, nginx-2
レプリカ数を維持するように StatefulSet によって Pod
nginx-2が再作成されました。
ステップ 13: 問題 13/13
Pod nginx-2 の /data/mydata.txt 内容を表示して確認してください。
ファイルの内容は以下のどれですか。
- ファイルの内容は空
- ファイルが存在しない
- my_data
- my_datamy_data
Hints
kubectl exec コマンドを使用して Pod 内で cat コマンドを実行できます。
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_exec/
Solution
kubectl exec -it nginx-2 -- cat /data/mydata.txt を実行します。
Answer
my_data
削除前と同じ PersistentVolume が Pod
nginx-2に関連付けられているためデータの利用を継続できます。
完了
チャレンジ完了!
お疲れ様でした!