コンテナーがダウンした場合、ステートフルサービスはデータ損失またはデータの信頼性が損なわれるリスクがあります。永続ストレージは、この問題を防止します。このトピックでは、動的にプロビジョニングされたクラウドディスクを使用して永続ストレージを提供する方法について説明します。
背景情報
動的にプロビジョニングされたクラウドディスクのユースケース:
クラウドディスクがない場合、アプリケーションをデプロイするとシステムが自動的にプロビジョニングします。
動的にプロビジョニングされたクラウドディスクを使用するには:
永続ボリューム要求 (PVC) を手動で作成し、PVC 内で StorageClass を宣言します。
アプリケーションをデプロイします。その後、システムは StorageClass に基づいて永続ボリューム (PV) を自動的に作成します。
前提条件
ACK マネージドクラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
kubectl を使用して Kubernetes クラスターに接続されていること。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
Provisioner プラグインがクラスターにインストールされていることを確認します。このプラグインは、StorageClass に基づいてクラウドディスクを自動的に作成します。
Provisioner プラグイン
Container Service for Kubernetes (ACK) は、クラスターを作成する際に Provisioner プラグインを自動的にインストールします。
StorageClass の作成
Alibaba Cloud Container Service for Kubernetes (ACK) は、システム初期化中に4つのデフォルト StorageClass を作成します。これらの StorageClass はデフォルトのパラメーターを使用し、シングルゾーンクラスターにのみ適用されます。マルチゾーンクラスターの場合、独自の StorageClass を作成する必要があります。4つのデフォルト StorageClass は次のとおりです。
alicloud-disk-common: 基本ディスクを自動的に作成します。
alicloud-disk-efficiency: Ultra ディスクを自動的に作成します。
alicloud-disk-ssd: 標準 SSD を自動的に作成します。
alicloud-disk-available: これは高可用性 (HA) オプションです。まず標準 SSD の作成を試行します。ゾーン内の標準 SSD リソースが枯渇している場合、Ultra ディスクの作成を試行します。
storageclass.yaml ファイルを作成します。
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: alicloud-disk-ssd-hangzhou-b provisioner: alicloud/disk reclaimPolicy: Retain parameters: type: cloud_ssd regionId: cn-hangzhou zoneId: cn-hangzhou-b fstype: "ext4" readonly: "false"パラメーター
説明
provisionerprovisioner プラグインを使用して Alibaba Cloud ディスクを自動的に作成するには、`alicloud/disk` に設定します。
reclaimPolicyディスクの reclaimPolicy は、Delete と Retain をサポートしており、デフォルトは Delete です。
説明Delete に設定されている場合、PVC を削除するとディスクも削除され、ディスク上のデータは回復できません。
type自動的に作成されるクラウドディスクのタイプで、cloud、cloud_efficiency、cloud_ssd、available をサポートします。
regionId(オプション) クラウドディスクが自動的に作成されるリージョン ID。これはクラスターのリージョンと同じである必要があります。
zoneId(オプション) クラウドディスクが自動的に作成されるゾーン ID。
シングルゾーンクラスターの場合、クラスターと同じゾーンを使用します。
マルチゾーンクラスターの場合、次のように複数の `zoneId` 値を設定します。
zoneid: cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c
fstype(オプション) クラウドディスクの自動作成に使用されるファイルシステムで、デフォルトは ext4 です。
readonly(オプション) 自動的に作成されるクラウドディスクが読み取り専用権限でマウントされるかどうか。有効な値: true — クラウドディスクは読み取り専用権限を持ちます。false — クラウドディスクは読み書き権限を持ちます。デフォルト値: false。
encrypted(オプション) 自動的に作成されるディスクを暗号化するかどうか。true: 暗号化されます。false: 暗号化されません。デフォルトは false です。
次のコマンドを実行して StorageClass を作成します。
kubectl create -f storageclass.yaml
PVC の作成
pvc-ssd.yaml ファイルを作成します。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: disk-ssd spec: accessModes: - ReadWriteOnce storageClassName: alicloud-disk-ssd-hangzhou-b resources: requests: storage: 20Gi次のコマンドを実行して PVC を作成します。
kubectl create -f pvc-ssd.yaml
クラスターページで、左側のナビゲーションウィンドウの をクリックします。作成された PVC と、それにバインドされている永続ボリューム (PV) を表示できます。PVC の StorageClass は alicloud-disk-ssd-hangzhou-b です。
アプリケーションの作成
pvc-dynamic.yaml ファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-dynamic labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: disk-pvc mountPath: "/data" volumes: - name: disk-pvc persistentVolumeClaim: claimName: disk-ssd次のコマンドを実行してデプロイメントを作成します。
kubectl create -f nginx-dynamic.yaml
クラスターページで、左側のナビゲーションウィンドウの をクリックします。その後、作成したデプロイメントを表示します。
動的にプロビジョニングされたクラウドディスクの永続ストレージ
次のコマンドを実行して、デプロイメントの Pod の名前を表示します。
kubectl get pod | grep dynamic期待される出力:
nginx-dynamic-5c74594ccb-zl9pf 2/2 Running 0 3m次のコマンドを実行して、新しいクラウドディスクが /data パスにマウントされているかどうかを確認します。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- df | grep data期待される出力:
/dev/vdh 20511312 45080 20449848 1% /data次のコマンドを実行して、/data パス内のファイルを表示します。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- ls /data期待される出力:
lost+found次のコマンドを実行して、/data パスに dynamic ファイルを作成します。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- touch /data/dynamic次のコマンドを実行して、/data パス内のファイルを表示します。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- ls /data期待される出力:
dynamic lost+found次のコマンドを実行して、
nginx-dynamic-5c74594ccb-zl9pfという名前の Pod を削除します。kubectl delete pod nginx-dynamic-5c74594ccb-zl9pf期待される出力:
pod "nginx-dynamic-5c74594ccb-zl9pf" deleted別のターミナルウィンドウで、次のコマンドを実行して Pod の削除および再作成プロセスを監視します。
kubectl get pod -w -l app=nginx期待される出力:
NAME READY STATUS RESTARTS AGE nginx-dynamic-5c74594ccb-zl9pf 2/2 Running 0 6m48s nginx-dynamic-5c74594ccb-zl9pf 2/2 Terminating 0 7m32s nginx-dynamic-5c74594ccb-45sd4 0/2 Pending 0 0s nginx-dynamic-5c74594ccb-45sd4 0/2 Pending 0 0s nginx-dynamic-5c74594ccb-45sd4 0/2 Init:0/1 0 0s nginx-dynamic-5c74594ccb-zl9pf 0/2 Terminating 0 7m32s nginx-dynamic-5c74594ccb-zl9pf 0/2 Terminating 0 7m33s nginx-dynamic-5c74594ccb-zl9pf 0/2 Terminating 0 7m33s nginx-dynamic-5c74594ccb-45sd4 0/2 PodInitializing 0 5s nginx-dynamic-5c74594ccb-45sd4 2/2 Running 0 22s次のコマンドを実行して、再作成された Pod の名前を表示します。
kubectl get pod期待される出力:
NAME READY STATUS RESTARTS AGE nginx-dynamic-5c74594ccb-45sd4 2/2 Running 0 2m次のコマンドを実行して、/data パス内のファイルを表示します。作成した dynamic ファイルは削除されていません。これは、動的にプロビジョニングされたクラウドディスク上のデータが永続的であることを示しています。
kubectl exec nginx-dynamic-5c74594ccb-45sd4 -- ls /data期待される出力:
dynamic lost+found