增强Helm Charts:使用Kustomize来管理Kubernetes部署

运维团队需要自动部署应用程序,并且Helm是部署到Kubernetes的行业标准解决方案。像许多软件供应商一样,我们提供安装人工设备的舵图和其他JFrog DevOps平台产品,为大多数团队需要的标准/hth华体会最新官方网站推荐配置而设计。这些模板为客户提供了一组有限的配置选项。

如果您需要自定义您的Artifactoryx光,或者以您自己的方式进行其他部署,您可能会派生图表以创建您自己的自定义版本。但是一旦您这样做了,每次JFrog更新它的Helm图表时,您的自定义版本就会变得不同步和过时。为了使您的版本保持最新,您需要为每次更新重新集成。

如何在不分叉的情况下自定义Helm图表?这正是谷歌所创造的Kustomize对。在这篇文章中,也在一个即将到来的会议-我们将向您展示如何使用Kustomize overlay来执行自定义部署,同时始终使用来自供应商的最新Helm chart版本。

模板vs叠加

一个模板是一个具有占位符的表单,自动化流程将解析占位符并将其替换为值。为了执行特定的功能,它标记了必须提供具体信息的地方。如果你玩过“疯狂填空”,你就会对这种填空过程很熟悉。

作为一名开发人员,您会认识到模板和值就像宏和它们的变量,或者子例程和它们的参数。

一个覆盖是一组替换字符串。原始文件中的文本块完全替换为新的文本块。

有什么区别?

  • 需要仔细准备模板,以便在关键位置要求特定信息。当您使用模板时,您被限制只能更改模板提供的那些元素。
  • 叠加不需要以任何方式准备原始文件。你可以整体替换任何部分。

HelloWorld掌舵图

因为Artifactory的头盔图表非常高级,所以让我们使用一个非常简单的例子。在这里,模板允许为公司名称提供参数。

$ cat templates/podyaml apiVersion: v1 kind: Pod metadata: name: helloworld spec: restartPolicy: Never containers: - name: hello image: alpine env: command: ["/bin/sh","-c"] args: ["/bin/echo hello !我的公司名称是{{.Values.companyName}}”)

模板参数的值在文件中values.yaml

$ cat值。公司名称:ABC公司

让我们安装一下,看看它是如何工作的。

$ Helm安装helloworld名称:helloworld最后部署:星期一5月18日16:53:14 2020命名空间:default状态:部署修订:1 TEST SUITE:无$ kubectl logs -f helloworld Hello!我的公司是ABC公司

整洁!这种方法效果很好,我们把它寄给了客户。但是有一个客户有一个独特的需求,将员工名和部门名添加到输出中,如下所示:

我叫约翰。我在会计部工作。我们公司的名字是ABC公司。

很简单,他们可以分叉Helm图表并更改Helm模板,如下所示:

args: ["/bin/echo My name is {{.Values.employeeName}}。我为{{工作.Values.employeeDepartment}}。我们的公司名称是{{.Values.companyName}}”)

然后他们会添加新的值values.yaml文件。

$ cat值。雇员名称:Gary雇员部门:营销公司名称:ABC公司

但是,正如我们所指出的,他们的分叉现在与原始分叉不同步。这就是Kustomize的救命之处。

与Kustomize叠加

Kustomize使您能够在yaml文件中覆盖您自己的“定制”。在我们的例子中,客户可以根据他们的需求进行“定制”,而无需创建一个私有的、不可维护的图表分支。

首先,客户将创建一个kustomization.yaml文件。

patchesJson6902: -目标:版本:v1类型:Pod名称:helloworld patch: |- - op:替换路径:/spec/containers/0/args value: ["/bin/echo My name is {{. values . employeename}}。我为{{. values工作。employeeDepartment}}。我们的公司名称是{{.Values.companyName}}"] resources: - 2022世界杯阿根廷预选赛赛程templates/pod.yaml

现在我们可以直接自定义应用我们的覆盖。

$ cat templates_new/~g_v1_pod_helloworld。yaml apiVersion: v1 kind: Pod metadata: name: helloworld spec: containers:—args:—/bin/echo我的名字是{{. values . employeename}}。我为{{. values工作。employeeDepartment}}。我们的公司名称是{{.Values.companyName}}—/bin/sh—-c image: alpine name: hello restartPolicy: Never

我们将首先用我们的新模板替换原来的模板,然后用Helm安装并验证。

$ mv templates templates_old $ mv templates_new/ templates $ Helm delete helloworld release "helloworld" uninstalled $ Helm install helloworld。NAME: helloworld最后部署:星期二May 19 14:27:18 2020命名空间:default STATUS:部署REVISION: 1 TEST SUITE:无$ kubectl logs -f helloworld我的名字是Gary。我在市场部工作。我们公司的名字是ABC公司

太棒了!这符合我们客户的要求。

首先是模板,然后是叠加

在前面的示例中,我们使用Kustomize修改Helm模板以接受新值,然后使用该版本舵安装部署应用程序。

但在某些情况下,这个顺序并不理想。相反,您可能希望首先在本地呈现图表模板,然后在部署应用程序时应用Kustomize覆盖。

当您需要将相同的应用程序部署到多个环境中,但存在诸如标签、安全性或计量等横切关注点时,这种方法可能最有效。例如,您可能对每个环境有不同的需求组合:

环境 标签 安全 计量
dev 是的 没有 没有
测试 是的 没有 是的
生产 是的 是的 是的

类似地,您可能需要为每个环境调整端口或访问。在这些场景中,为每个环境对相同的已呈现的Helm图表应用不同的Kustomize覆盖可能更加灵活。

为此,kubectl命令Line实用程序提供应用- k选项。此功能将对图表应用Kustomizekustomization.yaml目录中的文件。

首先,让我们使用执掌模板命令。这将输出一个解析了所有值的YAML文件,我们将其捕获到本地文件中。

$ mkdir templates_new $ helm template> templates_new /吊舱。Yaml $ $ cat templates_new/pod。#来源:helloworld/templates/~g_v1_pod_helloworld。yaml apiVersion: v1 kind: Pod metadata: name: helloworld spec: containers: - args: - /bin/echo我的名字是Gary。我在市场部工作。我们的公司名称是ABC公司命令:- /bin/sh - -c env: null image: alpine name: hello restartPolicy: Never

创建一个新的定制文件,将标签添加到我们的pod中,如下所示:

$ cat templates_new/ customization . conf- templates_new/pod.yaml . commonLa2022世界杯阿根廷预选赛赛程bels: app: helloworld

现在我们用Kubectl应用-k要用新标签安装图表:

$ kubectl应用-k templates_new/。pod/helloworld created $ kubectl get pods NAME READY STATUS restart AGE helloworld 0/1 Completed 0 10s $ kubectl describe pod helloworld NAME: helloworld命名空间:default优先级:0节点:docker-desktop/192.168.65.3开始时间:周一,2020年6月22日16:22:11 -0700标签:app=helloworld注释:STATUS: Succeeded ... ...

成功!现在,我们可以采用任何供应商的Helm图表,并在顶部添加我们自己的定制,同时继续从上游图表中获取更新。

的深入了解

JFrog的Helm图表非常先进,我们经常需要维护多个版本以供内部使用。使用Kustomize帮助我们避免了手工编辑图表,并使我们的CI/CD过程更加自动化。

想了解更多?观看我们的网络研讨会的录音用定制和头盔为Artifactory供电。我们渴望分享我们所学到的,并帮助您更好地管理您的部署!

相关资源:2022世界杯阿根廷预选赛赛程