高级安装选项

本主题提供在 Google Kubernetes Engine (GKE) 集群上安装 Config Connector 的两个额外安装选项:

  • 手动安装:手动安装方法可以提供比使用插件更快的更新速度。此方法还提供更多配置选项。例如,您可以提高 Config Connector Operator 的 CPU 限制。
  • 命名空间模式:此方法是 Config Connector 安装的扩展。命名空间模式支持管理多个项目,每个项目都有自己的 Google Cloud 身份。

如需详细了解这些安装类型,请参阅选择安装类型

手动安装 Config Connector Operator

以下部分介绍如何手动安装 Config Connector Operator。

准备工作

在手动安装 Config Connector Operator 之前,请完成以下步骤:

安装 Config Connector Operator

Config Connector 使用 Kubernetes Operator 使其安装保持最新。如需安装此 Operator,请完成以下步骤:

  1. 下载最新的 Config Connector tar 文件:

    gsutil cp gs://configconnector-operator/latest/release-bundle.tar.gz release-bundle.tar.gz
    
  2. 解压缩 tar 文件:

    tar zxvf release-bundle.tar.gz
    
  3. 在集群上安装 Config Connector Operator:

    kubectl apply -f operator-system/configconnector-operator.yaml
    

创建身份

Config Connector 通过使用 Identity and Access Management (IAM) 服务帐号进行身份验证以及使用 GKE 的 Workload Identity 将 IAM 服务帐号与 Kubernetes 服务帐号绑定来创建和管理 Google Cloud 资源。

如需创建身份,请完成以下步骤:

  1. 创建 IAM 服务帐号。 如果您希望使用现有服务帐号,则可以使用该帐号并跳过此步骤。

    如需创建服务帐号,请使用以下命令:
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
    SERVICE_ACCOUNT_NAME 替换为您的服务帐号的名称。
  2. 如需详细了解如何创建服务帐号,请参阅创建和管理服务帐号

  3. 向 IAM 服务帐号授予对项目的提升权限:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/owner"
    替换以下内容:
    • PROJECT_ID 替换为您的项目 ID。
    • SERVICE_ACCOUNT_NAME 替换为您的服务帐号的名称。
  4. 在 IAM 服务帐号与 Config Connector 运行的预定义 Kubernetes 服务帐号之间创建 IAM 政策绑定:
    gcloud iam service-accounts add-iam-policy-binding \
    SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member="serviceAccount:PROJECT_ID.svc.id.goog[cnrm-system/cnrm-controller-manager]" \
        --role="roles/iam.workloadIdentityUser"
    替换以下内容:
    • SERVICE_ACCOUNT_NAME 替换为您的服务帐号的名称。
    • PROJECT_ID 替换为您的项目 ID。

配置 Config Connector

要完成安装,请为 ConfigConnector CustomResource 创建配置文件,然后使用 kubectl apply 命令应用该配置文件。Config Connector Operator 在集群中安装 Google Cloud Resource CRD 和 Config Connector 组件。

要配置 Operator,请完成以下步骤:

  1. 将以下 YAML 文件复制到名为 configconnector.yaml 的文件中:
    # configconnector.yaml
    apiVersion: core.cnrm.cloud.google.com/v1beta1
    kind: ConfigConnector
    metadata:
      # the name is restricted to ensure that there is only one
      # ConfigConnector resource installed in your cluster
      name: configconnector.core.cnrm.cloud.google.com
    spec:
     mode: cluster
     googleServiceAccount: "SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
    
    替换以下内容:
    • SERVICE_ACCOUNT_NAME 替换为您的服务帐号的名称。
    • PROJECT_ID 替换为您的项目 ID。
  2. 使用 kubectl apply 将配置应用到集群:
      kubectl apply -f configconnector.yaml

指定创建资源的位置

Config Connector 可以按项目、文件夹或组织整理资源,这与使用 Google Cloud 整理资源的方式相同。

在使用 Config Connector 创建资源之前,必须先配置创建资源的位置。为了确定创建资源的位置,Config Connector 会在资源配置或现有命名空间中使用注释。如需了解详情,请参阅整理资源

如果您没有可用于此目的的命名空间,请使用 kubectl 创建一个命名空间。
kubectl create namespace NAMESPACE

NAMESPACE 替换为您的命名空间名称。 例如 config-connector

