クラスター内のノードが実行を停止すると、ノード上のステートフル アプリケーションのコンテナー内のデータが失われ、データの信頼性が損なわれる可能性があります。データ損失のリスクを排除するために、永続ストレージを使用してデータを永続化できます。このトピックでは、Object Storage Service (OSS) ボリュームを使用してデータを永続化する方法について説明します。
背景情報
OSS は、Alibaba Cloud が提供する安全で費用対効果が高く、大容量で信頼性の高いクラウドストレージサービスです。 OSS バケットは、Container Service for Kubernetes (ACK) クラスタ内の複数のポッドにマウントできます。
シナリオ:
ディスク I/O の平均要件。
構成ファイル、イメージ、小さなビデオファイルなど、データを共有するための要件。
OSS ボリュームのマウント手順:
OSS バケットを作成します。
Alibaba Cloud アカウントの [アクセスキー ID] と [アクセスキー シークレット] を取得します。
シークレットを使用して永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。
前提条件
クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
OSS コンソールで OSS バケットが作成されます。詳細については、「バケットを作成する」をご参照ください。
使用上の注意
クラスターをアップグレードすると、kubelet と ossfs ドライバーが再起動される場合があります。その結果、マウントされた OSS ディレクトリが使用できなくなります。この場合は、OSS ボリュームがマウントされているポッドを再作成する必要があります。ポッドの YAML ファイルにヘルスチェック設定を追加し、OSS ディレクトリが使用できなくなったときにポッドを再起動して OSS ボリュームを再マウントできます。
上記のエラーは、最新のコンポーネントバージョンで修正されています。
PV を作成する
次のコマンドを実行して、シークレットを作成します。
次のコマンドの
<your AccessKey ID>と<your AccessKey Secret>を、Alibaba Cloud アカウントの実際のアクセスキー ID とアクセスキー シークレットに置き換えます。 Alibaba Cloud アカウントの AccessKey ペアを取得するには、ACK コンソールに移動し、ポインターを
アイコンの上に移動して、[アクセスキー] をクリックします。kubectl create secret generic osssecret --from-literal=akId='<your AccessKey ID>' --from-literal=akSecret='<your AccessKey Secret>' --type=alicloud/oss -n defaultosssecret: シークレットの名前。カスタム名を指定できます。akId: アクセスキー ID。akSecret: アクセスキー シークレット。--type: シークレットのタイプ。この例では、値はalicloud/ossに設定されています。シークレットとシークレットを使用するポッドは、同じ名前空間に属している必要があります。次の 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" # 前の手順で作成したシークレットの名前に置き換えます。 options: bucket: "docker" // OSS バケットの名前に置き換えます。 path: /path // マウントする OSS サブディレクトリの相対パスに置き換えます。 url: "oss-cn-hangzhou.aliyuncs.com" // OSS バケットのエンドポイントに置き換えます。 otherOpts: "-o max_stat_cache_size=0 -o allow_other" // カスタムパラメーター値に置き換えます。パラメーター
alicloud-pvname: PV の名前。 PVC のselectorフィールドで PV 名を指定して、PV を PVC にバインドできます。Bucket Name: OSS バケットの名前。path: マウントする OSS バケットのルートディレクトリからの相対パス。デフォルト値: /。このパラメーターは、csi-plugin 1.14.8.32-c77e277b-aliyun 以降でサポートされています。url: OSS バケットのエンドポイント。エンドポイントを取得するには、次の手順を実行します。OSS コンソール にログインします。
左側のナビゲーションウィンドウで、バケット をクリックします。 [バケット] ページで、内部エンドポイントを取得するバケットの名前をクリックします。
左側のナビゲーションツリーで、概要 をクリックします。
[ポート] セクションで、バケットのエンドポイントを表示できます。
otherOpts: OSS バケットのマウントに使用されるカスタムパラメーター。パラメーターは-o *** -o ***形式である必要があります。
次のコマンドを実行して、PV を作成します。
kubectl create -f pv-oss.yaml
予期される出力:
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のペインで、 を選択します。
[永続ボリューム] ページに、新しく作成された PV が表示されます。
PVC を作成する
OSS バケットの PVC を作成します。作成した PV を選択するように PVC の selector パラメーターを構成します。こうすることで、PVC の作成後に PV が PVC に自動的にバインドされます。 storageClassName パラメーターを設定して、OSS タイプの PV のみが PVC にバインドできるように指定します。
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 コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のペインで、 を選択します。
[永続ボリューム要求] ページに、新しく作成された 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 ボリューム」をご参照ください。次のコマンドを実行して、デプロイメントを作成します。
kubectl create -f oss-static.yaml d
予期される出力:
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のペインで、 を選択します。
[デプロイメント] ページに、新しく作成されたデプロイメントが表示されます。
データの永続性を検証する
次のコマンドを実行して、アプリケーションポッドをクエリします。
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 パスにファイルが存在しないことを示しています。
次のコマンドを実行して、tmpfile という名前のファイルを /data パスに作成します。
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 という名前のポッドを削除します。
kubectl delete pod oss-static-66fbb85b67-dqbl2予期される出力:
pod "oss-static-66fbb85b67-dqbl2" deleted別のターミナルウィンドウを開き、次のコマンドを実行して、ポッドがどのように削除および再作成されるかを確認します。
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>次のコマンドを実行して、再作成されたポッドの名前をクエリします。
kubectl get pod予期される出力:
NAME READY STATUS RESTARTS AGE oss-static-66fbb85b67-zlvmw 1/1 Running 0 40s次のコマンドを実行して、tmpfile ファイルが /data パスにまだ存在するかどうかを確認します。 tmpfile が /data パスにまだ存在する場合、データは OSS ボリュームに永続化されます。
kubectl exec oss-static-66fbb85b67-zlvmw -- ls /data | grep tmpfile予期される出力:
tmpfile