ノード障害発生時、ステートフルアプリケーションのコンテナーに保存されたデータが失われたり、信頼性が低下したりする可能性があります。データ損失を防ぐには、永続ストレージを使用します。このトピックでは、Object Storage Service (OSS) ボリュームを使用してデータを永続化する方法について説明します。
背景情報
Object Storage Service (OSS) は、Alibaba Cloud が提供する、セキュアで費用対効果が高く、大容量で信頼性の高いクラウドストレージサービスです。OSS バケットは、Container Service for Kubernetes (ACK) クラスター内の複数の Pod にマウントできます。
一般的なユースケースは次のとおりです。
ディスク I/O が低い場合。
構成ファイル、イメージ、ショートビデオファイルなどの共有ワークロード。
OSS の使用方法
OSS バケットを作成します。
AccessKey ID と AccessKey Secret を取得します。
Secret を使用して、永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。
前提条件
OSS コンソールで OSS バケットを作成済みであること。詳細については、「バケットの作成」をご参照ください。
注意事項
ACK クラスターをアップグレードすると、kubelet と ossfs ドライバーが再起動します。その結果、マウントされた OSS ディレクトリが利用できなくなります。この場合、OSS ボリュームを使用する Pod を再作成する必要があります。Pod の YAML ファイルにヘルスチェック設定を追加すると、OSS ディレクトリが利用できなくなったときに Kubernetes が自動的に Pod を再起動し、OSS ボリュームを再マウントします。
この問題は、最新バージョンを使用して OSS をマウントすることで解決されています。
PV の作成
次のコマンドを実行して Secret を作成します。
次のコマンド内の
<your AccessKey ID>および<your AccessKey Secret>を、Alibaba Cloud アカウントの実際の AccessKey ID および AccessKey Secret に置き換えます。Alibaba Cloud アカウントの AccessKey ペアを取得するには、ACK コンソールに移動し、
アイコン上にポインターを移動して、[AccessKey] をクリックします。kubectl create secret generic osssecret --from-literal=akId='<your AccessKey ID>' --from-literal=akSecret='<your AccessKey Secret>' --type=alicloud/oss -n defaultosssecret: Secret の名前。カスタム名を指定できます。akId: AccessKey ID。akSecret: AccessKey Secret。--type: Secret のタイプ。この例では、値はalicloud/ossに設定されています。Secret と Secret を使用する Pod は、同じ名前空間に属している必要があります。pv-oss.yaml ファイルを使用して PV を作成します。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-oss labels: alicloud-pvname: pv-oss spec: capacity: storage: 5Gi accessModes: - ReadWriteMany storageClassName: oss flexVolume: driver: "alicloud/oss" secretRef: name: "osssecret" # Replace with the name of the Secret you created in the previous step. options: bucket: "docker" // Replace with your bucket name. path: /path // Replace with your relative subdirectory path. url: "oss-cn-hangzhou.aliyuncs.com" // Replace with your endpoint. otherOpts: "-o max_stat_cache_size=0 -o allow_other" // Replace with your custom parameters.パラメーター:
alicloud-pvname: PV の名前。このラベルを PVC のselectorフィールドで使用して、PV を PVC にバインドします。bucket: OSS バケットの名前。path: バケットのルートからの相対パス。デフォルトは / です。csi-plugin v1.14.8.32-c77e277b-aliyun 以降でサポートされています。url: OSS バケットのエンドポイント。見つけるには:OSS コンソールにログインします。
左側のナビゲーションウィンドウで [Buckets] をクリックします。[Buckets] ページで、内部エンドポイントを取得するバケットの名前をクリックします。
対象バケットの左側のナビゲーションツリーで、概要をクリックします。
アクセスタイプ セクションで、バケットの エンドポイントを 確認します。
otherOpts: カスタムマウントパラメーター。形式:-o *** -o ***。
次のコマンドを実行して PV を作成します。
kubectl create -f pv-oss.yaml
期待される結果:
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
ボリューム ページに、作成したばかりの PV が表示されます。
PVC の作成
OSS バケットの永続ボリューム要求 (PVC) を作成します。selector フィールドを使用して PV と一致させます。これにより、PVC と PV の間の正確なバインディングが保証されます。storageClassName フィールドを使用して、OSS タイプの PV のみにバインディングを制限します。
pvc-oss.yaml という名前のファイルを作成します。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-oss spec: accessModes: - ReadWriteMany storageClassName: oss resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-oss次のコマンドを実行して PVC を作成します。
kubectl create -f pvc-oss.yaml
期待される結果:
ACK コンソールにログインします。ACK コンソール。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
ボリュームクレーム ページで、作成したばかりの PVC が表示されます。
アプリケーションの作成
oss-static.yaml という名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: oss-static labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-oss mountPath: "/data" - name: pvc-oss mountPath: "/data1" livenessProbe: exec: command: - sh - -c - cd /data initialDelaySeconds: 30 periodSeconds: 30 volumes: - name: pvc-oss persistentVolumeClaim: claimName: pvc-oss説明livenessProbeヘルスチェックの詳細については、「OSS ボリューム」をご参照ください。次のコマンドを実行して Deployment を作成します。
kubectl create -f oss-static.yaml
期待される結果:
ACK コンソールにログインします。ACK コンソール。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[デプロイメント] ページで、新しく作成されたデプロイメントを表示できます。
OSS 永続ストレージ
次のコマンドを実行して、Deployment を実行している Pod の名前を取得します。
kubectl get pod期待される出力:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-dqbl2 1/1 Running 0 1h次のコマンドを実行して、/data パス内のファイルを一覧表示します。
kubectl exec oss-static-66fbb85b67-dqbl2 -- ls /data | grep tmpfile説明/data パスは空です。
次のコマンドを実行して、/data ディレクトリに tmpfile ファイルを作成します。
kubectl exec oss-static-66fbb85b67-dqbl2 -- touch /data/tmpfile次のコマンドを実行して、/data パス内のファイルを一覧表示します。
kubectl exec oss-static-66fbb85b67-dqbl2 -- ls /data | grep tmpfile期待される出力:
tmpfile次のコマンドを実行して、oss-static-66fbb85b67-dqbl2 という名前の Pod を削除します。
kubectl delete pod oss-static-66fbb85b67-dqbl2期待される出力:
pod "oss-static-66fbb85b67-dqbl2" deleted別のターミナルウィンドウで、次のコマンドを実行して Pod の削除と再作成のプロセスを監視します。
kubectl get pod -w -l app=nginx期待される出力:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-dqbl2 1/1 Running 0 78m oss-static-66fbb85b67-dqbl2 1/1 Terminating 0 78m oss-static-66fbb85b67-zlvmw 0/1 Pending 0 <invalid> oss-static-66fbb85b67-zlvmw 0/1 Pending 0 <invalid> oss-static-66fbb85b67-zlvmw 0/1 ContainerCreating 0 <invalid> oss-static-66fbb85b67-dqbl2 0/1 Terminating 0 78m oss-static-66fbb85b67-dqbl2 0/1 Terminating 0 78m oss-static-66fbb85b67-dqbl2 0/1 Terminating 0 78m oss-static-66fbb85b67-zlvmw 1/1 Running 0 <invalid>次のコマンドを実行して、再作成された Pod の名前を取得します。
kubectl get pod期待される出力:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-zlvmw 1/1 Running 0 40s次のコマンドを実行して、/data パス内のファイルを一覧表示します。tmpfile はまだ存在します。これにより、データが OSS ボリュームに永続化されていることが確認されます。
kubectl exec oss-static-66fbb85b67-zlvmw -- ls /data | grep tmpfile期待される出力:
tmpfile