选择一个标签页以便选择 Config Connector 创建资源的位置。

项目

如需在特定项目中创建资源,请运行以下命令:

    kubectl annotate namespace \
    NAMESPACE cnrm.cloud.google.com/project-id=PROJECT_ID

请替换以下内容:

  • NAMESPACE 替换为您的命名空间名称。
  • PROJECT_ID 替换为 Google Cloud 项目 ID。

Folder

如需在特定文件夹中创建资源,请运行以下命令:

    kubectl annotate namespace \
    NAMESPACE cnrm.cloud.google.com/folder-id=FOLDER_ID

请替换以下内容:

  • NAMESPACE 替换为您的命名空间名称。
  • FOLDER_ID 替换为您的 Google Cloud 文件夹 ID。

组织

如需在特定组织中创建资源,请运行以下命令:

    kubectl annotate namespace \
    NAMESPACE cnrm.cloud.google.com/organization-id=ORGANIZATION_ID

请替换以下内容:

  • NAMESPACE 替换为您的命名空间名称。
  • ORGANIZATION_ID 替换为您的 Google Cloud 组织 ID。

为命名空间添加注释时,Config Connector 将在相应的项目、文件夹或组织中创建资源。如需详细了解 Config Connector 如何使用 Kubernetes 命名空间,请参阅 Kubernetes 命名空间和 Google Cloud 项目

验证安装

Config Connector 在命名空间 cnrm-system 中运行其所有组件。您可以通过运行以下命令来验证 Pod 是否准备就绪:

kubectl wait -n cnrm-system \
      --for=condition=Ready pod --all

如果正确安装了 Config Connector,则输出类似于以下内容:

pod/cnrm-controller-manager-0 condition met

升级 Config Connector

下载并安装最新版本的 Config Connector Operator:

gsutil cp gs://configconnector-operator/latest/release-bundle.tar.gz release-bundle.tar.gz
tar zxvf release-bundle.tar.gz
kubectl apply -f operator-system/configconnector-operator.yaml

卸载 Config Connector

使用 kubectl delete 移除 Config Connector CRD 和控制器组件:

kubectl delete ConfigConnector configconnector.core.cnrm.cloud.google.com \
    --wait=true

如需卸载 Config Connector Operator,请运行以下命令:

kubectl delete -f operator-system/configconnector-operator.yaml  --wait=true

使用命名空间模式安装 Config Connector

以下部分介绍如何启用命名空间模式。

准备工作

在将 Config Connector 配置为在命名空间模式下运行之前,请确保已启用 Config Connector GKE 插件手动安装的 Config Connector Operator

将 Config Connector 配置为在命名空间模式下运行

如需启用命名空间模式,请完成以下步骤:

  1. 将以下 YAML 清单复制到名为 configconnector.yaml 的文件中:

    apiVersion: core.cnrm.cloud.google.com/v1beta1
    kind: ConfigConnector
    metadata:
      # the name is restricted to ensure that there is only ConfigConnector resource installed in your cluster
      name: configconnector.core.cnrm.cloud.google.com
    spec:
     mode: namespaced
    
  2. 使用 kubectl apply 将配置应用到集群:

    kubectl apply -f configconnector.yaml
    

配置 Config Connector 以管理命名空间中的资源

在以下部分中,您安装配置连接器的 Google Cloud 项目称为“宿主项目”HOST_PROJECT_ID。您管理资源的其他项目称为“代管式项目”MANAGED_PROJECT_ID。如果您仅打算使用 Config Connector 在与您的集群相同的项目中创建 Google Cloud 资源,则这些项目可能是同一项目。

创建命名空间

如果您已有用于组织 Google Cloud 资源的命名空间,则可以跳过此步骤。

通过运行以下命令,使用 kubectl 创建新的命名空间:

kubectl create namespace NAMESPACE

NAMESPACE 替换为命名空间的名称。

创建身份

