ここでは、ステートフルサービスの作成時に OSS (Object Storage Service) バケットが必要となる典型的なシナリオ、および バケットの使用方法を解説します。
シナリオと方法
Alibaba Cloud OSS は大規模でセキュリティ保護された低コストの高可用性クラウドストレージサービスを提供しています。 OSS バケットは複数のポッドにマウントすることができます。
シナリオ
- 高いディスク I/O パフォーマンスを必要としない場合。
- ファイル、図、および短いビデオなどの共有サービスを設定する必要がある場合。
方法
- バケットを手動で作成します。
- AccessKey ID と AccessKey シークレット を取得します。
- PV (Persistent Volume) および PVC (Persistent Volume Claim) を手動で作成します。
前提条件
- Kubernetes クラスターの作成が必要です。 詳しくは、「Kubernetes クラスターの作成」をご参照ください。
- kubectl を利用して Kubernetes クラスターへ接続されている必要があります。「kubectl を利用した Kubernetes クラスターへの接続」をご参照ください。
- OSS コンソールでバケットが作成されている必要があります。「バケットの作成」をご参照ください。
注意事項
- Alibaba Cloud Container Service の Kubernetes クラスターのアップグレードにより、kubelet および OSSFS ドライバーが再起動されます。 その結果、OSS ディレクトリが利用できなくなります。 このような場合、OSS バケットを使用するポッドを再度作成する必要があります。 お使いのアプリケーションの YAML ファイルにヘルスチェックの設定を追加することを推奨します。 お使いのクラスターにヘルスチェックの設定を追加した場合、お使いのコンテナー内の OSS ディレクトリが利用できなくなった際にポッドが自動的に再起動され、OSS バケットが再マウントされます。
- 最新の Kubernetes クラスターをお使いの場合、上記の問題の影響はありません。
PV の作成
- pv-oss.yaml ファイルを作成します。
パラメーターの説明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" options: bucket: "docker" ////Replace this value with your bucket name. url: "oss-cn-hangzhou.aliyuncs.com" ////Replace this value with your URL. akId: "***" ////Replace this value with your AccessKey ID. akSecret: "***" ////Replace this value with your AccessKey Secret. otherOpts: "-o max_stat_cache_size=0 -o allow_other" ////Replace this value with your specified otherOpts value.
alicloud-pvname
: PV 名です。 このパラメーターの値は PV と関連付けられた PVC のselector
フィールドで使用される必要があります。bucket
: バケット名です。 Kubernetes クラスターへマウントされるバケットのみです。 バケット上のサブディレクトリまたはファイルは、どの Kubernetes クラスターにもマウントできません。url
: OSS バケットのアクセスに使われるドメイン名、つまりエンドポイントです。 詳しくは、「リージョンとエンドポイント」をご参照ください。 OSS コンソールから 作成された OSS バケットのエンドポイントを参照することもできます。 OSS コンソールにログインし、対象となるバケットを選択します。"ドメイン名" エリアに [エンドポイント] が表示されます。akId
: お使いの AccessKey ID です。 Container Service で右上角の をクリックします。 プライマリアカウントに関しては、[アクセスキー] を選択します。 RAM ユーザーに関しては。[AccessKey] を選択します。 その後、お使いの AccessKey ID および AccessKey シークレット が作成できます。akSecret
: お使いの AccessKey Secretです。 このパラメーターの値を取得した方法と同じ方法で、akId
パラメーターの値を取得します。otherOpts
: OSS バケットのマウントに関するカスタマイズパラメーターを示します。 このパラメーターを-o *** -o ***
の形式で設定します。 詳しくは、「よくある質問」をご参照ください。
- 以下のコマンドを実行し、PV を作成します。
$ kubectl create -f pv-oss.yaml
結果
Kubernetes で、左側のナビゲーションウィンドウから
をクリックします。対象となるクラスターを選択し、作成された PV を表示します。PVC の作成
OSS バケットへの PVC を作成します。 特に、selector
フィールドを設定し、作成された PV へのフィルタリングをする必要があります。これにより、PVC が適切な PV と関連付けられます。 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
結果
Kubernetes で、左側のナビゲーションウィンドウから
をクリックします。対象となるクラスターおよび名前空間を選択し、作成した 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: nginx 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
については詳しくは、「永続ボリュームとして Alibaba Cloud OSS バケットを使用する」をご参照ください。 - 以下のコマンドを実行し、デプロイを作成します。
$ kubectl create -f oss-static.yaml d
Kubernetes で、左側のナビゲーションウィンドウから
をクリックします。対象となるクラスターおよび名前空間を選択し、作成されたデプロイを参照します。
OSS バケット上のデータが永続的に保存されることを確認する
- 以下のコマンドを実行し、作成されたデプロイが存在するポッドを表示します。
$ 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 という名前のポッドを削除します。
$ kubectl delete pod oss-static-66fbb85b67-dqbl2 pod "oss-static-66fbb85b67-dqbl2" deleted
- もう 1 つの kubectl インターフェイスを開きます。以下のコマンドを実行し、上記でポッドを削除した処理を表示します。さらに、Kubernetes により新しいポッドが作成されます。
$ 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>
- 以下のコマンドを実行し、Kubernetes により作成されたポッドを表示します。
$ 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