使用Terraform管理Kubernetes的详细教程

742 阅读5分钟

使用Terraform管理KubernetesKubernetes以其在容器编排方面的灵活性和可移植性继续努力影响着科技领域。随着它的不断努力,人们越来越需要将Kubernetes与你选择的其他工具和资源连接、配置和管理。这带来了更多的自动化产品、基础设施和功能的创建,以满足这种日益增长的需求。

Terraform是提供管理和配置Kubernetes的最佳方式的工具之一。它是一个流行的和最常用的基础设施即代码产品,包括一个与Kubernetes的连接器,这个连接器被称为Kubernetes提供者。

与其他类似的工具相比,Terraform的突出之处在于它能够使用模板配置基础设施。模板的创建描述了你在部署基础设施之前将拥有的资源。使用Terraform,你可以描述你的基础设施即代码的细节,而Terraform则进行配置。

Terraform允许你对基础设施进行编程,而Ansible等其他工具只是配置管理,帮助在已经配置好的基础设施上自动配置软件和系统。

让我们来看看为什么Terraform是一个配置Kubernetes集群的好工具:

  • Terraform允许用户在代码中维护Kubernetes集群的定义。
  • 它使用相同的声明式语法进行下层基础架构的配置。
  • 通过Terraform,你可以通过变量修改你的Kubernetes集群。
  • 它有一个干运行的功能,用于在所做的修改被应用之前对Kubernetes集群进行的修改。
  • Terraform的一个重要好处是它能够使用相同的配置语言来配置Kubernetes和将应用程序部署到其中。
  • 使用Terraform,只需要一个命令来创建、更新和删除pod和资源,而不需要检查API来识别这些资源。
  • Terraform承认资源之间的关系,也将代码中的基础设施模块化。
  • Terraform缩短了产品交付时间,因为它有助于灾难恢复时间和发布问题。

在谈论了Terraform对Kubernetes的好处之后,让我们继续了解一下它的工作原理。

需要注意的是,Terraform Kubernetes提供商并不构建和部署Kubernetes集群,也就是说,它需要Kubernetes集群已经运行,才能使用。为了了解Terraform Kubernetes提供商的工作方式,我们将看一下一个用例。

Terraform Kubernetes提供商的一个使用案例

与Terraform Kubernetes提供商合作或互动的最佳方式是通过创建一个命名空间来配置Kubernetes提供商,然后将应用程序部署在一个pod中,最后将pod作为一个服务暴露给用户。同时,要做到这些,你需要让你的Kubernetes集群启动和运行。我们在下面解释了这三个步骤。

第1步:配置我们的Kubernetes提供商

使用Terraform Kubernetes提供商的第一步是配置我们的Kubernetes提供商。为了做到这一点,我们将在~/.kube/config创建一个配置文件。然后让配置包含在Terraform实例中,它将看起来像下面的代码块。

provider "kubernetes" {
   host = "https://0.0.0.0"
}

第二步:部署pod

Terraform提供了一个pod,Kubernetes在其中管理容器。一个pod通常包含一个或多个容器,根据可用内存在集群节点上进行调度。

在这里,我们使用Terraform来创建我们的pod,同时我们向用户公开80端口:

resource "kubernetes_pod" "example" {
  metadata {
    name = "example-test"
    labels {
      App = "example"
    }
  }

  spec {
    container {
      image = "example/http-echo:0.1.0"
      name  = "example-test"

      port {
        container_port = 80
      }
    }
  }
}

第3步:用一个服务来展示pod

我们的pod创建后的下一步是通过提供一个服务将其暴露给用户。服务有能力管理负载均衡器和pod之间的关系:

resource "kubernetes_service" "example" {
  metadata {
    name = "example-test"
  }
  spec {
    selector {
      App = "${kubernetes_pod.example.metadata.0.labels.App}"
    }
    port {
      port        = 80
      target_port = 80
    }
    type = "LoadBalancer"
}
}

output "load_balancer_ip" {
  value = "${kubernetes_service.example.load_balancer_ingress.0.ip}"
}

这个Terraform配置还指定了一个输出,打印出负载平衡器的IP,以方便操作者访问它。这个输出是作为指定Terraform的服务功能的一个补充。

第4步:验证应用程序是否工作

在完成所有必要的配置后,我们必须验证我们所做的一切是否有效。我们可以通过使用终端的curl来验证应用程序是否在运行:

$ curl -s $(terraform output load_balancer_ip)

现在,打开你最喜欢的浏览器,输入IP地址,如果一切正常,你应该看到你的欢迎页面。

传递到容器实例中的配置使用config_map,这实际上不是一个照顾敏感事物的好方法。如果你需要在你的容器实例中保存敏感信息,比如密码,而且你不一定想把它们暴露给整个集群,Terraform Kubernetes提供商有一个工具,叫做kubernetes_secrets

Kubernetes_secrets默认创建一个秘密资源,并使该资源对该命名空间的任何pod可用。

Kubernetes_secret的使用实例:

resource "kubernetes_secret" "example" {
  metadata {
    name = "example-test"
  }

  data = {
    username = "admin"
    password = "GuessPassword"
  }

  type = "kubernetes.io/basic-auth"
}

然后可以通过在终端运行下面的命令来导入秘密:

$ terraform import kubernetes_secret.example default/my-secret

Terraform直接提供存储和持久化卷。同时,使用Terraform为所有卷提供存储类,同时由Kubernetes管理是最佳做法。而且,这对可扩展性和控制很重要。

总结

Terraform使得有效管理Kubernetes集群和Kubernetes资源变得容易。它让企业有机会进行基础设施即代码的工作,管理云平台,也有机会为自我服务的基础设施创建模块。Terraform Kubernetes供应商为企业提供所有必要的工具,以管理环境中的Kubernetes集群。