创建 Identity and Access Management (IAM) 服务帐号并在 IAM 服务帐号和 Config Connector 的 Kubernetes 服务帐号之间创建绑定:

  1. 创建 IAM 服务帐号。 如果您原本有一个服务帐号,则可以使用原有的帐号,而不必新建服务帐号。通过运行以下命令,使用 gcloud 创建服务帐号:

    gcloud iam service-accounts create NAMESPACE_GSA --project HOST_PROJECT_ID
    

    请替换以下内容:

    • NAMESPACE_GSA 替换为绑定到命名空间的 Google 服务帐号 (GSA) 的名称。
    • HOST_PROJECT_ID 替换为您的宿主项目 ID。

    如需详细了解如何创建服务帐号,请参阅创建和管理服务帐号

  2. 向 IAM 服务帐号授予对代管项目的提升权限:

    gcloud projects add-iam-policy-binding MANAGED_PROJECT_ID \
        --member="serviceAccount:NAMESPACE_GSA@HOST_PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/owner"
    

    请替换以下内容:

    • MANAGED_PROJECT_ID 替换为您的代管项目 ID。
    • NAMESPACE_GSA 替换为绑定到命名空间的 Google 服务帐号的名称。
    • HOST_PROJECT_ID 替换为您的宿主项目 ID。
  3. 在 IAM 服务帐号和 Config Connector Kubernetes 服务帐号之间创建 IAM 政策绑定。您可以通过运行以下 gcloud 命令来绑定服务帐号:

    gcloud iam service-accounts add-iam-policy-binding \
    NAMESPACE_GSA@HOST_PROJECT_ID.iam.gserviceaccount.com \
        --member="serviceAccount:HOST_PROJECT_ID.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
        --role="roles/iam.workloadIdentityUser" \
        --project HOST_PROJECT_ID
    

    请替换以下内容:

    • HOST_PROJECT_ID 替换为您的宿主项目 ID。
    • NAMESPACE_GSA 替换为绑定到命名空间的 Google 服务帐号的名称。
    • NAMESPACE 替换为您的命名空间。
  4. 向 IAM 服务帐号授予在宿主项目上将 Prometheus 指标发布到 Google Cloud 的运维套件的权限。

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member="serviceAccount:NAMESPACE_GSA@HOST_PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"
    

    请替换以下内容:

    • HOST_PROJECT_ID 替换为您的宿主项目 ID。
    • NAMESPACE_GSA 替换为绑定到命名空间的 Google 服务帐号的名称。

创建 ConfigConnectorContext

如需创建 Google Cloud 资源,您需要配置 Config Connector 以监视命名空间,具体方法是在要使用的命名空间中添加 ConfigConnectorContext 对象。

要创建 ConfigConnectorContext,请完成以下步骤:

  1. 将以下 YAML 清单复制到名为 configconnectorcontext.yaml 的文件中:

    apiVersion: core.cnrm.cloud.google.com/v1beta1
    kind: ConfigConnectorContext
    metadata:
      # you can only have one ConfigConnectorContext per namespace
      name: configconnectorcontext.core.cnrm.cloud.google.com
      namespace: NAMESPACE
    spec:
      googleServiceAccount: "NAMESPACE_GSA@HOST_PROJECT_ID.iam.gserviceaccount.com"
    

    请替换以下内容:

    • NAMESPACE 替换为您的命名空间名称。
    • NAMESPACE_GSA 替换为绑定到命名空间的 Google 服务帐号的名称。
    • HOST_PROJECT_ID 替换为您的宿主项目 ID。
  2. 使用 kubectl 将文件应用到集群:

    kubectl apply -f configconnectorcontext.yaml
    
  3. 使用 kubectl 验证 Config Connector Operator 是否为您的命名空间创建了 Kubernetes 服务帐号,运行以下命令:

    kubectl get serviceaccount/cnrm-controller-manager-NAMESPACE  -n cnrm-system
    

    NAMESPACE 替换为您的命名空间名称。

  4. 使用 kubectl 验证 Config Connector 控制器 Pod 是否正在为您的命名空间运行,运行以下命令:

    kubectl wait -n cnrm-system \
        --for=condition=Ready pod \
        -l cnrm.cloud.google.com/component=cnrm-controller-manager \
        -l cnrm.cloud.google.com/scoped-namespace=NAMESPACE
    

    NAMESPACE 替换为您的命名空间名称。

    如果 Config Connector 控制器正在运行,则输出类似于:

    cnrm-controller-manager-abcdefghijk-0 condition met.
    

配置 Config Connector 以不再管理命名空间中的资源

如需配置 Config Connector 以不再管理命名空间,请移除命名空间中的所有 Config Connector 资源并删除命名空间中的 ConfigConnectorContext

移除命名空间中的 Config Connector 资源

