跳至内容

Terraform

使用 Terraform 构建 Kubernetes 集群

kOps 可以生成 Terraform 配置,然后您可以使用 terraform planterraform apply 工具来应用它们。如果您已经使用 Terraform,或者您想将 Terraform 输出签入版本控制,这非常方便。

简而言之,您不再让 kOps 应用更改,而是告诉 kOps 您想要什么,然后 kOps 会将它想要执行的操作输出到 .tf 文件中。 然后负责将这些计划变为现实。

Terraform 输出应该比较稳定(即,文本文件应该只在实际发生更改时才会更改 - 项应该按相同顺序出现等)。当使用版本控制时,这非常有用,因为您可以轻松地比较您的更改。

请注意,如果您修改了 kOps 生成的 Terraform 文件,它将使用其自身配置定义的配置状态覆盖您的更改。换句话说,kOps 的自身状态是最终的真相来源(就 kOps 而言),而 Terraform 是为了您的方便而对该状态的表示。

Terraform 版本兼容性

kOps 版本 Terraform 版本 功能标志说明
>= 1.19 >= 0.12.26, >= 0.13 默认情况下支持 HCL2
KOPS_FEATURE_FLAGS=Terraform-0.12 现在已弃用
>= 1.18 >= 0.12 默认情况下支持 HCL2
>= 1.18 < 0.12 KOPS_FEATURE_FLAGS=-Terraform-0.12
>= 1.17, < 1.23 >= 0.12 KOPS_FEATURE_FLAGS=TerraformJSON 输出 JSON
<= 1.17 < 0.12 默认情况下支持

使用 Terraform

设置远程状态

您可以将 Terraform 状态保存在本地,但我们强烈建议将其保存到 S3 上,并为该存储桶开启版本控制。使用如下设置配置远程 S3 存储

terraform {
  backend "s3" {
    bucket = "terraform_state_bucket"
    key    = "path/to/my/key"
    region = "us-east-1"
  }
}

了解有关 Terraform 状态 的更多信息。

初始化/创建集群

例如,完整的设置可能如下所示

$ kops create cluster \
  --name=kubernetes.mydomain.com \
  --state=s3://mycompany.kops_state_bucket \
  --dns-zone=kubernetes.mydomain.com \
  [... your other options ...]
  --out=. \
  --target=terraform

上面的命令将在 S3 上创建 kOps 状态存储(在 --state 中定义)并将您的配置的表示输出到 Terraform 文件中。之后,您可以在 kubernetes.tf 中预览您的更改,然后使用 Terraform 创建所有资源,如下所示

在此阶段可以添加额外的 Terraform .tf 文件来自定义您的部署,但请记住,kOps 状态应该继续作为 Kubernetes 集群的最终真相来源。

初始化 Terraform 以设置 S3 后端和提供程序插件。

$ terraform init

如果您使用的是 Terraform v0.12.26+,则会显示以下警告,可以安全地忽略。如果您使用的是 Terraform v0.13.0+,则不会显示此警告。

Warning: Provider source not supported in Terraform v0.12

  on kubernetes.tf line 665, in terraform:
 665:     aws = {
 666:       "source"  = "hashicorp/aws"
 667:       "version" = ">= 2.46.0"
 668:     }

A source was declared for provider aws. Terraform v0.12 does not support the   
provider source attribute. It will be ignored.

使用 Terraform 来审查和创建云基础设施和 Kubernetes 集群。

$ terraform plan
$ terraform apply

等待集群初始化。如果一切顺利,您应该拥有一个可用的 Kubernetes 集群!

编辑集群

可以使用 Terraform 对由 kOps 定义的基础设施进行更改。在下面的示例中,我们想更改一些集群配置

$ kops edit cluster \
  --name=kubernetes.mydomain.com \
  --state=s3://mycompany.kops_state_bucket

# editor opens, make your changes ...

然后将您的更改/编辑输出到 kOps 集群状态到 Terraform 文件中。使用 --target--out 参数运行 kops update

$ kops update cluster \
  --name=kubernetes.mydomain.com \
  --state=s3://mycompany.kops_state_bucket \
  --out=. \
  --target=terraform

然后在预览将应用的更改后应用更改

$ terraform plan
$ terraform apply

注意:您不限于集群编辑,例如 kops edit cluster。您还可以编辑实例组,例如 kops edit instancegroup nodes|bastions 等。

请记住,某些更改将需要 kops rolling-update 才能应用。如有疑问,请运行该命令并检查是否需要更新任何节点。有关更多信息,请参阅下面的 注意事项 部分。

拆卸集群

当您最终 terraform destroy 集群时,您仍然应该运行 kops delete cluster,以删除 kOps 集群规范和任何动态创建的 Kubernetes 资源(ELB 或卷)。为此,请运行

$ terraform plan -destroy
$ terraform destroy
$ kops delete cluster --yes \
  --name=kubernetes.mydomain.com \
  --state=s3://mycompany.kops_state_bucket

注意:如果您只想从头开始重新创建,则无需 kops delete cluster。删除 kOps 集群状态意味着您必须再次 kops create

注意事项

kops rolling-update 可能需要在编辑集群后运行

使用 kops edit 进行的更改(如启用 RBAC 和/或功能网关)将导致集群节点 LaunchTemplate 的更改。在 terraform apply 后,它们不会立即应用,因为 terraform 不会将新的实例作为该操作的一部分启动。

要查看对集群应用的更改,您还需要在运行 terraform apply 后运行 kops rolling-update。这将确保所有节点的更改都使用 kops edit 配置了所需的设置。