【译】如何使用Terraform和Helm来部署Kubernetes仪表板

819 阅读4分钟

当我在做需要配置云基础设施的项目时,我的工作流程有两个不同的部分:一个是基础设施协调,包括Terraform来建立基础设施(例如,新的EKS集群),第二个是配置部分,包括Ansible或Bash脚本来实例化和初始化基础设施以接受新的部署(例如,安装Cluster Autoscaler、kube-state-metrics等等)。

原因很简单:很少有工具能同时处理协调和配置两方面的工作。当我偶然发现Terraform的Helm提供商时,我想探索使用一个工具来处理这两方面的可能性:使用Terraform来建立一个新的EKS集群,并用Prometheus、Loki、Grafana、Cluster Autoscaler和其他工具来配置它,所有这些都在一个整洁的部署中。但在我弄清楚如何使用这个东西之前,这是不可能的,所以下面是我使用Terraform和Helm做一些简单事情的经验:部署Kubernetes仪表板。

舵手提供者

Helm提供商的工作方式与其他云提供商类似。你可以指定KUBECONFIG 的路径或其他凭证,运行terraform init ,然后Helm提供商就会被初始化。

部署Kubernetes仪表板

我将使用Minikube进行这个测试

我的main.tf 文件包含以下内容。

provider "helm" {
  kubernetes {
    config_path = "~/.kube/config"
  }
}
resource "helm_release" "my-kubernetes-dashboard" {
  name = "my-kubernetes-dashboard"
  repository = "https://kubernetes.github.io/dashboard/"
  chart      = "kubernetes-dashboard"
  namespace  = "default"
  set {
    name  = "service.type"
    value = "LoadBalancer"
  }
  set {
    name  = "protocolHttp"
    value = "true"
  }
  set {
    name  = "service.externalPort"
    value = 80
  }
  set {
    name  = "replicaCount"
    value = 2
  }
  set {
    name  = "rbac.clusterReadOnlyRole"
    value = "true"
  }
}

在上面的Terraform中,我正在将https://kubernetes.github.io/dashboard/ 中的kubernetes-dashboard 图表部署到命名空间default 。我还使用了set 变量来覆盖图表的默认值。

  1. service.type: 我把它改为LoadBalancer ,以便在本地审查我的变化。记住要在一个单独的窗口中运行minikube tunnel ,否则这将不起作用。
  2. protocolHttp: 我正在部署非安全版本,以抑制HTTPS的警告,localhost
  3. service.externalPort: 对于非安全版本,这需要是80。
  4. replicaCount: 我把它改成2,看看这些改变是否有效 :)
  5. rbac.clusterReadOnlyRole: 这应该是true ,以便仪表板有正确的权限。

执行我们的Terraform

让我们先用terraform init 来初始化Terraform。

Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/helm...
- Installing hashicorp/helm v2.2.0...
- Installed hashicorp/helm v2.2.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

到目前为止,一切都很好。Terraform成功地初始化了Helm提供者。现在是terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
Terraform will perform the following actions:
  # helm_release.my-kubernetes-dashboard will be created
  + resource "helm_release" "my-kubernetes-dashboard" {
      + atomic                     = false
      + chart                      = "kubernetes-dashboard"
      + cleanup_on_fail            = false
      [...]
      + set {
          + name  = "service.type"
          + value = "LoadBalancer"
        }
    }
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.
  Enter a value: yes
helm_release.my-kubernetes-dashboard: Creating...
helm_release.my-kubernetes-dashboard: Still creating... [10s elapsed]
helm_release.my-kubernetes-dashboard: Creation complete after 14s [id=my-kubernetes-dashboard]

(记得在另一个终端窗口中运行minikube tunnel ,否则apply 将无法工作)。)

验证我们的变化

让我们使用kubectl get pokubectl get svc 检查我们的pod是否已经启动。

~ kubectl get po
NAME                                       READY   STATUS    RESTARTS   AGE
my-kubernetes-dashboard-7bc7ccfbd9-56w56   1/1     Running   0          18m
my-kubernetes-dashboard-7bc7ccfbd9-f6jc4   1/1     Running   0          18m
~ kubectl get svc
NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
kubernetes                ClusterIP      10.96.0.1                   443/TCP        20m
my-kubernetes-dashboard   LoadBalancer   10.104.144.125   10.104.144.125   80:32066/TCP   19m

我们的pods已经部署好了,而且负载平衡器也在工作。现在检查一下用户界面。

Kubernetes Workloads dashboard

图2:Kubernetes Workloads 仪表盘

总结

你可以在我的Gitlab repo中找到本文的例子

随着Helm配置成为Terraform的一部分,我的工作生活变得更加轻松。我意识到基础设施和供应之间的分离有不同的目的:基础设施的变化通常是一次性的,或者不需要频繁的更新,也许在我的组织的管理或安全规则发生变化时才会有几次。另一方面,供应的变化经常发生,有时是在每个版本。因此,将Terraform(基础设施)和Helm Charts(供应)放在两个不同的仓库里,使用两个不同的工具和两个不同的审查工作流程是有意义的。我不确定用一个工具合并它们是否是最好的主意,但工具链中少一个工具总是一个巨大的胜利。我认为这样做的利弊会因项目不同、团队不同而不同。