如需在 Google Distributed Cloud (GDC) 网闸隔离环境中使用 Terraform,您必须下载并配置 Terraform,以便其处理 Kubernetes 资源。
准备工作
按照 HashiCorp 提供的文档,将 Terraform 1.6.3 或更高版本下载到您的工作站:https://developer.hashicorp.com/terraform/install。本文档中的后端配置使用的设置不受旧版 Terraform 支持。
确保您的系统可以识别对象存储区使用的证书授权机构 (CA) 证书。
管理状态文件
Terraform 中的状态文件用于记录部署的当前状态,并将其映射到 Terraform 配置。由于 GDC 对象存储区是使用 S3 实现的,因此您可以使用 Terraform S3 API 与共享状态文件同步。为此,您必须将 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 校验和。
在您在上一步中指定的存储桶中初始化新的状态文件修改:
terraform init
设置权限
除了使用 Terraform 执行特定任务(例如创建 GDC 项目)所需的权限之外,您还必须拥有在该范围内查看自定义资源定义的权限。应用使用 Terraform 所需的权限:
创建
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 服务器。将上一步中定义的集群角色绑定到用户:
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 资源。
在模块内的 Terraform 文件(例如
main.tf文件)中,插入以下required_providers代码块:terraform { required_providers { kubernetes = { source = "hashicorp/kubernetes" version = ">=2.24.0" } } }初始化 Terraform 工作目录以安装提供程序:
terraform init