在 Kubernetes 中我们使用 YAML 文件来声明我们的应用应该如何部署到底层的集群中,这些 YAML 文件中包含应用定义、治理需要的标签、日志、安全上下文定义、资源依赖关系等,当我们应用扩展到成百上千个 Pod 以后,管理这些 YAML 文件就会成为一场噩梦了。
我们可以把这些声明性质的配置分为三大类:
其实这些我们使用 Helm 就可以轻松地来实现,那为什么我们还需要一个新的工具呢?Helm 和 Kustomize 如何一起实现一些更加强大的功能呢?接下来我们尝试对这些问题就行解答。
首先了解下将应用部署到 Kubernetes 集群中需要的不同的技术。
应用打包和描述
可以帮助我们描述应用并将相关资源打包的能力,比如应用 Meta 数据定义,用配置和服务打包 Pod
依赖管理
可以帮助我们定义依赖关系的功能,例如在部署 Pod 资源之前部署其他依赖资源。
应用程序发现
能够帮助我们发现集群中部署的应用,以及它们的部署历史、依赖关系等。
生命周期管理
帮助我们执行不同的应用部署策略的能力,比如滚动更新、回滚、蓝绿发布等。
应用定制化
能够帮助我们在 YAML 中添加应用/安全/集群相关标签,以便方便解决治理相关的能力。
Helm 基本上可以很好地完成上面的这些工作,但是对于应用定制化这种用例来说,Helm 使用起来就比较麻烦了,结合 Kustomize 就可以很好的解决了,我们可以用下面的一些示例来说明。
比如我们使用 Nginx 的 Helm Charts 来部署 Nginx WAF 到我们的集群中,作为产品团队需求的一部分,我们应该添加一个 annotation 来指定负责部署的团队名称。我们将无法对主 Nginx 的 Git 仓库进行修改,因为它只和我们团队中的应用运行治理策略相关。所以我们需要从 Nginx 仓库中开一个新的分支或者复制 Chart 模板出来根据我们的定制需求进行修改。但是分支或者复制的维护成本相对就比较高了,Kustomize 就可以在这方面提供一些支持。
假设我们有一些网络策略要应用到一组 Pod 中去,安全相关的运维人员要给所有相关的 Pod 添加一个标签,然后创建一个对应的 NetwokPolicy 资源对象。用传统的 Helm 方式,我们应该把标签添加到 Chart 模板中去,但是这样我们就把安全相关的声明标签暴露给应用开发者了,存在一定的安全风险。
在 Kubernetes 的 YAML 资源文件上,有关于应用开发者、应用运维、安全运维、集群运维等团队的一些声明的标签,这些团队的关注点很多都是交叉的,将这些关注点都耦合在一起,会阻碍团队的敏捷性。
比如 Nginx Pod 中存在安全漏洞,安全团队正在寻找一种方法来拦截所有的持续部署流水线,并将 Nginx 镜像版本更新到最新版本,在这种情况下,Kustomize 就可以很好地解决这个问题。
这些就是使用 Kustomize 的好处,它可以帮助我们自定义 YAML 文件,而不用更改原始的 YAML。Kustomize 是一个简单的 CLI 工具,可以添加到任何持续集成或持续部署的流水线中去,甚至可以根据需求作为一个独立的工具使用。
下图给我们展示了一个更高层次的视角,让我们了解到 Helm 和 Kustomize 如何一起提供更加强大的功能。
使用 Kustomize 非常简单,只需要三个步骤:
kustomization.yaml
文件kustomize build
命令kustomization.yaml
文件中是什么样的内容呢?我们举一个简单的示例来说明下。
假如我们有一个由购物车团队部署的 Pod,供移动应用团队使用。同时,安全团队有一个要求,要求将移动应用团队使用的所有服务保存在 ”backend-for-frontend“ 的命名空间下。此外,应用运维团队还需要添加一个标签,以团队命名的分布式调用链标签。这个需求中的kustomization.yaml
文件内容大致如下所示:
commonLabels:
team-name: cart-team
namespace: backend-for-frontend
resources:
- pod.yaml
Pod 的 YAML 文件如下所示:
kustomization 的 YAML 文件如下所示:
最后执行 kustomize build
命令过后的输出内容如下所示:
如果你想直接安装到 Kubernetes 集群中,可以直接执行下面的命令:
kustomize build | kubectl apply -f -
Helm 和 Kustomize 结合使用也非常简单,下面我们通过安装 MariaDB 来进行说明。
首先保存一个 values 文件被覆盖过后的 Helm 模板文件 mariadb.yaml
。下面的示例 values 值是从 config.yaml
中进行覆盖的。
helm template -f config.yaml stable/mariadb > mariadb.yaml
然后对 mariadb.yaml
文件添加 kustomization 的 YAML 文件:
最后,自定义配置并部署到 Kubernetes 集群中去。
kustomize build | kubectl apply -f -
Helm 和 Kustomize 结合在一起使用非常简单,功能也更加强大,希望这篇文章对你有用?。
原文链接:https://medium.com/devops-dudes/helm-is-not-enough-you-also-need-kustomize-82bae896816e