始める前に

Google Cloud の外部で Kubernetes クラスタを登録するには、一般的な前提条件を満たすだけでなく、次の手順を実施する必要があります。

ネットワーク接続を確認

クラスタを正常に登録するには、次のドメインが Kubernetes クラスタから到達可能であることを確認する必要があります。

  • cloudresourcemanager.googleapis.com は、クラスタが接続されている Google Cloud プロジェクトに関するメタデータを解決します。
  • oauth2.googleapis.com は、gkeconnect.googleapis.com に対するエージェントのオペレーションのために、有効期間が短い OAuth トークンを取得します。
  • gkeconnect.googleapis.com は、Google Cloud からのリクエストの受信に使用するチャネルを確立し、レスポンスを発行します。
  • gkehub.googleapis.com は、Google Cloud に接続するクラスタに対応する Google Cloud 側のフリート メンバーシップ リソースを作成します。
  • www.googleapis.com は、受信した Google Cloud サービス リクエストからサービス トークンを認証します。
  • gcr.iostorage.googleapis.com は、GKE Connect エージェント イメージを pull します。

フリート Workload Identity を使用してクラスタを登録する場合は、次のドメインにも到達可能であることが必要です。

  • securetoken.googleapis.com
  • iamcredentials.googleapis.com
  • sts.googleapis.com

Connect でプロキシを使用している場合は、関連するドメインのプロキシの許可リストも更新する必要があります。

gcloud を使用して Kubernetes クラスタを登録する場合は、gcloud コマンドを実行する環境でこれらのドメインにも到達できる必要があります。

VPC Service Controls を使用する

