公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
在本文中,我们将学习如何使用 Terraform 创建 Kubernetes 集群,然后使用 Argo CD 进行管理。
Terraform 对于自动化基础设施非常有用。另一方面,Argo CD 帮助我们实现 GitOps 和应用程序的持续交付。看来我们可以成功地将这两种工具结合起来。让我们考虑一下它们如何帮助我们以 GitOps 风格使用 Kubernetes。
介绍
首先,我想定义整个集群并将其配置存储在 Git 中。我不能仅使用 Argo CD 来实现它,因为 Argo CD 必须运行在现有的 Kubernetes 集群上。这就是为什么我需要一个能够创建集群然后在那里安装 Argo CD 的工具。在这种情况下,Terraform 似乎是一个自然的选择。另一方面,我不想使用 Terraform 来管理 Kubernetes 上运行的应用程序。 Terraform非常适合创建集群等一次性活动,但不适用于应用程序交付和配置管理等连续任务。
以下是我们要做的事情的列表:
1. 第一步,我们将使用 Terraform 创建本地 Kubernetes 集群
2. 然后我们将在集群上安装OLM(Operator Lifecycle Manager)。我们需要它来安装 Kafka 和 Strimzi(第 5 步)
3. 我们将使用 Terraform 从 Helm Chart 安装 Argo CD,并创建一个Argo CD
Application
--负责基于 Git 的整个集群配置。4. 之后,Argo CD
Application
安装Strimzi Operator,创建Argo CDProject
--负责Kafka安装和在Kubernetes上运行Kafka的Argo CDApplication
5. 最后,Argo CD 应用程序自动创建运行 Kafka 所需的所有 CRD 对象
这里最重要的是,一切都应该在运行terraform apply
命令后发生。Terraform 安装 Argo CD,然后 Argo CD 安装 Kafka,这是我们在该场景中的示例应用程序。让我们看看它是如何工作的。
源代码
如果你想自己尝试一下,可以随时查看我的源代码。为此,你需要克隆我的 GitHub 存储库。之后,你应该按照我的指示进行操作。让我们开始。
0.前提条件
1. 安装Terraform CLI ,可以参考Terraform 安装
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 kubectl
provider插件。
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 Project
和Application
用于 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
中找到。
我们在9092
和9093
端口上公开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
我们已经准备好了所有需要的脚本。让我们进入执行阶段。如果你还没有克隆 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 clusterscluster-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. 使用Terraform创建本地Kubernetes集群,配置Kind提供程序以定义集群规模。
2. 安装Operator Lifecycle Manager (OLM)用于安装Strimzi Kafka Operator。
3. 使用Terraform安装Argo CD Helm图表,并创建一个Argo CD应用程序,负责整个集群的配置。
4. Argo CD应用程序安装Strimzi Operator,创建专用于Kafka安装的Argo CD项目,并运行Kafka在Kubernetes上。
5. Argo CD应用程序自动创建所有运行Kafka所需的CRD对象。
本文转载自:「云原生百宝箱」,原文:https://url.hi-linux.com/Bkbef,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
你可能还喜欢
点击下方图片即可阅读
如何使用 Argo CD 快速实现 GitOps 流水线
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!