このページでは、Google Distributed Cloud(GDC)エアギャップ アプライアンス Kubernetes クラスタ内でステートフル ワークロードを作成して管理する方法について説明します。ステートフル ワークロードを使用すると、永続ストレージを使用してアプリケーションのデプロイをスケーリングできます。永続ストレージは、ワークロードがスケジュールされている場所に関係なく、アプリケーションに一貫した ID と安定したホスト名を提供します。
このページは、組織のアプリケーション ワークロードの作成を担当するアプリケーション オペレーター グループ内のデベロッパーを対象としています。
始める前に
このドキュメントの手順を完了するには、必要な権限をリクエストして環境を準備する必要があります。
IAM ロールをリクエストする
Kubernetes クラスタでステートフル ワークロードを作成、削除、編集、表示するには、組織の IAM 管理者にNamespace
管理者 (namespace-admin)ロールの付与を依頼してください。このロールは、プロジェクトの名前空間にバインドされます。
環境を準備する
事前構成済みのベアメタル Kubernetes クラスタに対してコマンドを実行するには、次のリソースが必要です。
Kubernetes クラスタ名を確認するか、プラットフォーム管理者にクラスタ名を確認します。
ログインして生成します。Kubernetes クラスタの kubeconfig ファイルがない場合
Kubernetes クラスタの kubeconfig パスを使用して、この手順の
CLUSTER_KUBECONFIGを置き換えます。
StatefulSet リソースを作成する
StatefulSet マニフェストを作成し、kubectl apply コマンドを実行してリソースを作成し、StatefulSet
オブジェクトを作成します。クライアントが StatefulSet リソースの Pod
にリクエストを送信するための安定した方法を提供するには、Service オブジェクトも作成する必要があります。
kubectl apply コマンドは、マニフェスト
ファイルを使用して、クラスタ内のリソースを作成、更新、削除します。これは、宣言型のオブジェクト構成方法です。この方法では、ライブ
オブジェクトに対して行われた書き込みが保持され、オブジェクトの構成ファイルに変更がマージされません。
StatefulSet リソースと Service リソースを作成するには、次のコマンドを実行します。
kubectl --kubeconfig CLUSTER_KUBECONFIG -n NAMESPACE \
apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: SERVICE_NAME
labels:
app: APP_NAME
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
app: APP_LABEL_NAME
serviceName: "SERVICE_NAME"
replicas: NUMBER_OF_REPLICAS
template:
metadata:
labels:
app: APP_LABEL_NAME
spec:
terminationGracePeriodSeconds: 10
containers:
- name: CONTAINER_NAME
image: CONTAINER_IMAGE
resources:
requests:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
limits:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: CONTAINER_STORAGE_VOLUME_PATH
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
EOF
次のように置き換えます。
CLUSTER_KUBECONFIG: コンテナ ワークロードをデプロイする Kubernetes クラスタの kubeconfig ファイル 。NAMESPACE: コンテナ ワークロードをデプロイするプロジェクトの名前空間。SERVICE_NAME:Serviceオブジェクトの名前。StatefulSetオブジェクトのserviceNameにServiceオブジェクトも設定されていることを確認します。APP_NAME: デプロイ内で実行するアプリケーションの名前。APP_LABEL_NAME:StatefulSetオブジェクトに属する Pod を決定するラベル セレクタ。STATEFULSET_NAME:StatefulSetオブジェクトの名前。NUMBER_OF_REPLICAS: デプロイが管理する複製されたPodオブジェクトの数。CONTAINER_NAME: コンテナの名前。CONTAINER_IMAGE: コンテナ イメージの名前。コンテナ レジストリのパスとイメージのバージョン(REGISTRY_PATH/nginx:1.23など)を含める必要があります。コンテナ レジストリのパスの設定の詳細については、 Managed Harbor Service の概要をご覧ください。CONTAINER_STORAGE_VOLUME_PATH: ストレージ ボリュームがマウントされるコンテナ内のパス。
たとえば、次の StatefulSet オブジェクトと対応する Service オブジェクトは、ステートフル コンテナ ワークロードを作成します。
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:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: REGISTRY_PATH/nginx:1.23
resources:
requests:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
limits:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
この例では、次のようになります。
nginxという名前のServiceオブジェクトが作成されます。これはmetadata: nameフィールドで示されます。Serviceオブジェクトは、labels.app: nginxとselector.app: nginxで示されるnginxというアプリをターゲットにしています。また、Serviceオブジェクトはポート 80 を公開してwebという名前を付けます。このServiceオブジェクトは、ネットワーク ドメインを制御し、StatefulSetオブジェクトによってデプロイされたコンテナ化されたアプリケーションにインターネット トラフィックをルーティングします。replicas: 3フィールドで設定されているように、3 つの複製されたPodオブジェクトを持つwebという名前のStatefulSetが作成されます。.spec.templateセクションで設定されたPodテンプレートは、そのPodオブジェクトにapp: nginxというラベルが付いていることを示します。.template.specセクションで設定されたPod仕様は、StatefulSetの Pod が 1 つのコンテナnginxを実行し、バージョン1.23でnginxイメージを実行することを示します。Pod仕様は、Serviceオブジェクトによって開かれたウェブポートを使用します。.template.spec.volumeMountsセクションでは、mountPathフィールド(wwwという名前)を指定します。mountPathは、ストレージ ボリュームがマウントされるコンテナ内のパスです。StatefulSetは、web-www-0、web-www-1、web-www-2という名前の 3 つのPersistentVolumeClaimオブジェクトをプロビジョニングします。各オブジェクトには 1 GB のプロビジョニング済みストレージがあります。
作成後、StatefulSet は、選択した数の Pod オブジェクトが常に実行され、使用可能であることを保証します。StatefulSet は、障害が発生した Pod オブジェクトやノードから削除された Pod オブジェクトを自動的に置き換え、新しい Pod オブジェクトを StatefulSet オブジェクトの Pod 仕様で定義されたストレージ リソース、リソースのリクエストと制限、その他の構成に関連付けます。
StatefulSet リソースで永続ストレージをリクエストする
永続ストレージは動的にプロビジョニングできるため、基礎となるボリュームがオンデマンドで作成されます。アプリケーションは、PersistentVolumeClaim オブジェクトを使って永続ストレージをリクエストできます。
通常、Pod オブジェクトを作成するだけでなく、PersistentVolumeClaim
オブジェクトも作成する必要があります。ただし、StatefulSet オブジェクトには、PersistentVolumeClaim
オブジェクトを生成する volumeClaimTemplates 配列が含まれています。各 StatefulSet
レプリカには、独自の PersistentVolumeClaim オブジェクトが割り当てられます。
詳細については、 コンテナ ストレージを構成するをご覧ください。