Kubernetes ハンズオン演習
ホーム
ホーム
  • 0. ラボの使い方
  • 1. kubectl コマンドを使ってみる
  • 2. マニフェストファイルによる Pod の操作
  • 3. Deployment
  • 4. Service によるアプリケーションの公開
  • 5. デプロイ戦略
  • 6. PersistentVolume と StatefulSet の使用

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 はいくつ存在しますか。

  1. 0
  2. 1
  3. 2
  4. 3
Hints

kubectl get storageclasses コマンドを使用します。
短縮名を使用して kubectl get sc と書くこともできます。

Answer

1

ステップ 3: 問題 3/13

StorageClass local-path の volumeBindingMode は何ですか。

  1. Immediate
  2. WaitForFirstConsumer
  3. Manual
  4. WaitForFirstCreator
Hints

kubectl get sc コマンドまたは kubectl describe sc コマンドを使用します。

Solution

kubectl get sc コマンドを実行して VOLUMEBINDINGMODE 列を確認します。

Answer

WaitForFirstConsumer

ステップ 4: 問題 4/13

StorageClass local-path を指定して PersistentVolumeClaim を作成した場合の動作として正しいのはどれですか。

  1. PersistentVolumeClaim が作成されると同時に対応する PersistentVolume が作成されバインドされる。
  2. PersistentVolume は自動作成されず、手動で作成する必要がある。
  3. 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 はどうなっていますか。

  1. Bound
  2. Unbound
  3. Pending
  4. 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 はどうなっていますか。

  1. Bound
  2. Unbound
  3. Pending
  4. 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 は以下のどれですか。

  1. nginx-1, nginx-2, nginx-3
  2. nginx-0, nginx-1, nginx-2
  3. nginx-a, nginx-b, nginx-c
  4. 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 はどれですか。

  1. nginx-1, nginx-3
  2. nginx-0, nginx-1
  3. nginx-0, nginx-1, nginx-2
  4. 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 内容を表示して確認してください。
ファイルの内容は以下のどれですか。

  1. ファイルの内容は空
  2. ファイルが存在しない
  3. my_data
  4. 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 に関連付けられているためデータの利用を継続できます。

完了


チャレンジ完了!

お疲れ様でした!

Prev
5. デプロイ戦略