如果您已经关注 Codefresh 博客一段时间,您可能已经注意到所有讨论 Kubernetes 部署的文章中的一个共同模式。几乎所有这些都是从已经存在的 Kubernetes 集群开始的,然后文章解释了如何在上面部署应用程序。

这种简化的原因主要来自于简洁和简单。我们希望专注于应用程序的部署部分,而不是它的基础设施,只是为了使文章更易于理解。这是显而易见的原因。

隐藏的原因是,直到最近,基础设施部署的处理方式与应用程序部署不同。特别是在大型企业公司中,处理基础设施和应用程序的人员的技能可能会有很大差异,因为行业工具完全不同。

例如,许多处理基础设施的人更喜欢使用 Terraform 模板,但使用 Kustomize/Helm 或其他类似工具进行应用程序开发。虽然这是一个非常有效的解决方案,但不一定要这样。

现在使用 GitOps,您可以采用统一的方式处理基础设施和应用程序。

GitOps 和 Terraform

如果您不熟悉 GitOps,请前往https://opengitops.dev/,这是 GitOps 工作组的官方页面。 GitOps 的原理如下:

1.系统以声明的方式描述。 (实际上,这意味着 Kubernetes 清单。)

2.对系统的定义进行版本化和审计。 (实际上,它存储在 Git 中。)

  1. 软件代理自动拉取Git状态并匹配平台状态。 (实际上,这意味着Flux/ArgoCD。)

4.国家不断和解。这意味着 Git 中发生的任何更改也应该反映在系统中,以及相反的场景。

如果您已经使用过 Terraform,那么您应该已经了解为什么难以将 GitOps 应用到 Terraform CLI。虽然 Terraform 只有第一个要求(声明式格式),但它不满足围绕 Git 存储、自动协调和双向同步的其他三个要求。一旦 Terraform 完成其工作,它就不会以任何方式与系统交互。如果您手动删除由 Terraform 创建的虚拟机,香草 Terraform 不会知道它。而关于状态,Terraform 存储自己的状态,这与 Git 中的定义文件完全不同。

所以乍一看,让 GitOps 与基础设施一起工作是一项复杂的任务。你意识到你需要在 vanilla Terraform 之上添加一些东西以满足 GitOps 的要求。

但是这个街区有一个新孩子,那就是Crossplane!

GitOps 和 Crossplane

Crossplane 具有与 Terraform 相似的功能(创建基础设施),但有以下主要区别:

  1. Crossplane 本身就是一个 Kubernetes 应用。 (它创建的基础设施可以是任何东西。)

  2. Crossplane 定义是 Kubernetes 清单。

  3. 您可以使用描述通用云提供商中资源的清单,也可以创建自己的资源。

作为一个简单的例子,这里有一个在 Crossplane 中描述的 EC2 实例:

apiVersion: ec2.aws.crossplane.io/v1alpha1
kind: Instance
metadata:
  name: sample-instance
spec:
  forProvider:
    region: us-east-1
    imageId: ami-0dc2d3e4c0f9ebd18
    securityGroupRefs:
      - name: sample-cluster-sg
    subnetIdRef:
      name: sample-subnet1  
  providerConfigRef:
    name: example

进入全屏模式 退出全屏模式

您可以找到Amazon、Google和Azure的更多示例。 Crossplane 支持其他几个提供商,当然你可以添加你自己的。

这里重要的一点是,上面的文件是一个标准的 Kubernetes 清单。你可以:

  • 使用 kubectl 应用它。

  • 使用清单验证工具(kubeval或kube-linter)对其进行验证。

  • 使用 Helm/Kustomize 对其进行模板化。

  • 使用 Kubernetes 生态系统中的任何工具来读取/管理/存储它。

由于它是标准清单,您当然可以将其存储在 Git 中并使用 ArgoCD 对其进行管理,以实现完整的 GitOps 工作流程。这种能力的重要性怎么强调都不为过。

如果您将 ArgoCD 和 Crossplane 结合起来,您就有了一个完整的解决方案,可以在基础设施上遵循 GitOps 原则,而不仅仅是应用程序。想象一下,如果您的 ArgoCD 仪表板包含以下内容:

