配置 Terraform

如需在 Google Distributed Cloud (GDC) 网闸隔离环境中使用 Terraform,您必须下载并配置 Terraform,以便其处理 Kubernetes 资源。

准备工作

  • 按照 HashiCorp 提供的文档,将 Terraform 1.6.3 或更高版本下载到您的工作站:https://developer.hashicorp.com/terraform/install。本文档中的后端配置使用的设置不受旧版 Terraform 支持。

  • 验证您是否已有 GDC 存储桶。如果您没有存储桶,请创建一个。

  • 确保您的系统可以识别对象存储区使用的证书授权机构 (CA) 证书。

管理状态文件

Terraform 中的状态文件用于记录部署的当前状态,并将其映射到 Terraform 配置。由于 GDC 对象存储区是使用 S3 实现的,因此您可以使用 Terraform S3 API 与共享状态文件同步。为此,您必须将 Terraform 配置为与远程状态同步:

  1. 将以下配置添加到存储在本地的 Terraform 文件(例如 main.tf 文件)中:

    terraform {
      backend "s3" {
        bucket = "BUCKET_FQN"
        key = "TF_STATE_PATH"
        region = "ZONE"
        endpoints = {
          s3 = "BUCKET_ENDPOINT"
        }
        use_path_style = true
        access_key = "ACCESS_KEY"
        secret_key = "SECRET_KEY"
        skip_credentials_validation = true
        skip_requesting_account_id = true
        skip_metadata_api_check = true
        skip_region_validation = true
        skip_s3_checksum = true
      }
    }
    

    替换以下内容:

    • BUCKET_FQN:Bucket 自定义资源中的 status.fullyQualifiedName 值。例如 aabc2z8-platform-terraform-state。

    • TF_STATE_PATH:要存储在存储桶中的 Terraform 状态文件的路径。例如 main.tfstate。

    • ZONE:Bucket 自定义资源 (status.region) 的可用区。例如 zone1。Terraform 需要区域值,但 GDC 对象存储区不会检查该值。

    • BUCKET_ENDPOINT:Bucket 自定义资源中的 status.endpoint 值。例如 https://objectstorage.org-1.zone1.google.gdch.test。

    • ACCESS_KEY:从包含访问凭证的 Secret 中获取的访问密钥。按照获取存储桶访问凭证中的说明获取访问密钥。Secret 中的值采用 base64 编码。请先对其进行解码,然后再使用。

    • SECRET_KEY:从包含访问凭证的 Secret 中获取的密钥。按照获取存储桶访问凭证中的说明获取密钥。Secret 中的值采用 base64 编码。请先对其进行解码,然后再使用。

    GDC 对象存储区与 S3 兼容,但不是 AWS。其余设置用于为非 AWS S3 存储配置后端:

    • use_path_style:对 GDC 对象存储区使用路径样式存储桶寻址。

    • skip_credentials_validation 和 skip_requesting_account_id:阻止 Terraform 调用 AWS STS 和 AWS IAM。GDC 不提供这些服务。

    • skip_metadata_api_check:阻止 Terraform 查询 AWS EC2 元数据服务。

    • skip_region_validation:允许您将可用区名称用作区域。

    • skip_s3_checksum:阻止 Terraform 在上传状态文件时请求 SHA-256 校验和。

  2. 在您在上一步中指定的存储桶中初始化新的状态文件修改:

    terraform init
    

设置权限

除了使用 Terraform 执行特定任务(例如创建 GDC 项目)所需的权限之外,您还必须拥有在该范围内查看自定义资源定义的权限。应用使用 Terraform 所需的权限:

  1. 创建 crd-viewer 集群角色资源:

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: crd-viewer
    rules:
    - apiGroups: ["apiextensions.k8s.io"]
      resources: ["customresourcedefinitions"]
      verbs: ["get", "list", "watch"]
    EOF
    

    将 KUBECONFIG 替换为托管您使用 Terraform 管理的资源的 API 服务器或集群的 kubeconfig 文件。例如,大多数资源都在 Management API 服务器上运行。对于容器工作负载,请设置 Kubernetes 集群 kubeconfig 文件。如果您要管理全球性资源,请务必设置全球性 API 服务器。

  2. 将上一步中定义的集群角色绑定到用户:

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: crd-viewer-binding
    subjects:
    - kind: User
      name: USER_EMAIL
    roleRef:
      kind: ClusterRole
      name: crd-viewer
      apiGroup: rbac.authorization.k8s.io
    EOF
    

针对要为其设置 Terraform 权限的每个 API 服务器或集群重复上述步骤。

安装和配置 Terraform 提供程序

您必须安装 Kubernetes 提供程序才能预配和管理 Kubernetes 资源。

  1. 在模块内的 Terraform 文件(例如 main.tf 文件)中,插入以下 required_providers 代码块:

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = ">=2.24.0"
        }
      }
    }
    
  2. 初始化 Terraform 工作目录以安装提供程序:

    terraform init