Terraform
使用 Terraform 构建 Kubernetes 集群 ¶
kOps 可以生成 Terraform 配置,然后您可以使用 terraform plan
和 terraform apply
工具来应用它们。如果您已经使用 Terraform,或者您想将 Terraform 输出签入版本控制,这非常方便。
简而言之,您不再让 kOps 应用更改,而是告诉 kOps 您想要什么,然后 kOps 会将它想要执行的操作输出到 .tf
文件中。您 然后负责将这些计划变为现实。
Terraform 输出应该比较稳定(即,文本文件应该只在实际发生更改时才会更改 - 项应该按相同顺序出现等)。当使用版本控制时,这非常有用,因为您可以轻松地比较您的更改。
请注意,如果您修改了 kOps 生成的 Terraform 文件,它将使用其自身配置定义的配置状态覆盖您的更改。换句话说,kOps 的自身状态是最终的真相来源(就 kOps 而言),而 Terraform 是为了您的方便而对该状态的表示。
Terraform 版本兼容性 ¶
kOps 版本 | Terraform 版本 | 功能标志说明 |
---|---|---|
>= 1.19 | >= 0.12.26, >= 0.13 | 默认情况下支持 HCL2KOPS_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
配置了所需的设置。