使用Terraform云业务,管理位于Tanzu上的Kubernetes资源
我在HashiCorp Japan担任解决方案工程师,我是伊藤忠司。
今天是TUNA-JP(Tanzu User kNowledge Assembly日本)的第20天,我想介绍一下HashiCorp提供的Terraform Cloud Business中可使用的Terraform Cloud Agent,在Tanzu上运行,并使用Terraform框架来管理Tanzu上的Kubernetes资源。
本文以以下的方式进行说明。
目录
-
- Terraform Cloud Businessとは
-
- Terraform Cloud Agentとは
-
- Terraform Cloud Agentのセットアップ
-
- Terraform Cloud AgentのKubernetesへのデプロイ
-
- Terraformを使ったKubernetesリソースのプロビジョニング
- まとめ
Terraform云业务是什么?
首先,谈谈Terraform Cloud Business(以下简称TFCB)。TFCB是由HashiCorp提供的Terraform Cloud(以下简称TFC)的付费版本,它是一种托管服务。
Terraform是IaC的一种工具,它可以将与配置环境相关的手动运维工作转化为代码并自动化。
与其人们直接操作云端的图形用户界面(GUI)或应用程序接口(API)来执行任务,我们可以使用Terraform来代替,它会根据代码执行云端的API,并进行基础设施的配置。通过这种方式,我们可以减少人们必须要执行的工作量。
而且,Terraform在多云环境中可以使用相同的机制,因此,不论是AWS、Azure、GCP还是vSphere作为配置目标,都可以使用相同的工作流、相同的配置元素和相同的语法来进行配置,具有非常高的通用性。

只需一个选项,用中文将以下内容改写:
使用Hashicorp Configuration Language(以下简称HCL)编写的源代码,并使用变量来提供诸如部署基础架构时所需的机密信息等,然后执行terraform plan命令以完成云端基础架构的配置。
这样一来,当Terraform执行HCL时,它会输出有关计划内容的信息,告诉我们会进行哪些更改。然后,我们会对计划内容进行审核。
审核该内容是否符合公司内部的政策,有时候会提出修正请求,如果内容没有问题,则执行terraform apply进行配置,进行供应工作流程。
当成功完成配置后,将生成一个描述基础设施状态的文件,这个文件被称为状态文件。
在像更新基础设施这样的情况下,需要执行terraform plan来进行审核,并且更新的HCL、最新的状态文件和必要的变量一起使用;如果没有问题,会继续进行terraform apply的工作流程。
然而,要安全地使用Terraform,需要考虑以下事项。

关于这些考虑事项,HashiCorp根据使用Terraform的最佳实践进行了处理,使Terraform在开箱即用时可用。TFCB也是HashiCorp提供的有偿版Terraform之一。

Terraform Cloud代理是什么?
通过使用付费版Terraform,您可以获得多种功能的即开即用效果,但在考虑TFC网络结构时,面临的挑战之一是来自TFC到操作目标的入站请求。
鉴于TFC使用的IP范围已经公开,您可以通过更改您的环境的防火墙等设置来使用TFC,但我认为这是一项工作量较大的更改工作。此外,从根本上讲,允许对自己的环境进行入站访问在企业客户中可能是较为困难的出于安全策略的考虑,尤其是针对企业客户而言。

作为解决TFC使用时的网络配置问题的解决方案,Terraform Cloud Agents(以下简称TFC Agent)是TFCB可用的功能。

