このページでは、Distributed Cloud 接続クラスタのストレージを構成する方法について説明します。
Symcloud Storage 用に Distributed Cloud Connected を構成する
Distributed Cloud 接続ノードは、ローカル ストレージをワークロードに直接公開しません。代わりに、Distributed Cloud connected は Rakuten Symcloud Storage を使用します。これは、各 Distributed Cloud connected ノードで実行され、クラスタ内のすべての Distributed Cloud connected ノードで実行されているワークロードでローカル ストレージを使用できるようにするローカル ストレージ抽象化レイヤとして機能するサードパーティ ソリューションです。
Container Storage Interface(CSI)は、Kubernetes がコンテナ化されたワークロードに任意のストレージ システムを公開でき、多くの大手ストレージ ベンダーがサポートするオープン スタンダード API です。Distributed Cloud Connected では、Symcloud Storage がサポートおよび管理される CSI ストレージ ソリューションです。Symcloud Storage を有効にすると、必要な Kubernetes StorageClasses が自動的に構成されます。その後、適切なストレージ クラスを使用するようにワークロードを構成できます。
Symcloud Storage は Google Cloud Marketplace からデプロイされ、そこに記載されている規約が適用されます。Google は、Distributed Cloud コネクテッドでの Symcloud Storage の使用について限定的なサポートを提供しており、必要に応じてサードパーティ プロバイダに支援を求めることがあります。Symcloud Storage のソフトウェア アップデートは、Distributed Cloud Connected のソフトウェア アップデートに含まれています。
このリリースの Distributed Cloud コネクテッドには、Symcloud Storage 6.0.0-226 が付属しており、サポートされています。このリリースの Distributed Cloud Connected では、Symcloud Storage の他のバージョンはサポートされていません。
Symcloud Storage ライセンスを取得する
Google Cloud Marketplace から YAML 形式の Symcloud Storage ライセンスを取得する必要があります。
前提条件
始める前に、次の手順を完了します。
- ターゲットの Distributed Cloud 接続プロジェクトのロギングとモニタリングを構成します。
- 移行先の Distributed Cloud コネクテッド クラスタを作成します。
- ターゲットの Distributed Cloud 接続クラスタ内の Pod が Google Cloud データセンターにアクセスできるように、Distributed Cloud ネットワークを構成します。
- Symcloud Storage で抽象化しない各 Distributed Cloud ノードの各
local-block永続ボリュームをバインドします。バインドされたlocal-block永続ボリュームのバインドを解除すると、Symcloud Storage のインストール時にその永続ボリュームの内容が消去されます。手順については、Kubernetes ドキュメントのバインディングをご覧ください。
Distributed Cloud 接続ノードに Symcloud Storage をインストールする
Distributed Cloud 接続ノードに Symcloud Storage をインストールするには、次の操作を行います。
次のコマンドを使用して、Symcloud Storage ライセンスをクラスタに適用します。
LICENSE_FILEは、Symcloud Storage ライセンス ファイルのフルパスと名前に置き換えます。kubectl apply -f LICENSE_FILE -n robin-admin
次のコマンドを使用して、
RobinClusterサービスとすべての Symcloud Storage ノードのステータスを確認します。kubectl describe robinclusters -n robinio
このコマンドでは、次のような出力が返されます。
[...] Status: [...] Phase: Ready robin_node_status: [...] Status: Ready [...] Status: Ready [...] Status: Ready [...]サービスとノードの想定されるステータスは
Readyです。
Symcloud Storage をデフォルトのストレージ クラスとして設定する
次のコマンドを使用して、Distributed Cloud 接続クラスタで Symcloud Storage をデフォルトのストレージ クラスとして設定します。STORAGE_CLASS は、Symcloud ストレージ クラスのいずれかに置き換えます。
kubectl patch storageclass STORAGE_CLASS -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
デフォルトのストレージ クラスの設定の詳細については、Kubernetes ドキュメントのデフォルトの StorageClass を変更するをご覧ください。
Symcloud Storage クラス
このセクションでは、Symcloud Storage が Distributed Cloud 接続クラスタで有効にできるストレージ クラスについて説明します。Distributed Cloud Connected の Symcloud Storage は、robin-rwx ストレージ クラスと、カスタム構成された RWX ファイル システム モードのボリュームをサポートしていません。Symcloud ストレージ クラスの詳細については、Kubernetes での Robin CNS の使用をご覧ください。
robin ストレージ クラス
robin ストレージ クラスは、基本的な Read Write-Once(RWO)ストレージ クラスです。次の例は、クラスのインスタンス化を示しています。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
robin-immediate ストレージ クラス
robin-immediate ストレージ クラスは、対応する永続ボリューム要求の作成直後に永続ボリュームが作成される点を除き、robin と同じです。次の例は、クラスのインスタンス化を示しています。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin-immediate
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
robin-repl-3 ストレージ クラス
robin-repl-3 は、複数の Distributed Cloud ノードにまたがる 3 つのレプリカを持つ RWO ストレージ クラスです。次の例は、クラスのインスタンス化を示しています。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin-repl-3
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
parameters:
replication: "3"
faultdomain: host
ワークロード用に抽象化された Symcloud Storage ボリュームを構成する
このセクションでは、Symcloud Storage クラスを使用して、Distributed Cloud に接続されたワークロードの抽象化されたストレージを構成する方法の例を示します。Symcloud Storage ボリュームの構成の詳細については、Kubernetes での Robin CNS の使用をご覧ください。
ファイル システム モードで ext4 RWO ボリュームを構成する
次の例は、ext4 ファイル システムを使用してファイル システム モードで RWO ボリュームの永続ボリューム クレームを構成する方法を示しています。STORAGE_CLASS は、Symcloud ストレージ クラスのいずれかに置き換えます。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-fs-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
ブロックモードで RWO ボリュームを構成する
次の例は、ブロックモードの RWO ボリュームの永続ボリューム クレームを構成する方法を示しています。STORAGE_CLASS は、Symcloud Storage クラスのいずれかに置き換えます。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-block-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
volumeMode: Block
既存のボリュームの構成を変更する
次の例は、アノテーションを使用して既存の Symcloud Storage LZ4 圧縮 RWO ボリュームの構成を変更する方法を示しています。STORAGE_CLASS は、Symcloud ストレージ クラスのいずれかに置き換えます。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: compressed-rwo-fs-pvc
annotations:
robin.io/compression: LZ4
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
次の例は、アノテーションを使用して xfs ファイル システムで既存の Symcloud Storage RWO ボリュームの構成を変更する方法を示しています。STORAGE_CLASS は、Symcloud ストレージ クラスのいずれかに置き換えます。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-xfs-pvc
annotations:
robin.io/fstype: xfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
Symcloud Storage CLI クライアントを構成する
Symcloud Storage には、Symcloud Storage の構成の管理に使用できるコマンドライン インターフェース(CLI)クライアントが用意されています。Distributed Cloud 接続クラスタでクライアントを構成する手順は次のとおりです。
Distributed Cloud 接続クラスタにデプロイされた
RobinClusterサービス インスタンスで使用される Symcloud Storage イメージパスを取得し、環境変数を次のように設定します。image_robin=$(kubectl get robincluster -o jsonpath='{.items[].spec.image_robin}') image_registry_path=$(kubectl get robincluster -o jsonpath='{.items[].spec.image_registry_path}') ROBIN_CNS_IMAGE="$image_registry_path/$image_robin"次の内容で
robincliリソースを作成します。kind: Deployment apiVersion: apps/v1 metadata: name: robincli namespace: default labels: name: robincli spec: replicas: 1 selector: matchLabels: name: robincli template: metadata: annotations: product: robin labels: name: robincli spec: containers: - name: robincli image: ROBIN_CNS_IMAGE workingDir: /root command: ["/bin/bash","-c","mkdir -p /root/.robin; ln -s -t /usr/lib/python3.7/site-packages/ /opt/robin/current/python3/site-packages/robincli /opt/robin/current/python3/site-packages/stormgr_def.py /opt/robin/current/python3/site-packages/stormgr_lib.py; /opt/robin/current/bin/robin client add-context robin-master.robinio --set-current; while true; do sleep 10000; done"] resources: requests: memory: "10Mi" cpu: "100m"ROBIN_CNS_IMAGEは、手順 1 で取得したイメージの完全なリポジトリ パスと名前に置き換えます。Distributed Cloud 接続クラスタに
robincliリソースを適用します。Symcloud Storage は、初期インストール時に、ランダム化されたパスワードを使用して
robinioNamespace にdefault-admin-userSecret を生成します。次のコマンドを使用して、これらのログイン認証情報を取得します。ユーザー名を取得します。
kubectl -n robinio get secret default-admin-user -o jsonpath='{.data.username}' | base64 -dパスワードを取得します。
kubectl -n robinio get secret default-admin-user -o jsonpath='{.data.password}' | base64 -d
新しく作成した Pod にログインして、クライアントを実行します。
kubectl exec -it robincli -- bash
StatefulSet でストレージ クラスを参照する
次の例は、StatefulSet ワークロードで Symcloud ストレージ クラスを参照する方法を示しています。
この例では、事前構成済みの robin-repl-3 ストレージ クラスを使用していることを前提としています。このクラスは、高可用性を実現するために 3 つの異なるワーカーノードにレプリケートされたボリュームを提供します。
高可用性の StatefulSet を構成する場合は、構成に次のベスト プラクティスを含めます。
- ヘッドレス Service: StatefulSet には、
serviceNameフィールドと一致するコンパニオン ヘッドレス Service が必要です。ヘッドレス Service はclusterIP: Noneを持つ Service です。このサービスは、セット内の各 Pod に安定した DNS ホスト名を割り当てます。 - Pod のアンチアフィニティ:
robin-repl-3などのレプリケートされたストレージ クラスを使用すると、データは複数のワーカーノード間で安全にミラーリングされます。ただし、Kubernetes がすべてのアプリケーション Pod を同じワーカーノードにスケジュールすると、単一のノードの停止によってアプリケーションがダウンする可能性があります。Pod 反アフィニティを構成すると、Pod が個別のワーカーノードに分散され、コンピューティングの可用性とストレージの冗長性が一致します。
次の例は、Headless Service(nginx)と、robin-repl-3 ストレージ クラスを参照する Pod 反アフィニティで構成された StatefulSet を含む完全な構成を示しています。ワークロードのストレージ要件が時間の経過とともに増加する場合は、PersistentVolumeClaim のストレージ リクエストを編集して、ボリュームのサイズを動的に変更できます。
statefulset.yaml
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: "kubernetes.io/hostname" containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: # Reference the storage class in this specification - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi # Symcloud Storage classes support dynamic volume expansion if more storage is needed storageClassName: robin-repl-3 # References the Symcloud storage class
Symcloud Storage の制限事項
Distributed Cloud Connected で Symcloud Storage を使用する場合、Distributed Cloud Connected クラスタが 3 つ以上の Distributed Cloud Connected ノードで構成されている場合にのみ、高可用性を実現できます。
Symcloud Storage を使用するノードをクラスタから削除する
Symcloud Storage ボリューム レプリカは、Distributed Cloud 接続クラスタ内のワーカーノードに保存されます。クラスタからノードを削除すると、そのノードに保存されている Symcloud Storage ボリューム データが使用できなくなります。これを防ぐには、次のいずれかを行う必要があります。
- クラスタ全体を削除する場合は、クラスタ自体を削除する前に、ワークロードと対応する Symcloud Storage 永続ボリュームを削除します。
- クラスタから特定のノードを削除する場合は、クラスタからノードを削除する前に、そのノードに保存されているワークロード データを移行する必要があります。手順については、ディスクからボリュームを退避させるをご覧ください。
ローカル ストレージ スキーマを構成する
ストレージ スキーマは、1 つ以上のパーティションの論理グループです。各パーティションは、論理的に独立したストレージ ユニットです。パーティションは、物理ディスク容量がなくなるまでクラスタに順番に作成されます。各ストレージ スキーマには、それを識別する一意の名前があります。
Distributed Cloud 接続クラスタの新しいローカル ストレージ スキーマを作成するには、Google にリクエストする必要があります。スキーマをテストしてクラスタに作成したら、gcloud CLI を使用して適用できます。
スキーマをクラスタに適用した後は、スキーマを変更できません。既存のスキーマを変更するには、Google に既存のスキーマの削除をリクエストしてから、新しいスキーマの作成をリクエストして、既存のスキーマを置き換える必要があります。
ローカル ストレージ スキーマのパーティションを定義する
ローカル ストレージ スキーマをリクエストする前に、まずそのスキーマのパーティションを定義する必要があります。
パーティションには次のプロパティがあります。
- サイズ。パーティション サイズをバイナリ バイトで指定するか、ローカル ディスクの残りの領域をすべて使用するように指定できます。
- タイプ。パーティションは、Kubernetes 永続ボリューム(PV)またはローカル ディスク上の Linux ローカル ボリュームとして構成できます。
- モード。パーティションに保存されたボリュームは、ブロック ボリュームまたはファイル システム ボリュームとして構成できます。永続ボリューム パーティションの場合、パーティションのストレージ クラスはそれぞれ
local-blockまたはlocal-disksです。ローカル ボリューム パーティションの場合、含まれるファイル システムのバインド ポイントとマウント ポイントを指定できます。
ローカル ストレージ スキーマをリクエストする
Distributed Cloud 接続クラスタの新しいローカル ストレージ スキーマをリクエストするには、Google サポートにお問い合わせのうえ、スキーマで作成する各パーティションのサイズ、タイプ、モード、マウント ポイントとバインド ポイント(省略可)を指定してください。
リクエストを受け取ると、スキーマの堅牢性を確認するための一連のテストが実行され、Distributed Cloud 接続クラスタにスキーマが作成されます。
デフォルトのローカル ストレージ スキーマ
Distributed Cloud Connected には、次のデフォルトのローカル ストレージ スキーマが付属しています。
default_control_plane_node。このスキーマは、次のパーティションを定義します。- ファイル システム モードの 100 GB のローカル ボリューム パーティション。
- 残りのディスク空き容量を占有するブロックモードの永続ボリューム パーティション。
default_worker_node。このスキーマは、ブロックモードで 410 GB の永続ボリューム パーティションを定義します。
ローカル ストレージ スキーマをクラスタに適用する
ローカル ストレージ スキーマを Distributed Cloud 接続クラスタに適用するには、次のいずれかを行います。
ローカル ストレージ スキーマをクラスタのコントロール プレーン ノードに適用するには、クラスタの作成時に
--control-plane-node-storage-schemaフラグを使用します。詳細については、クラスタを作成するをご覧ください。ローカル ストレージ スキーマをクラスタのワーカーノードに適用するには、クラスタのノードプールを作成するときに
--node-storage-schemaを使用します。詳細については、ノードプールを作成するをご覧ください。
Distributed Cloud Connected は、クラスタまたはノードプールの作成が成功すると、ローカル ストレージ スキーマで定義されたパーティションを作成します。
トラブルシューティング
PersistentVolumeClaim が予期せず保留中のままになる場合や、ワークロードがボリュームをアタッチできない場合は、このセクションに記載されているトラブルシューティングの手順を実行します。
PersistentVolumeClaim が保留状態のままになる
PersistentVolumeClaim が Pending 状態のままの場合は、ストレージ クラスの volumeBindingMode を確認します。事前構成された Symcloud ストレージ クラスは volumeBindingMode: WaitForFirstConsumer を使用します。これにより、クレームを参照する Pod がスケジュールされるまで、ボリュームのプロビジョニングが遅延します。ワークロード Pod が正常にスケジュールされていることを確認します。
Pod のスケジューリングが完了してもクレームが保留中のままになっている場合、またはボリュームのアタッチに失敗した場合は、Symcloud Storage コントロール プレーンとノードレベルのデーモンの状態を確認します。
コントロール プレーンの健全性を確認する
Symcloud Storage コントロール プレーンが正常で、ボリュームをプロビジョニングする準備ができていることを確認するには、kubectl describe コマンドを実行して、RobinCluster カスタム リソースのステータスを確認します。
kubectl describe robinclusters -n robinio
コマンド出力で、Phase が Ready であることを確認します。
ストレージ デーモンの正常性を確認する
すべてのノードレベルのストレージ デーモン Pod が実行されていることを確認するには、kubectl get コマンドを実行します。
kubectl get pods -n robinio
コマンド出力で、すべての Pod が Running 状態であることを確認します。ストレージ デーモン Pod が失敗したノードにワークロードがスケジュール設定されると、中央の RobinCluster ステータスに関係なく、ボリュームのアタッチがハングします。
サポートに問い合わせる
Symcloud Storage コントロール プレーンのステータスが Ready でない場合や、ストレージ デーモン Pod が Running 状態でない場合は、Google サポートにお問い合わせください。サポート チケットを送信する際は、実行したトラブルシューティング コマンドの出力を提供してください。