[ArgoCD 和 Crossplane](https://res.cloudinary.com/practicaldev/image/fetch/s--cU97kSbR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/s4xtnny6c5lw4cdyrfur.png)

这不是很酷吗?

ArgoCD 和 Crossplane 如何协同工作

Crossplane 提供了一种将基础架构建模为 Kubernetes 清单的简单方法。这本身就很棒,但是如果您将 ArgoCD 放在混合中,您基本上可以获得 GitOps 对您的基础设施的所有优势。

  • 您只需查看 Git 存储库即可准确了解您拥有的基础架构。

  • 通过查看 Git 历史,您可以确切地知道发生了什么变化以及何时发生变化。

  • 基础设施状态与 Git 状态相同。 Terraform 有自己的状态,它被用作单一的事实来源

  • 您不再需要任何外部凭据。

  • 您可以使用 git reset/git-revert 轻松回滚到之前版本的基础设施。您完全避免了可怕的配置漂移。

最后一点非常关键。 Terraform 只知道部署期间基础架构中的内容。如果您之后进行任何手动更改(例如删除一些基础设施),terraform 绝对一无所知。您需要重新运行 terraform 并祈祷采取正确的措施。有许多关于不完整/无效状态的 terraform 恐怖故事。这是我在 Spotify](https://www.youtube.com/watch?v=ix0Tw8uinWs)中最喜欢的[个 tfstate 故事之一。

ArgoCD 将立即检测您的基础设施中的任何手动更改,向您显示差异,甚至允许您在需要时完全丢弃它们。

[Argo Everywhere](https://res.cloudinary.com/practicaldev/image/fetch/s--Js7o0JZT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/qs4m8i78akely3vy2j5z.png)

本质上,ArgoCD 不知道它管理的 Kubernetes 清单到底描述了什么。它们可以是普通的 Kubernetes 应用程序、虚拟机、容器注册表、负载均衡器、对象存储、防火墙规则等。

创建基础设施并使用 GitOps 部署到它

现在我们看到您可以一起使用 ArgoCD 和 Crossplane 来管理基础设施,我们现在准备好以同样的方式处理应用程序和他们需要的平台。

这意味着我们可以执行以下操作:

1、白手起家。

  1. 使用 Crossplane 创建 Kubernetes 集群。

  2. 提交跨平面清单并使用 ArgoCD 对其进行管理。

  3. 使用标准清单(例如部署)将应用程序部署到刚刚创建的集群。

  4. 在 Git 中提交该清单。与应用程序一样,ArgoCD 将像任何其他 Kubernetes 清单一样管理它(即使它代表基础设施)。

这是整个工作流程:

[GitOps 无处不在](https://res.cloudinary.com/practicaldev/image/fetch/s--Y9CxfvWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/x7nnuu0othvd5oh46et9.png)

运行 Crossplane 的 Kubernetes 集群仅用于引导 crossplane。它自己不会获得任何生产工作负载。对于简单的演示,这可以是任何集群(甚至是在您的工作站上运行的本地集群)。

最终结果是,现在您可以通过 Argo CD 统一处理基础架构和应用程序。

[应用程序和基础设施管理](https://res.cloudinary.com/practicaldev/image/fetch/s--VoH35Eh---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/uploads/articles/tzc4rxnuf7ypp8pjx2we.png)

更改其中任何一个的过程完全相同。

  • 如果你想改变基础设施,你提交一个改变,ArgoCD 会处理它(在 Crossplane 的帮助下)。

  • 如果你想改变你的应用程序,你提交一个改变,ArgoCD 会处理它。

他们也都获得了 GitOps 的所有好处。例如,如果有人更改部署中的副本数量或篡改集群节点,ArgoCD 将自动检测手动更改并让您能够完全丢弃它们。

为什么 GitOps 是前进的方向

DevOps 的全部意义在于让一切都实现自助服务,并促进开发人员和运营商之间的协作。在 GitOps 设置中采用 Crossplane 意味着现在双方都有可以交流的通用语言。

不再需要让他们中的任何一个感到困惑的单独工作流程。为基础设施和应用程序采用通用工作流程是 DevOps 精神的体现。

如果您想了解有关GitOps以及 Codefresh 如何接受它的更多信息,请查看适用于 Argo](https://codefresh.io/codefresh-argo-platform/)的[Codefresh DevOps 平台。有关 Crossplane 的更多信息,请参阅官方网站和Upbound的托管解决方案。

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