当您使用此功能时,TFC上的Worker实例将不再对目标环境进行虚拟化,而是由TFC Agent进行虚拟化。
公司自身的数据中心和云环境部署的TFC Agent与TFC进行协作,TFC Agent通过出站方式获取TFC发生的各种事件和版本控制系统(VCS)的更新信息等。
通过轮询TFC中的更新,一旦有任何变化,TFC Agent会从该更新中获取信息,并在TFC Agent上执行terraform CLI来对待部署环境进行配置,从而进行配置管理。
如果选择这种配置,HTTPS端点将成为唯一的端点,因此只需允许TFC代理向此端点发送出站请求,无需其他设置,并且端点的URL不会更改,因此配置也可以永久使用。
TFC代理可以作为Linux二进制文件或Docker容器使用,因此您可以在平台上自由使用它。
接下来,我想介绍一下如何在Tanzu Kubernetes Grid多云环境(简称TKGm)上部署这个TFC Agent,并利用在TKGm上部署的TFC Agent,按照Terraform工作流的方式,在TKGm上进行Kubernetes资源的自动化配置。
Terraform Cloud Agent 的安装与配置
需要能够使用TFCB作为前提,根据以下Managing Agent Pools的步骤,在TFC上创建Agent Pool。
当您创建Agent Pool并创建新令牌时,将按以下方式显示Docker容器中TFC Agent的运行说明。
# Connect to your Docker host and set the following environment variables. TFC_AGENT_NAME is optional.
$ export TFC_AGENT_TOKEN=...
$ export TFC_AGENT_NAME=<my_agent_name>
# Once the environment is configured, run the Docker container with the following command or download the agent file.
$ docker run -e TFC_AGENT_TOKEN -e TFC_AGENT_NAME hashicorp/tfc-agent:latest
本次使用 TKGm,將 TFC Agent 的管理交由 Kubernetes 負責,因此僅需複製 TFC_AGENT_TOKEN。
将Terraform云代理部署到Kubernetes中。
我们将在Kubernetes环境中部署TFC Agent。
在这里使用的 Kubernetes 集群是通过 TKGm 在 vSphere 上部署的,但我认为在 Tanzu Community Editions 上也可以通过类似的步骤安装 Kubernetes 集群环境。
创建一个名为TFC Agent的命名空间,将先前获取到的TFC_AGENT_TOKEN创建为该命名空间的secret资源。
export KUBECONFIG=~/kubeconfig-lab-fender
k create ns tfc-agent
# 先程取得したTFC_AGENT_TOKENをBase64でエンコードします
echo -n "t..." |base64
将以Base64编码输出的值作为keytoken的value,创建一个名为tfc-agent-secrets.yml的清单,其内容如下。
apiVersion: v1
kind: Secret
metadata:
name: agent
type: Opaque
data:
token: t...
创建一个定义了TFC Agent令牌的Secret资源。
k -n tfc-agent apply -f tfc-agent-secrets.yml
然后,在TKGm的Workload集群上,创建一个名为deployment-tfc-agent.yml的文件,用来部署TFC Agent的Deployment资源。按照以下的格式创建清单文件,并设置环境变量TFC_AGENT_TOKEN和TFC_AGENT_NAME。
在这里没有指定,但是您可以使用变量名TF_VAR_xxx来指定变量,这样在执行Terraform时,也可以将它作为Terraform变量提供给TFC Agent。
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: tfc-agent
name: tfc-agent
spec:
replicas: 1
selector:
matchLabels:
app: tfc-agent
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tfc-agent
spec:
containers:
- image: hashicorp/tfc-agent:1.0.2
name: tfc-agent
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
env:
- name: "TFC_AGENT_TOKEN"
valueFrom:
secretKeyRef:
name: agent
key: token
- name: "TFC_AGENT_NAME"
value: "tfc-agent-on-fender"
status: {}
使用此清单文件,在TKGm的Workload集群上部署TFC Agent。
k -n tfc-agent apply -f deployment-tfc-agent-tanzu.yml
$ k -n tfc-agent get all
NAME READY STATUS RESTARTS AGE
pod/tfc-agent-69cd86fb9f-mxt8r 1/1 Running 0 12m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tfc-agent 1/1 1 1 45d
NAME DESIRED CURRENT READY AGE
replicaset.apps/tfc-agent-69cd86fb9f 1 1 1 12m
由於在 TKGm 上已成功部署了 TFC Agent,我們可以利用此 TFC Agent,使用 Terraform 的工作流來進行 Kubernetes 資源的配置。
利用Terraform 配置Kubernetes资源
我们在环境方面做了以下准备:在使用Terraform的Kubernetes提供程序时,所需的秘密信息已加密并存储在Vault的K/V存储中。

