実行中のコンテナをホストするノードに障害が発生すると、ステートフルアプリケーションはコンテナに格納されているビジネスデータを失う可能性があります。 この問題は、永続ストレージを使用して解決できます。 このトピックでは、静的にプロビジョニングされたディスクボリュームを使用してデータを永続化する方法について説明します。
前提条件
開始する前に、次の操作を実行していることを確認してください。
背景情報
シナリオ
高いディスクI/Oを必要とし、データ共有を必要としないアプリケーションにストレージスペースを提供します。 たとえば、MySQLやRedisなどのストレージサービスです。
ログデータを高速に書き込みます。
ポッドの有効期間に依存しない方法でデータを保存します。
ディスクボリュームを静的にプロビジョニングする前に、ディスクを作成する必要があります。
静的にプロビジョニングされたディスクボリュームを使用するには、永続ボリューム (PV) と永続ボリューム要求 (PVC) を手動で作成する必要があります。 詳細については、「静的にプロビジョニングされたディスクボリュームのマウント」をご参照ください。
制限事項
Alibaba Cloudが提供するディスクは共有できません。 各ディスクは1つのポッドにのみマウントできます。
ディスクは、ディスクと同じゾーンに配置されているノードにのみマウントできます。
PV の作成
pv-static.yamlという名前のファイルを作成します。
apiVersion: v1 kind: PersistentVolume metadata: name: <your-disk-id> labels: alicloud-pvname: <your-disk-id> failure-domain.beta.kubernetes.io/zone: <your-zone> failure-domain.beta.kubernetes.io/region: <your-region> spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce flexVolume: driver: "alicloud/disk" fsType: "ext4" options: volumeId: "<your-disk-id>"
説明alicloud-pvname: <your-disk-id>
: PVの名前。 値をディスクIDに設定します。failure-domain.beta.kubernetes.io/zone: <your-zone>
: ディスクがデプロイされているゾーン。 例: cn-hangzhou-bfailure-domain.beta.kubernetes.io /リージョン: <your-region>
: ディスクがデプロイされているリージョン。 例: cn-hangzhou
クラスターがゾーンにまたがってデプロイされている場合は、
failure-domain.beta.kubernetes.io /ゾーン
とfailure-domain.beta.kubernetes.io /リージョン
を指定する必要があります。 これにより、ディスクが展開されているゾーンにポッドがスケジュールされます。次のコマンドを実行してPVを作成します。
kubectl create -f pv-static.yaml
Verify the result
ACK コンソールにログインします。
左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。
詳細ページの左側のナビゲーションウィンドウで、
を選択します。 新しく作成されたPVが表示されることを確認します。
PVC の作成
pvc-static.yamlという名前のファイルを作成します。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-disk spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi selector: matchLabels: alicloud-pvname: <your-disk-id>
次のコマンドを実行してPVCを作成します。
kubectl create -f pvc-static.yaml
結果の表示
ACK コンソールにログインします。
左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。
詳細ページの左側のナビゲーションウィンドウで、
を選択します。[ボリュームクレームの永続性] ページで、新しく作成されたPVCが表示されていることを確認します。
アプリケーションの作成
static.yamlという名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-static 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: pvc-disk
次のコマンドを実行して、静的にプロビジョニングされたディスクボリュームを使用するアプリケーションをデプロイします。
kubectl create -f static.yaml
結果の表示
ACK コンソールにログインします。
左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。
詳細ページの左側のナビゲーションウィンドウで、
を選択します。[デプロイメント] ページで、新しく作成されたアプリケーションが表示されていることを確認します。
データ永続性の検証
次のコマンドを実行して、アプリケーションをホストするポッドを照会します。
kubectl get pod | grep static
期待される出力:
nginx-static-78c7dcb9d7-g**** 2/2 Running 0 32s
次のコマンドを実行して、新しいディスクが /dataパスにマウントされているかどうかを確認します。
kubectl exec nginx-static-78c7dcb9d7-g**** -- df | grep data
期待される出力:
/dev/vdf 20511312 45080 20449848 1% /data
次のコマンドを実行して、/dataパスのファイルを照会します。
kubectl exec nginx-static-78c7dcb9d7-g**** -- ls /data
期待される出力:
lost+found
次のコマンドを実行して、/dataパスにstaticという名前のファイルを作成します。
kubectl exec nginx-static-78c7dcb9d7-g**** -- touch /data/static
次のコマンドを実行して、/dataパスのファイルを照会します。
kubectl exec nginx-static-78c7dcb9d7-g**** -- ls /data
期待される出力:
static lost+found
次のコマンドを実行して、
nginx-static-78c7dcb9d7-g ****
という名前のポッドを削除します。kubectl delete pod nginx-static-78c7dcb9d7-g****
期待される出力:
pod "nginx-static-78c7dcb9d7-g****" deleted
別のkubectlコマンドラインインターフェイス (CLI) を開き、次のコマンドを実行して、ポッドの削除方法と再作成方法を表示します。
kubectl get pod -w -l app=nginx
期待される出力:
NAME READY STATUS RESTARTS AGE nginx-static-78c7dcb9d7-g**** 2/2 Running 0 50s nginx-static-78c7dcb9d7-g**** 2/2 Terminating 0 72s nginx-static-78c7dcb9d7-h**** 0/2 Pending 0 0s nginx-static-78c7dcb9d7-h**** 0/2 Pending 0 0s nginx-static-78c7dcb9d7-h**** 0/2 Init:0/1 0 0s nginx-static-78c7dcb9d7-g**** 0/2 Terminating 0 73s nginx-static-78c7dcb9d7-h**** 0/2 Init:0/1 0 5s nginx-static-78c7dcb9d7-g**** 0/2 Terminating 0 78s nginx-static-78c7dcb9d7-g**** 0/2 Terminating 0 78s nginx-static-78c7dcb9d7-h**** 0/2 PodInitializing 0 6s nginx-static-78c7dcb9d7-h**** 2/2 Running 0 8s
次のコマンドを実行して、再作成されたポッドを照会します。
kubectl get pod
期待される出力:
NAME READY STATUS RESTARTS AGE nginx-static-78c7dcb9d7-h**** 2/2 Running 0 14s
次のコマンドを実行して、静的ファイルが /dataパスにまだ存在することを確認します。 これは、データがディスクに永続化されることを示します。
kubectl exec nginx-static-78c7dcb9d7-h6brd -- ls /data
期待される出力:
static lost+found