如何用 Terraform 黑魔法实现 5 分钟创建 Kubernetes 集群和一键发布应用

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

753c5d04e402b40dc7d0d2a1a22ee0bc.png

在本文中,我们将学习如何使用 Terraform 创建 Kubernetes 集群,然后使用 Argo CD 进行管理。

Terraform 对于自动化基础设施非常有用。另一方面,Argo CD 帮助我们实现 GitOps 和应用程序的持续交付。看来我们可以成功地将这两种工具结合起来。让我们考虑一下它们如何帮助我们以 GitOps 风格使用 Kubernetes。

介绍

首先,我想定义整个集群并将其配置存储在 Git 中。我不能仅使用 Argo CD 来实现它,因为 Argo CD 必须运行在现有的 Kubernetes 集群上。这就是为什么我需要一个能够创建集群然后在那里安装 Argo CD 的工具。在这种情况下,Terraform 似乎是一个自然的选择。另一方面,我不想使用 Terraform 来管理 Kubernetes 上运行的应用程序。 Terraform非常适合创建集群等一次性活动,但不适用于应用程序交付和配置管理等连续任务。

以下是我们要做的事情的列表:

  1. 1. 第一步,我们将使用 Terraform 创建本地 Kubernetes 集群

  2. 2. 然后我们将在集群上安装OLM(Operator Lifecycle Manager)。我们需要它来安装 Kafka 和 Strimzi(第 5 步)

  3. 3. 我们将使用 Terraform 从 Helm Chart 安装 Argo CD,并创建一个Argo CD Application--负责基于 Git 的整个集群配置。

  4. 4. 之后,Argo CD Application安装Strimzi Operator,创建Argo CD Project--负责Kafka安装和在Kubernetes上运行Kafka的Argo CD Application

  5. 5. 最后,Argo CD 应用程序自动创建运行 Kafka 所需的所有 CRD 对象

这里最重要的是,一切都应该在运行terraform apply命令后发生。Terraform 安装 Argo CD,然后 Argo CD 安装 Kafka,这是我们在该场景中的示例应用程序。让我们看看它是如何工作的。

003b46b0b9f70e2be119fc0b166d4cdc.png
terraform-kubernetes-arch

源代码

如果你想自己尝试一下,可以随时查看我的源代码。为此,你需要克隆我的 GitHub 存储库。之后,你应该按照我的指示进行操作。让我们开始。

0.前提条件

  1. 1. 安装Terraform CLI ,可以参考Terraform 安装

  2. 2. 安装Docker,可以参考Dokcer安装

1.使用Terraform创建Kubernetes集群

为了轻松创建 Kubernetes 集群,我们将使用Kind。这里有一个专门的 Kind Provider。当然,你可以在任何云上运行 Kubernetes,并且你还可以找到相应的 Terraform 提供程序。

