ITPub博客

首页 > 数据库 > 数据库开发技术 > Terraform魔法:5分钟创建集群,一键发布应用

Terraform魔法:5分钟创建集群,一键发布应用

原创 数据库开发技术 作者:云原生AI百宝箱 时间:2023-09-23 11:34:17 0 删除 编辑

点击上方蓝字 👆关注【云原生百宝箱】公众号,别让消息溜走

后台回复【加群】,与牛人互动不停




在本文中,我们将学习如何使用 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,这是我们在该场景中的示例应用程序。让我们看看它是如何工作的。

源代码

如果你想自己尝试一下,可以随时查看我的源代码。为此,你需要克隆我的 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.12)required_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/v1alpha1
kind: Subscription
metadata:
  name: my-strimzi-kafka-operator
  namespace: operators
spec:
  channel: stable
  name: strimzi-kafka-operator
  source: operatorhubio-catalog
  sourceNamespace: olm

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

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

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: kafka
  namespace: argocd
spec:
  clusterResourceWhitelist:
    - group: '*'
      kind: '*'
  destinations:
    - name: '*'
      namespace: '*'
      server: '*'
  sourceRepos:
    - '*'

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

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: kafka
  namespace: argocd
spec:
  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中找到。

我们在9092和9093端口上公开Kafka 集群。

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  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/v1beta2
kind: KafkaTopic
metadata:
  name: my-topic
  labels:
    strimzi.io/cluster: my-cluster
spec:
  partitions: 10
  replicas: 3

实操演示

Terraform




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

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

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

$ terraform init

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

$ terraform plan

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

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

$ terraform apply

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

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

$ kind get clusters
cluster-1

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

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

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

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。

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

就这样。我们使用单个 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对象。

最终目标是通过运行terraform apply命令一次性完成所有配置,包括安装Argo CD和Kafka。这个流程允许在Kubernetes上轻松创建和管理Kafka集群,实现了GitOps的自动化操作。

- END -




推荐阅读



原文作者:云原生AI百宝箱;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-06-25

  • 博文量
    70
  • 访问量
    34368