如需最终移除 ConfigConnectorContext,请从命名空间中移除所有 Config Connector 资源。

  1. 如需发现命名空间中的所有 Config Connector 资源,请列出每个 Config Connector 自定义资源定义中的所有资源。

    kubectl get crds --selector cnrm.cloud.google.com/managed-by-kcc=true \
    -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | xargs -n 1 \
    kubectl get -o jsonpath='{range .items[*]}{" Kind: "}{@.kind}{"Name: "}{@.metadata.name}{"\n"}{end}' \
    --ignore-not-found -n NAMESPACE
    

    NAMESPACE 替换为您的命名空间名称。

  2. 如需移除所有 Config Connector 资源,请针对上一步输出中的每个资源发出删除命令。

    kubectl delete -n NAMESPACE KIND NAME
    

    请替换以下内容:

    • NAMESPACE:您的命名空间名称
    • KIND:在上一步中发现的资源种类
    • NAME:在上一步中发现的资源的名称

移除 ConfigConnectorContext

如需配置 Config Connector 以不再管理命名空间中的 Config Connector 资源,请删除命名空间中的 ConfigConnectorContext

  kubectl delete -n NAMESPACE ConfigConnectorContext configconnectorcontext.core.cnrm.cloud.google.com

NAMESPACE 替换为您的命名空间名称。

在从命名空间中移除所有 Config Connector 资源之前,删除 ConfigConnectorContext 不会完成。

从非 Operator 安装升级

Config Connector 1.33.0 版及更高版本仅支持使用 GKE 插件或 Operator 进行安装。

如需升级到 Operator(并保留所有 Config Connector 资源),您必须移除除 CRD 之外的所有 Config Connector 系统组件,然后安装 Operator。

  1. 运行以下命令以移除 Config Connector 系统非 CRD 组件:

    kubectl delete sts,deploy,po,svc,roles,clusterroles,clusterrolebindings --all-namespaces -l cnrm.cloud.google.com/system=true --wait=true
    kubectl delete validatingwebhookconfiguration abandon-on-uninstall.cnrm.cloud.google.com --ignore-not-found --wait=true
    kubectl delete validatingwebhookconfiguration validating-webhook.cnrm.cloud.google.com --ignore-not-found --wait=true
    kubectl delete mutatingwebhookconfiguration mutating-webhook.cnrm.cloud.google.com --ignore-not-found --wait=true
    
  2. 使用 GKE 插件Operator 安装 Config Connector。

从插件切换为手动安装

作为插件安装时,Config Connector 的版本与已安装的 GKE 版本直接相关。

手动安装可以加快更新速度,但需要进行手动升级。

如需在保证安全的同时保留所有资源,请执行以下操作:

  1. 停用插件,而不删除任何 ConfigConnectorConfigConnectorContext 对象

    gcloud container clusters update CLUSTER_NAME --update-addons ConfigConnector=DISABLED
    

    CLUSTER_NAME 替换为您在其中安装 Config Connector 的集群的名称。

  2. 按照说明安装所需版本的手动 Operator

问题排查

以下部分提供有关 Config Connector 安装的问题排查提示。

排查资源协调权限问题

如果 Config Connector 无法成功协调资源,并且日志包含错误消息 The caller does not have permission, forbidden.,则说明您的 GKE 集群和/或节点池可能未启用 Workload Identity。

如需进行调查,请完成以下步骤:

  1. 将以下 Pod 配置保存为 wi-test.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: workload-identity-test
      namespace: cnrm-system
    spec:
      containers:
      - image: google/cloud-sdk:slim
        name: workload-identity-test
        command: ["sleep","infinity"]
      serviceAccountName: cnrm-controller-manager
    
  2. 在您的 GKE 集群中创建 Pod:
    kubectl apply -f wi-test.yaml
    
  3. 在 Pod 中打开交互式会话:
    kubectl exec -it workload-identity-test \
      --namespace cnrm-system \
      -- /bin/bash
    
  4. 列出您的身份:
    gcloud auth list
    
  5. 验证列出的身份是否与绑定到您的资源的 Google 服务帐号相匹配。

    如果改为显示 Compute Engine 默认服务帐号,则说明未在 GKE 集群和/或节点池上启用 Workload Identity。

  6. 退出交互式会话,然后从 GKE 集群中删除 Pod:
    kubectl delete pod workload-identity-test \
    --namespace cnrm-system
    

后续步骤