我们的集群由三个工作节点和一个主节点组成。我们需要三个节点,因为最后我们将安装一个在三个实例中运行的 Kafka 集群。它们每个都将部署在不同的节点上。main.tf这是该步骤的Terraform 文件。我们需要在 部分中定义tehcyx/kind提供程序的最新版本(即0.0.12required_providers。我们集群的名称是cluster1。我们还将启用该wait_for_ready选项,以便在集群准备就绪后继续执行后续步骤。

terraform {  required_providers {    kind = {      source = "tehcyx/kind"      version = "0.0.12"    }  }}provider "kind" {}resource "kind_cluster" "default" {  name = "cluster-1"  wait_for_ready = true  kind_config {    kind = "Cluster"    api_version = "kind.x-k8s.io/v1alpha4"    node {      role = "control-plane"    }    node {      role = "worker"      image = "kindest/node:v1.23.4"    }    node {      role = "worker"      image = "kindest/node:v1.23.4"    }    node {      role = "worker"      image = "kindest/node:v1.23.4"    }  }}

为了验证配置,你可以运行该命令terraform init,然后terraform plan。之后,你可以使用 terraform apply来应用配置。

2.在Kubernetes上安装OLM

正如我之前提到的,Operator Lifecycle Manager (OLM) 是安装 Strimzi Kafka Operator 的先决条件。你可以在此处找到 OLM 的最新版本。

事实上,这归结为在 Kubernetes 上应用两个 YAML 清单。第一个crds.yaml包含 CRD 定义。其中第二个olm.yaml提供安装 OLM 所需的所有 Kubernetes 对象。让我们将这两个文件复制到 Terraform 存储库内的本地目录中。为了将它们应用到 Kubernetes,我们首先需要启用 Terraform kubectlprovider插件。

terraform {  ...  required_providers {    kubectl = {      source  = "gavinbunney/kubectl"      version = ">= 1.7.0"    }  }}

为什么我们使用该kubectl,而不是官方的 Terraform Kubernetes 提供程序?其中crds.yaml包含相当大的 CRD,超出了大小限制。我们可以通过在kubectl provider上启用服务器端应用来轻松解决该问题。下一种情况是两个 YAML 文件中定义了多个 Kubernetes 对象。kubectl provider者通过参数支持它for_each

data "kubectl_file_documents" "crds" {  content = file("olm/crds.yaml")}resource "kubectl_manifest" "crds_apply" {  for_each  = data.kubectl_file_documents.crds.manifests  yaml_body = each.value  wait = true  server_side_apply = true}data "kubectl_file_documents" "olm" {  content = file("olm/olm.yaml")}resource "kubectl_manifest" "olm_apply" {  depends_on = [data.kubectl_file_documents.crds]  for_each  = data.kubectl_file_documents.olm.manifests  yaml_body = each.value}

在应用任何 YAML 之前,我们不能使用现有的上下文。幸运的是,我们可以将kubectl provider的输出参数与 Kubernetes 地址和身份验证凭据结合使用。

provider "kubectl" {  host = "${kind_cluster.default.endpoint}"  cluster_ca_certificate = "${kind_cluster.default.cluster_ca_certificate}"  client_certificate = "${kind_cluster.default.client_certificate}"  client_key = "${kind_cluster.default.client_key}"}

3. 安装 Argo CD 和 Helm

这是 Terraform 方面的最后一步。

我们将使用其 Helm Chart安装 Argo CD。我们还需要创建一个Application负责集群管理的 Argo CD。

这个Application将安装 Kafka Strimzi Operator 并创建另一个 Argo CD,Application用于运行 Kafka 集群等。

第一步,我们需要做和之前一样的事情:定义一个provider并设置Kubernetes集群地址。这是我们在 Terraform 中的定义:

provider "helm" {  kubernetes {    host = "${kind_cluster.default.endpoint}"    cluster_ca_certificate = "${kind_cluster.default.cluster_ca_certificate}"    client_certificate = "${kind_cluster.default.client_certificate}"    client_key = "${kind_cluster.default.client_key}"  }}

这里棘手的事情是我们需要Application在 Argo 安装后立即创建 CD。

默认情况下,Terraform 会验证 Kubernetes 上是否存在所需的 CRD 对象。在这种情况下,它需要Application的版本是 argoproj.io/v1alpha1

幸运的是,我们可以使用 Helm chart参数additionalApplications来传递。为此,我们必须设置一个自定义values.yaml文件。以下是 Argo CD 安装的 Terraform 声明:

resource "helm_release" "argocd" {  name  = "argocd"  repository       = "https://argoproj.github.io/argo-helm"  chart            = "argo-cd"  namespace        = "argocd"  version          = "4.9.7"  create_namespace = true  values = [    file("argocd/application.yaml")  ]}

为了创建初始Application,我们需要使用 Helm Chart的server.additionalApplications参数。

下面是整个argocd/application.yaml文件。为了简化,Argo CD 使用的配置位于存储库中作为 Terraform 配置。你可以在该目录中找到所有必需的 YAML argocd/manifests

server:  additionalApplications:   - name: cluster-config     namespace: argocd     project: default     source:       repoURL: https://github.com/piomin/sample-terraform-kubernetes-argocd.git       targetRevision: HEAD       path: argocd/manifests/cluster       directory:         recurse: true     destination:       server: https://kubernetes.default.svc     syncPolicy:       automated:         prune: false         selfHeal: false

4.使用Argo CD配置Kubernetes集群

最后两个步骤由 Argo CD 管理。我们已经成功完成了 Kubernetes 集群的安装过程。现在,是时候在那里安装我们的第一个应用程序了。

我们的示例应用程序是 Kafka。因此,首先我们需要安装 Kafka Strimzi Operator。为此,我们只需要定义一个Subscription对象--由之前安装的 OLM 管理。该定义在存储库中以strimzi.yaml文件形式提供。

apiVersion: operators.coreos.com/v1alpha1kind: Subscriptionmetadata:  name: my-strimzi-kafka-operator  namespace: operatorsspec:  channel: stable  name: strimzi-kafka-operator  source: operatorhubio-catalog  sourceNamespace: olm

我们可以在这里配置与整个集群相关的很多方面。

然而,我们只需要创建一个专用的 Argo CD ProjectApplication用于 Kafka 配置。这是我们的Project定义:

apiVersion: argoproj.io/v1alpha1kind: AppProjectmetadata:  name: kafka  namespace: argocdspec:  clusterResourceWhitelist:    - group: '*'      kind: '*'  destinations:    - name: '*'      namespace: '*'      server: '*'  sourceRepos:    - '*'

让我们将名为kafka 的ArgoCD Application放入新创建的Project.

apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata:  name: kafka  namespace: argocdspec:  destination:    namespace: kafka    server: https://kubernetes.default.svc  project: kafka  source:    path: argocd/manifests/kafka    repoURL: https://github.com/piomin/sample-terraform-kubernetes-argocd.git    targetRevision: HEAD  syncPolicy:    syncOptions:      - CreateNamespace=true

5.使用GitOps创建Kafka集群

最后,我们练习的最后一部分。

我们将在 Kind 上创建并运行一个 3 节点 Kafka 集群。

下面文件是我们存储在 Git 中的Kafka对象定义。我们为 Kafka 和 Zookeeper(由 Kafka 集群使用)设置 3 个副本。该清单可在路径下的存储库argocd/manifests/kafka/cluster.yaml中找到。

我们在90929093端口上公开Kafka 集群。

apiVersion: kafka.strimzi.io/v1beta2kind: Kafkametadata:  name: my-clusterspec:  kafka:    replicas: 3    version: 3.2.0    logging:      type: inline      loggers:        kafka.root.logger.level: "INFO"    config:      auto.create.topics.enable: "false"      offsets.topic.replication.factor: 3      transaction.state.log.replication.factor: 3      transaction.state.log.min.isr: 2      default.replication.factor: 3      min.insync.replicas: 2      inter.broker.protocol.version: "3.2"    listeners:      - name: plain        port: 9092        type: internal        tls: false      - name: tls        port: 9093        type: internal        tls: true    storage:      type: jbod      volumes:        - id: 0          type: persistent-claim          size: 30Gi          deleteClaim: true  zookeeper:    replicas: 3    storage:      type: persistent-claim      size: 10Gi      deleteClaim: true  entityOperator:    topicOperator: {}    userOperator: {}

我们还将在清单argocd/manifests/kafka/cluster.yaml中定义一个 Kafka 主题。

apiVersion: kafka.strimzi.io/v1beta2kind: KafkaTopicmetadata:  name: my-topic  labels:    strimzi.io/cluster: my-clusterspec:  partitions: 10  replicas: 3

实操演示

Terraform

c1a6ecb18c114bae970c7244e7335f31.jpeg

我们已经准备好了所有需要的脚本。让我们进入执行阶段。如果你还没有克隆 Git 存储库,那么是时候这样做了:

$ git clone https://github.com/piomin/sample-terraform-kubernetes-argocd.git$ cd sample-terraform-kubernetes-argocd

首先,让我们初始化包含 Terraform 配置的工作目录:

$ terraform init

一旦我们这样做,我们可以预览要执行的操作列表:

$ terraform plan

你应该收到相当大的内容作为响应。这是我的结果的最后一部分:

81f34ea4d280779f5f984a339504f68f.png
img

如果一切看起来都很好并且没有错误,我们可以继续下一步(最后)步骤。让我们开始这个过程:

$ terraform apply

所有 24 个对象均应成功应用。这是日志的最后一部分:

d9493f48378f36cd7304fb514db9bbbd.png
img

现在,你的集群应该准备就绪并正在运行。让我们显示 Kind 集群的列表:

$ kind get clusterscluster-1

我们集群的名称是cluster-1。但 Kubernetes 上下文的名称是kind-cluster-1

90fd6632625ee85ca127730ba7f68c17.png
img

让我们显示部署在 Kind 集群上的应用程序列表。

你应该至少安装了 Argo CD 和 OLM。一段时间后,Argo CD 应用存储在 Git 存储库中的配置。然后,你应该会看到operators命名空间中安装了 Kafka Strimzi Operator。

ec06237420848fd8d3b9b857b08ef183.png
terraform-kubernetes-apps

Argo CD

之后,我们可以进入Argo CD Web控制台。要在本地端口上轻松访问它,让我们启用port-forward

$ kubectl port-forward service/argocd-server 8443:443 -n argocd

现在,你可以在https://localhost:8443. 默认用户名是admin。密码由 Argo CD 自动生成。你可以在 Kubernetes 中找到它Secret argocd-initial-admin-secret

$ kubectl get secret argocd-initial-admin-secret -n argocd --template={{.data.password}} | base64 -D

以下我们的 Argo CD Application列表。其中cluster-config 启用了自动同步选项。

它安装 Strimzi Operator并创建名为kafka 的Argo CD 应用程序。我还可以为kafka应用程序启用自动同步。但出于演示目的,我留下了手动批准。那么,让我们在集群上运行 Kafka。为此,请单击图块Sync上的按钮kafka

fe32063da856d0558911bf91b663a777.png
terraform-kubernetes-argocd

完成后,Kafka 安装就开始了。最后,你应该让整个集群准备就绪并运行。每个 Kafka 和 Zookeeper 节点都运行在不同的 Kubernetes 工作节点上:

832c20a3faaad102be06fb33983be230.png
img

就这样。我们使用单个 Terraform 命令和 Argo CD Web 控制台上的一键创建了所有内容。当然,我们可以为kafka应用程序启用自动同步,因此我们甚至不需要登录 Argo CD Web 控制台即可获得最终效果。

总结

本文,我们介绍了如何使用Terraform创建Kubernetes集群,然后使用Argo CD进行管理。Terraform用于自动化基础架构的创建,而Argo CD用于实现GitOps和应用程序的持续交付。

文章列出了以下步骤:

  1. 1. 使用Terraform创建本地Kubernetes集群,配置Kind提供程序以定义集群规模。

  2. 2. 安装Operator Lifecycle Manager (OLM)用于安装Strimzi Kafka Operator。

  3. 3. 使用Terraform安装Argo CD Helm图表,并创建一个Argo CD应用程序,负责整个集群的配置。

  4. 4. Argo CD应用程序安装Strimzi Operator,创建专用于Kafka安装的Argo CD项目,并运行Kafka在Kubernetes上。

  5. 5. Argo CD应用程序自动创建所有运行Kafka所需的CRD对象。

本文转载自:「云原生百宝箱」,原文:https://url.hi-linux.com/Bkbef,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

23c5744de1b3a2af32638460fdb212d4.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

30bd1c470b95a8dbb203625f0520dcb0.png

你可能还喜欢

点击下方图片即可阅读

adbc13df5e7a217bb54e696ecad02a0f.png

如何使用 Argo CD 快速实现 GitOps 流水线

72d7ab106edabb0410384aa827dbc60a.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

88c3d0809fd7f9dc95d6516342afbd97.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

使用go-zero和Terraform实现自动化云平台部署的项目,可以分为以下几个步骤: 1. 安装go-zero和Terraform 在开始之前,您需要确保已经安装了go-zero和Terraform。您可以从官方网站下载和安装它们。 2. 创建go-zero项目 使用goctl命令创建一个新的go-zero项目: ``` goctl api new your_project ``` 这将在当前目录中创建一个新的go-zero项目。 3. 编写go-zero服务代码 在项目目录中,您可以使用goctl命令来创建一个新的服务: ``` goctl api add -plugin tf your_service ``` 这将在services目录中创建一个新的服务,该服务将使用Terraform插件。 现在,您可以在该服务中编写自己的业务逻辑代码。 4. 编写Terraform代码 在该服务的tf目录中,您可以编写Terraform代码来定义您的基础设施。 例如,您可以使用Terraform代码来定义一个新的云服务器实例: ``` resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "example-instance" } } ``` 5. 编写自动化脚本 最后,您可以编写一个自动化脚本来自动化部署您的服务和基础设施。 例如,您可以使用bash脚本来自动化部署: ``` #!/bin/bash # 编译服务 go build -o your_service # 初始化Terraform terraform init # 应用Terraform配置 terraform apply -auto-approve ``` 这将自动编译您的服务并应用您的Terraform配置来创建您的基础设施。 总之,使用go-zero和Terraform实现自动化云平台部署的项目可以简化部署流程并提高效率。但是,在使用自动化工具之前,您需要了解基础设施和自动化工具的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值