アプリケーションのデータ セキュリティを強化するために VPC Service Controls を使用する場合は、次のサービスがサービス境界内にあることを確認する必要があります。

  • Resource Manager API(cloudresourcemanager.googleapis.com
  • GKE Connect API(gkeconnect.googleapis.com
  • Fleet API(gkehub.googleapis.com

フリートの Workload Identity を有効にしたクラスタを登録する場合は、次のサービスも必要です。

  • IAM Service Account Credentials API(iamcredentials.googleapis.com
  • Security Token Service API(sts.googleapis.com

また、関連する API にアクセスするためのプライベート接続を設定する必要があります。設定方法については、プライベート接続の設定をご覧ください。

ID を設定する

Google Cloud 外のすべての手動クラスタ登録オプションでは、Google に対する認証を構成する必要があります。このコードは次のいずれかです。

以下に説明するように、接続されたクラスタは、クラスタが接続されたクラスタの前提条件を満たしている場合に、フリート Workload Identity を有効にして登録できます。それ以外の場合は、接続されたクラスタを認証のために Google Cloud サービス アカウントに登録します。次のセクションでは、サービス アカウントを作成する方法について説明します。

gcloud を使用して Google Cloud サービス アカウントを作成する

Google Cloud サービス アカウントを使用してクラスタを手動で登録するには、サービス アカウントの認証情報が格納されている JSON ファイルが必要です。最小権限の原則に従うには、登録する Kubernetes クラスタごとに個別のサービス アカウントを作成し、対応するクラスタに IAM ロールのみをバインドすることをおすすめします。

このファイルを作成する際の手順は次のとおりです。

gcloud

次のコマンドを実行してサービス アカウントを作成します。

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME --project=FLEET_HOST_PROJECT_ID

次のコマンドを実行して、プロジェクトのすべてのサービス アカウントの一覧を取得します。

gcloud iam service-accounts list --project=FLEET_HOST_PROJECT_ID

登録する Kubernetes クラスタごとに個別のサービス アカウントを作成する場合は、クラスタのメンバーシップ名の IAM 条件で、対応するクラスタのサービス アカウントに gkehub.connect IAM ロールをバインドします。

MEMBERSHIP_NAME=MEMBERSHIP_NAME
FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
SERVICE_ACCOUNT_NAME=SERVICE_ACCOUNT_NAME
gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \
   --member="serviceAccount:${SERVICE_ACCOUNT_NAME}@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \
   --role="roles/gkehub.connect" \
   --condition "expression=resource.name == \
'projects/${FLEET_HOST_PROJECT_ID}/locations/global/memberships/${MEMBERSHIP_NAME}',\
title=bind-${SERVICE_ACCOUNT_NAME}-to-${MEMBERSHIP_NAME}"

それ以外の場合は、条件なしで、プロジェクト内のすべてのクラスタのサービス アカウントにロールをバインドします。

FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \
   --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \
   --role="roles/gkehub.connect"

サービス アカウントの秘密鍵の JSON ファイルをダウンロードします。このファイルは、クラスタを登録するときに使用します。

FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
gcloud iam service-accounts keys create LOCAL_KEY_PATH \
   --iam-account=SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com \
   --project=${FLEET_HOST_PROJECT_ID}

ここで

  • FLEET_HOST_PROJECT_ID は、クラスタを登録する Google Cloud プロジェクト ID です。この値の確認方法をご覧ください
  • SERVICE_ACCOUNT_NAME は、[サービス アカウント] に付ける表示名です。
  • MEMBERSHIP_NAME は、クラスタを登録するときにクラスタを一意に表すために選択するメンバーシップ名です。
  • LOCAL_KEY_PATH は、サービス アカウントの秘密鍵の JSON ファイルを保存するローカル ファイルパスです。ファイル名にサービス アカウント名とプロジェクト ID を使用することをおすすめします(例: /tmp/creds/[SERVICE_ACCOUNT_NAME]-[FLEET_HOST_PROJECT_ID].json)。

接続されたクラスタの前提条件

接続されたクラスタとして登録するサードパーティ Kubernetes クラスタの種類によっては、Connect Agent のインストールや、フリート Workload Identity を使用するための、いくつかの追加要件を満たすことが必要になる場合があります。

セキュリティ コンテキストの制約(SCC)を構成する(OpenShift クラスタ)

OpenShift OKE クラスタと OKD クラスタでは、管理者は SCC を使用して Pod の権限を制御できます。クラスタに Connect Agent をインストールすることを許可するには、カスタム SCC を作成する必要があります。

次の SCC 定義の例は、Connect Agent がクラスタへの参加が認められるために満たす必要がある一連の実行条件を示しています。

# Connect Agent SCC
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
  name: gke-connect-scc
allowPrivilegeEscalation: false
# This is redundant with non-root + disallow privilege escalation,
# but we provide it for defense in depth.
requiredDropCapabilities:
- ALL
runAsUser:
  type: MustRunAsNonRoot
seLinuxContext:
  type: RunAsAny
supplementalGroups:
  type: MustRunAs
  ranges:
  - min: 1
    max: 65535
fsGroup:
  type: MustRunAs
  ranges:
  - min: 1
    max: 65535
volumes:
- secret
- projected
readOnlyRootFilesystem: true
seccompProfiles:
- docker/default
users:
groups:
  # Grants all service accounts in the gke-connect namespace access to this SCC
  - system:serviceaccounts:gke-connect

SCC 定義を gke-connect-scc.yaml として保存したことを前提として、OpenShift oc コマンドライン ツールを使用して次のようにクラスタの gke-connect-scc SCC を作成します。

$ oc create -f gke-connect-scc.yaml

カスタム SCC が作成されたことを確認するには、次の oc コマンドを実行します。

$ oc get scc | grep gke-connect-scc

フリートの Workload Identity の要件

プラットフォームがクラスタのパブリック OIDC エンドポイントを作成する場合(または作成できるようにする場合)、またはクラスタに対して Kubernetes サービス アカウントの発行元の検出を有効にしている場合は、フリートの Workload Identity を有効にして接続されたクラスタを登録できます。これらの要件を満たせない場合は、認証のために、接続されたクラスタを Google Cloud サービス アカウントに登録する必要があります。

具体的なクラスタの種類は、次のとおりです。

  • OpenShift クラスタ: 上記のようにカスタム SCC を構成した後、フリートの Workload Identity を有効にして登録できます。
  • kind クラスタ: フリートの Workload Identity を使用するために、サービス アカウント発行元の検出を有効にする必要があります。Kubernetes バージョン 1.20 以降、これはデフォルトで有効になっています。この機能を有効にする必要がある場合は、サービス アカウント トークン ボリューム プロジェクションの手順に沿ってください。サービス アカウント トークン ボリューム プロジェクトを有効にすると、サービス アカウント発行元の検出が自動的に有効になります。

次のステップ

手順に沿ってクラスタを登録する