使用 Terraform

如需在 Google Distributed Cloud (GDC) 网闸隔离环境中配置 Terraform,您必须下载该工具并将其配置为处理 Kubernetes 资源。

本文档适用于需要设置 Terraform 来管理其经过网闸隔离的硬件和软件工作流的所有受众群体。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。

准备工作

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

  • 验证您是否有现有的 GDC 存储桶。 如果您没有存储桶,请创建一个。如需了解详情,请参阅创建存储桶。

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

  • 安装 gdcloud CLI。如需了解详情,请参阅使用 gdcloud CLI。

  • 为托管您要使用 Terraform 管理的资源的 API 服务器或集群生成 kubeconfig 文件。如需了解详情,请参阅获取 kubeconfig 文件。

设置 Terraform

如需在 GDC 环境中设置 Terraform,请完成以下操作:

  1. 在 Terraform 模块或工作站上的 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 状态文件:

    terraform init
    
  3. 部署 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"]
    ---
    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
    

    替换以下内容:

    • KUBECONFIG:托管您使用 Terraform 管理的资源的 API 服务器或集群的 kubeconfig 文件。

    • USER_EMAIL:要将该角色绑定到的用户的邮箱。

    将 crd-viewer 角色部署到您要使用 Terraform 的每个 API 服务器或集群。

  4. 在 main.tf 文件中,插入以下 required_providers 代码块:

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = ">=2.24.0"
        }
      }
    }
    

    此配置会安装 Kubernetes 提供程序,以在 GDC 环境中预配和管理 Kubernetes 资源。

  5. 初始化 Terraform 工作目录以安装提供程序:

    terraform init
    

后续步骤