このページでは、Google Distributed Cloud コネクテッド ハードウェアにワークロードをデプロイする手順と、ワークロードを構成する際に遵守する必要がある制限事項について説明します。
これらの手順を完了する前に、Distributed Cloud 接続インストール要件を満たし、Distributed Cloud ハードウェアを注文する必要があります。
Google Distributed Cloud コネクテッド ハードウェアが選択した宛先に到着すると、Distributed Cloud コネクテッドの注文時に指定したハードウェア、 Google Cloud、一部のネットワーク設定が事前構成されています。
Google の設置担当者が物理的な設置を完了し、システム管理者が Distributed Cloud connected をローカル ネットワークに接続します。
ハードウェアがローカル ネットワークに接続されると、 Google Cloud と通信してソフトウェア アップデートをダウンロードし、Google Cloud プロジェクトに接続します。これで、ノードプールをプロビジョニングして、Distributed Cloud コネクテッドにワークロードをデプロイする準備が整いました。
デプロイの概要
Distributed Cloud 接続ハードウェアにワークロードをデプロイする手順は次のとおりです。
省略可: ローカル ストレージの顧客管理の暗号鍵(CMEK)のサポートを有効にする。Cloud Key Management Service と統合して、ワークロード データの CMEK のサポートを有効にする場合に使用します。Distributed Cloud Connected がワークロード データを暗号化する方法については、ローカル ストレージのセキュリティをご覧ください。
ノードプールを作成する。このステップでは、ノードをノードプールに割り当て、必要に応じて、Cloud KMS を使用してワークロード データの暗号化に使用する Linux Unified Key Setup(LUKS)パスフレーズをラップおよびラップ解除するようにノードプールを構成します。
クラスタの認証情報を取得して、クラスタをテストします。
プロジェクトに対する Edge Container 閲覧者ロール(
roles/edgecontainer.viewer)または Edge Container 管理者ロール(roles/edgecontainer.admin)を割り当てて、ユーザーにクラスタへのアクセス権を付与します。RoleBindingとClusterRoleBindingを使用して、クラスタ リソースへのきめ細かいロールベースのアクセス権をユーザーに割り当てます。省略可: Distributed Cloud Connected の仮想マシンでワークロードを実行するように GDC の VM ランタイムを構成します。
省略可: GPU サポートを有効にして、Distributed Cloud コネクテッドで GPU ベースのワークロードを実行します。
NGINX ロードバランサをサービスとしてデプロイする
次の例は、NGINX サーバーをデプロイし、Distributed Cloud 接続クラスタでサービスとして公開する方法を示しています。
次の内容で
nginx-deployment.yamlという名前の YAML ファイルを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
次のコマンドを使用して、YAML ファイルをクラスタに適用します。
kubectl apply -f nginx-deployment.yaml
次の内容で
nginx-service.yamlという名前の YAML ファイルを作成します。apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 80
次のコマンドを使用して、YAML ファイルをクラスタに適用します。
kubectl apply -f nginx-deployment.yaml
次のコマンドを使用して、MetalLB ロードバランサによってサービスに割り当てられた外部 IP アドレスを取得します。
kubectl get services
このコマンドでは、次のような出力が返されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service LoadBalancer 10.51.195.25 10.100.68.104 8080:31966/TCP 11d
NodeSystemConfigUpdate リソースを構成する
クラスタ内の各ノードに対して、次のように NodeSystemConfigUpdate ネットワーク関数オペレータ リソースを構成します。
次のコマンドを使用して、ターゲット クラスタのノードプールで実行されているノードを一覧表示します。
kubectl get nodes | grep -v master
このコマンドでは、次のような出力が返されます。
NAME STATUS ROLES AGE VERSION pool-example-node-1-01-b2d82cc7 Ready <none> 2d v1.22.8-gke.200 pool-example-node-1-02-52ddvfc9 Ready <none> 2d v1.22.8-gke.200返されたノード名を記録し、その短縮名を導出します。たとえば、
pool-example-node-1-01-b2d82cc7ノードの略称はnode101です。前の手順で記録したノードごとに、次の内容を含む専用の
NodeSystemConfigUpdateリソース ファイルを作成します。apiVersion: networking.gke.io/v1 kind: NodeSystemConfigUpdate metadata: name: nodesystemconfigupdate-NODE_SHORT_NAME namespace: nf-operator spec: kubeletConfig: cpuManagerPolicy: Static topologyManagerPolicy: SingleNumaNode nodeName: NODE_NAME osConfig: hugePagesConfig: ONE_GB: 2 TWO_MB: 0 isolatedCpusPerSocket: "0": 40 "1": 40 sysctls: nodeLevel: net.core.rmem_max: "8388608" net.core.wmem_max: "8388608"
次のように置き換えます。
NODE_NAME: ターゲット ノードの完全な名前。例:pool-example-node-1-01-b2d82cc7NODE_SHORT_NAME: 完全名から派生したターゲット ノードの略称。例:node101
各ファイルに
node-system-config-update-NODE_SHORT_NAME.yamlという名前を付けます。次のコマンドを使用して、各
NodeSystemConfigUpdateリソース ファイルをクラスタに適用します。kubectl apply -f node-system-config-update-NODE_SHORT_NAME.yaml
NODE_SHORT_NAMEは、対応するターゲット ノードの略称に置き換えます。リソースをクラスタに適用すると、影響を受ける各ノードが再起動します。これには最大 30 分かかることがあります。
- 影響を受けるノードのステータスをモニタリングし、すべてが正常に再起動されるまで待ちます。
kubectl get nodes | grep -v master
各ノードのステータスは、再起動が完了すると
not-readyからreadyに移行します。
イメージ キャッシュ用の Pod を構成する
Distributed Cloud 接続クラスタで実行されている Pod を構成して、イメージをキャッシュに保存できます。Pod は、リポジトリから初めて pull された後、キャッシュに保存されたイメージの使用を開始します。Pod をホストするノードのストレージが不足すると、新しいイメージはキャッシュに保存されず、既存のイメージ キャッシュは削除されます。これにより、ワークロードが中断なく実行され続けます。
Pod 構成は次の前提条件を満たしている必要があります。
- Pod に
gdce.baremetal.cluster.gke.io/cache-image: trueラベルを設定する必要があります。 - 非公開イメージ リポジトリを使用している場合、
ImagePullSecretリソースのタイプはkubernetes.io/dockerconfigjsonである必要があります。 - ターゲット イメージのキャッシュ コピーが常に使用されるように、Pod の pull ポリシーを
IfNotPresentに設定する必要があります。キャッシュされたコピーがローカルで利用できない場合、イメージはリポジトリから pull されます。
次の例は、キャッシュ保存が有効になっている Pod 構成を示しています。
apiVersion: v1
kind: Pod
metadata:
name: cached-image-pod
labels:
gdce.baremetal.cluster.gke.io/cache-image: "true"
spec:
containers:
- name: my-container
image: your-private-image-repo/your-image:tag
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: my-image-secret # If using a private registry
次の例は、キャッシュ保存が有効になっている Deployment 構成を示しています。
apiVersion: apps/v1
kind: Deployment
metadata:
name: cached-image-deployment
spec:
template:
metadata:
labels:
gdce.baremetal.cluster.gke.io/cache-image: "true"
spec:
containers:
- name: my-container
image: your-private-image-repo/your-image:tag
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: my-image-secret # If using a private registry
Distributed Cloud ワークロードの制限事項
Distributed Cloud 接続ワークロードを構成する場合は、このセクションで説明する制限事項を遵守する必要があります。これらの制限事項は、Distributed Cloud 接続ハードウェアにデプロイするすべてのワークロードで Distributed Cloud 接続によって適用されます。
Linux ワークロードの制限
Distributed Cloud connected は、ワークロードに関する次の Linux 機能のみをサポートします。
AUDIT_READAUDIT_WRITECHOWNDAC_OVERRIDEFOWNERFSETIDIPC_LOCKIPC_OWNERKILLMKNODNET_ADMINNET_BIND_SERVICENET_RAWSETFCAPSETGIDSETPCAPSETUIDSYS_CHROOTSYS_NICESYS_PACCTSYS_PTRACESYS_RESOURCESYS_TIME
Namespace の制限事項
Distributed Cloud connected は、次の名前空間をサポートしていません。
hostPIDhostIPChostNetwork
リソースタイプの制限
Distributed Cloud Connected は、署名リクエストに基づいてクライアントが X.509 証明書の発行を要求できる CertificateSigningRequest リソースタイプをサポートしていません。
セキュリティ コンテキストの制限
Distributed Cloud Connected は、特権モードのセキュリティ コンテキストをサポートしていません。
Pod バインディングの制限
Distributed Cloud connected は、Pod から HostNetwork Namespace 内のホストポートへのバインドをサポートしていません。また、HostNetwork 名前空間は使用できません。
hostPath 音量制限
Distributed Cloud Connected では、読み取り/書き込みアクセス権を持つ次の hostPath ボリュームのみが許可されます。
/dev/hugepages/dev/infiniband/dev/vfio/dev/char/sys/devices
PersistentVolumeClaim リソースタイプの制限
Distributed Cloud Connected で許可される PersistentVolumeClaim リソースタイプは次のとおりです。
csinfslocal
ボリューム タイプの制限
Distributed Cloud Connected では、次のボリューム タイプのみが許可されます。
configMapcsidownwardAPIemptyDirhostPathnfspersistentVolumeClaimprojectedsecret
Pod の容認制限
Distributed Cloud コネクテッドでは、コントロール プレーン ノードでユーザーが作成した Pod は許可されません。具体的には、次の容認キーを持つ Pod のスケジューリングは許可されません。
""node-role.kubernetes.io/masternode-role.kubernetes.io/control-plane
権限借用の制限
Distributed Cloud Connected は、ユーザーまたはグループの権限借用をサポートしていません。
管理 Namespace の制限事項
Distributed Cloud connected では、次の名前空間へのアクセスは許可されていません。
ai-systemai-speech-systemai-ocr-systemai-translation-systemanthos-identity-servicecert-managerdataproc-systemdataproc-PROJECT_IDdns-systemg-istio-systemgke-connectgke-managed-metrics-servergke-operatorsg-ospf-servicecontrol-systemg-ospf-systemg-pspf-systemgke-systemgpc-backup-systemiam-systemkube-node-leasekube-publickube-system(ippools.whereabouts.cni.cncf.ioの削除を除く)metallb-system(ロード バランシング IP アドレス範囲を設定するためのconfigMapリソースの編集を除く)nf-operatoroclcm-systempredictionrm-systemrobiniosaas-systemvm-system
PROJECT_ID は、ターゲット Google Cloud プロジェクトの ID を示します。
名前に g- 接頭辞が付いている Namespace は使用しないでください。このような名前空間は通常、Distributed Cloud コネクテッドで使用される予約済みの名前空間です。
Webhook を制限
Distributed Cloud connected では、Webhook は次のように制限されます。
- 作成した変更用 Webhook は、
kube-systemNamespace を自動的に除外します。 - 次のリソースタイプでは、ミューテーション Webhook が無効になっています。
nodespersistentvolumescertificatesigningrequeststokenreviews
Pod のランタイム クラスを構成する
Distributed Cloud connected では、runtimeClassName フィールドを使用して、構成内の Pod のランタイム クラスを指定できます。これにより、クラスタレベルで指定されたデフォルトのランタイム クラスがオーバーライドされます。使用可能なランタイム クラスは runc と gvisor です。次に例を示します。
apiVersion: v1
kind: Pod
metadata:
name: myPod
spec:
runtimeClassName: gvisor
containers:
- name: myPod
image: myPodImage
restartPolicy: OnFailure
Pod 構成でこれを省略すると、Pod はクラスタレベルで指定されたクラスを使用します。クラスタを作成して管理するで説明されているように、--default-container-runtime パラメータを使用してデフォルトのランタイム クラスを構成しない限り、デフォルトのクラスタレベルのランタイム クラスは runc です。
Pod レベルまたはクラスタレベルでランタイム クラスを変更した場合は、変更を有効にするために影響を受ける Pod を再起動する必要があります。
gvisor ランタイム クラス
gvisor ランタイム クラスを指定すると、Pod は gVisor に基づく Open Container Initiative(OCI)セキュア ランタイムに切り替わります。gVisor は、ワークロードとそのホスト間に強力な分離を導入するサンドボックス ソリューションです。
VPC Service Controls の統合を構成する
このセクションの手順を完了して、Distributed Cloud Edge Container API と VPC Service Controls の統合を構成します。詳しくは以下をご覧ください。
Pod のランタイム優先度を指定する
Distributed Cloud Connected では、priorityClassName フィールドを使用して、構成内の Pod の優先度クラスを指定できます。このフィールドには、ターゲットの優先度を指定する PriorityClass リソースの名前を指定します。次に例を示します。
kind: PriorityClass
metadata:
name: high-priority-class
value: 5100000
globalDefault: false
description: "High priority class for user workloads."
次の例に示すように、Pod 構成で優先度クラスの名前を指定します。
apiVersion: v1
kind: Pod
metadata:
name: myPod
spec:
priorityClassName: high-priority-class
containers:
- name: myPod
image: myPodImage
restartPolicy: OnFailure
優先度クラスを指定すると、デフォルトの Pod 優先度 0 がオーバーライドされます。重要なワークロードの場合は、優先度を 5000001~1000000000 の値に設定します。Distributed Cloud Connected は、優先度の低いワークロードを自動的にプリエンプトします。
必要な下り(外向き)ルール
Distributed Cloud Edge Container API を VPC Service Controls と統合するには、このセクションで説明する下り(外向き)ルールを構成する必要があります。下り(外向き)ルールの構文については、下り(外向き)ルールのリファレンスをご覧ください。
マシンゾーンと Google Cloud プロジェクトへのアクセス
このルールにより、呼び出し元 ID は、Distributed Cloud Edge Container API を使用して呼び出しを行うときに、マシンゾーンとプロジェクトにアクセスできます。 Google Cloud このルールは、マシンとクラスタが同じGoogle Cloud プロジェクトに存在せず、マシンの Google Cloud プロジェクトが境界外にある場合に適用されます。このルールは、VPC Service Controls を使用して境界内の Distributed Cloud Edge Container API を制限している場合に必要です。
JSON 形式のこのルールの egressFrom 構成の例を次に示します。
egressFrom:
identityType: ANY_SERVICE_ACCOUNT
sources:
- accessLevel: "*"
このルールの egressTo 構成の例を次に示します。
egressTo:
resources:
- "projects/280968151686"
operations:
- serviceName: "edgecontainer.googleapis.com"
methodSelectors:
- method: "*"
必要な上り(内向き)ルール
Distributed Cloud Edge Container API を VPC Service Controls と統合するには、このセクションで説明する上り(内向き)ルールを構成する必要があります。上り(内向き)ルールの構文については、上り(内向き)ルールのリファレンスをご覧ください。
Distributed Cloud Edge Container API へのアクセス
このルールにより、特定の ID が Distributed Cloud Edge Container API にアクセスして操作できるようになります。VPC Service Controls を使用して境界内で Distributed Cloud Edge Container API を制限し、Distributed Cloud Edge Container API を呼び出す ID が境界外にある場合は、このルールを構成する必要があります。
このルールの ingressFrom 構成の例を次に示します。
ingressFrom:
sources:
- accessLevel: '*'
identities:
- serviceAccount:testuser@kubernetesedge-e2e-testing.iam.gserviceaccount.com
このルールの ingressTo 構成の例を次に示します。
ingressTo:
resources:
- "*"
operations:
- serviceName: "edgecontainer.googleapis.com"
methodSelectors:
- method: "*"
Connect API と Security Token Service API へのアクセス
このルールにより、ワークロードは Connect API と Security Token Service API にアクセスできます。VPC Service Controls を使用して境界内の Connect API と Security Token Service API へのアクセスを制限している場合は、このルールを構成する必要があります。IP アドレス レベルでアクセス ポリシーを設定する方法については、IP アドレスをご覧ください。
このルールの ingressFrom 構成の例を次に示します。
- ingressFrom:
identityType: ANY_IDENTITY
sources:
- accessLevel: "accessPolicies/100637171436/accessLevels/fwi"
このルールの ingressTo 構成の例を次に示します。
ingressTo:
resources:
- "*"
operations:
- serviceName: "gkeconnect.googleapis.com"
methodSelectors:
- method: "*"
- serviceName: "sts.googleapis.com"
methodSelectors:
- method: "*"