另外,本次使用的Terraform代码如下所示。
地址 = var.vault_address
跳过_tls_verify = true
auth_login {
路径 = “auth/approle/login”
参数 = {
角色_标识 = var.login_approle_id
密钥_标识 = var.login_approle_secret_id
}
}
}
数据 “vault_generic_secret” “vsphere” {
路径 = “secret/lab_1t0chu_dev/tkg_fender”
}
提供商 “kubernetes” {
主机 = data.vault_generic_secret.vsphere.data[“host”]
客户端证书 = data.vault_generic_secret.vsphere.data[“client_certificate”]
客户端密钥 = data.vault_generic_secret.vsphere.data[“client_key”]
集群_ca证书 = data.vault_generic_secret.vsphere.data[“cluster_ca_certificate”]
}
资源 “kubernetes_namespace” “example” {
元数据 {
标签 = {
我的标签 = “tanzu-test”
}
名称 = “terraform-example-namespace”
}
}
资源 “kubernetes_deployment” “nginx” {
元数据 {
名称 = “nginx-example-on-tanzu”
标签 = {
应用 = “ScalableNginxExample”
}
命名空间 = kubernetes_namespace.example.id
}
规格 {
复制品数 = 4
选择器 {
匹配标签 = {
应用 = “ScalableNginxExample”
}
}
模板 {
元数据 {
标签 = {
应用 = “ScalableNginxExample”
}
}
规格 {
容器 {
镜像 = “bitnami/nginx:1.20.2”
名称 = “example”
端口 {
容器端口 = 80
}
资源 {
限制 = {
cpu = “0.5”
内存 = “512Mi”
}
请求 = {
cpu = “250m”
内存 = “50Mi”
}
}
}
}
}
}
}
资源 “kubernetes_service” “nginx” {
元数据 {
名称 = “nginx-example”
命名空间 = kubernetes_namespace.example.id
}
规格 {
选择器 = {
应用 = kubernetes_deployment.nginx.spec.0.template.0.metadata[0].labels.App
}
端口 {
节点端口 = 30201
端口 = 80
目标端口 = 80
}
类型 = “NodePort”
}
}
在TFC上进行工作区设置,并通过部署到TKG上的TFC代理来进行配置,以执行预配。然后执行Terraform Run。
关于这个工作区,由于进行了VCS整合,因此一旦有与工作区相连的仓库更新,如git commit等操作,将触发Terraform Run的执行。执行Terraform Run后,首先会执行terraform plan,并输出实际执行的配置变更内容。

查看已配置的命名空间资源,您可以直观地确认以下更改的内容。

我认为通常使用YAML清单来管理Kubernetes资源,但通过使用Terraform/HCL框架来管理Kubernetes资源,可以实现Dry-Run、模块化、提供程序和资源之间的值引用等优点。
由于代码顺利通过,因此执行terraform apply命令,在TKG上进行Kubernetes资源的配置。

我要确认在 TKGm 的 Workload 集群中,通过代码声明的 Kubernetes 资源是否已经进行了配置。
$ k get ns terraform-example-namespace
NAME STATUS AGE
terraform-example-namespace Active 99s
$ k -n terraform-example-namespace get all
NAME READY STATUS RESTARTS AGE
pod/nginx-example-on-tanzu-6f4477ddf5-77727 1/1 Running 0 106s
pod/nginx-example-on-tanzu-6f4477ddf5-d2gpv 1/1 Running 0 106s
pod/nginx-example-on-tanzu-6f4477ddf5-r4bdf 1/1 Running 0 106s
pod/nginx-example-on-tanzu-6f4477ddf5-wcsq8 1/1 Running 0 106s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-example NodePort 100.66.204.68 <none> 80:30201/TCP 80s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-example-on-tanzu 4/4 4 4 106s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-example-on-tanzu-6f4477ddf5 4 4 4 106s
$ k -n terraform-example-namespace describe deployment.apps/nginx-example-on-tanzu
Name: nginx-example-on-tanzu
Namespace: terraform-example-namespace
CreationTimestamp: Tue, 07 Dec 2021 22:27:42 +0900
Labels: App=ScalableNginxExample
Annotations: deployment.kubernetes.io/revision: 1
Selector: App=ScalableNginxExample
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: App=ScalableNginxExample
Containers:
example:
Image: bitnami/nginx:1.20.2
Port: 80/TCP
Host Port: 0/TCP
Limits:
cpu: 500m
memory: 512Mi
Requests:
cpu: 250m
memory: 50Mi
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-example-on-tanzu-6f4477ddf5 (4/4 replicas created)
Events: <none>
我已经确认在TKGm的工作负载集群上可以无问题地将Kubernetes资源进行配置。
我们可以使用Terraform的 Kubernetes 提供程序,以符合 Terraform 框架的方式来管理不仅基础设施资源,还包括 Kubernetes 资源。
总结
Terraform 不仅可以进行基础设施的规划,还可以在同一框架中管理 Kubernetes 资源。此外,付费版 Terraform 还提供 Terraform 工作流程的最佳实践供您使用,如果您有兴趣,请通过这里与我们联系。