前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Helm还不够,也许你还需要Kustomize

Helm还不够,也许你还需要Kustomize

作者头像
CNCF
发布2020-06-05 11:23:13
2K0
发布2020-06-05 11:23:13
举报
文章被收录于专栏:CNCFCNCF

在 Kubernetes 中我们使用 YAML 文件来声明我们的应用应该如何部署到底层的集群中,这些 YAML 文件中包含应用定义、治理需要的标签、日志、安全上下文定义、资源依赖关系等,当我们应用扩展到成百上千个 Pod 以后,管理这些 YAML 文件就会成为一场噩梦了。

我们可以把这些声明性质的配置分为三大类:

  1. 应用打包
  2. 应用配置
  3. 运行时配置

其实这些我们使用 Helm 就可以轻松地来实现,那为什么我们还需要一个新的工具呢?Helm 和 Kustomize 如何一起实现一些更加强大的功能呢?接下来我们尝试对这些问题就行解答。

Helm 有哪些优缺点?

首先了解下将应用部署到 Kubernetes 集群中需要的不同的技术。

应用打包和描述

可以帮助我们描述应用并将相关资源打包的能力,比如应用 Meta 数据定义,用配置和服务打包 Pod

依赖管理

可以帮助我们定义依赖关系的功能,例如在部署 Pod 资源之前部署其他依赖资源。

应用程序发现

能够帮助我们发现集群中部署的应用,以及它们的部署历史、依赖关系等。

生命周期管理

帮助我们执行不同的应用部署策略的能力,比如滚动更新、回滚、蓝绿发布等。

应用定制化

能够帮助我们在 YAML 中添加应用/安全/集群相关标签,以便方便解决治理相关的能力。

Helm 基本上可以很好地完成上面的这些工作,但是对于应用定制化这种用例来说,Helm 使用起来就比较麻烦了,结合 Kustomize 就可以很好的解决了,我们可以用下面的一些示例来说明。

示例1:维护成本 - Git Fork 或者复制

比如我们使用 Nginx 的 Helm Charts 来部署 Nginx WAF 到我们的集群中,作为产品团队需求的一部分,我们应该添加一个 annotation 来指定负责部署的团队名称。我们将无法对主 Nginx 的 Git 仓库进行修改,因为它只和我们团队中的应用运行治理策略相关。所以我们需要从 Nginx 仓库中开一个新的分支或者复制 Chart 模板出来根据我们的定制需求进行修改。但是分支或者复制的维护成本相对就比较高了,Kustomize 就可以在这方面提供一些支持。

示例2:安全风险

假设我们有一些网络策略要应用到一组 Pod 中去,安全相关的运维人员要给所有相关的 Pod 添加一个标签,然后创建一个对应的 NetwokPolicy 资源对象。用传统的 Helm 方式,我们应该把标签添加到 Chart 模板中去,但是这样我们就把安全相关的声明标签暴露给应用开发者了,存在一定的安全风险。

示例3:不同团队关注点交叉

在 Kubernetes 的 YAML 资源文件上,有关于应用开发者、应用运维、安全运维、集群运维等团队的一些声明的标签,这些团队的关注点很多都是交叉的,将这些关注点都耦合在一起,会阻碍团队的敏捷性。

示例4:在持续部署流水线中打补丁

比如 Nginx Pod 中存在安全漏洞,安全团队正在寻找一种方法来拦截所有的持续部署流水线,并将 Nginx 镜像版本更新到最新版本,在这种情况下,Kustomize 就可以很好地解决这个问题。

这些就是使用 Kustomize 的好处,它可以帮助我们自定义 YAML 文件,而不用更改原始的 YAML。Kustomize 是一个简单的 CLI 工具,可以添加到任何持续集成或持续部署的流水线中去,甚至可以根据需求作为一个独立的工具使用。

下图给我们展示了一个更高层次的视角,让我们了解到 Helm 和 Kustomize 如何一起提供更加强大的功能。

Kustomize 如何使用

使用 Kustomize 非常简单,只需要三个步骤:

  • 在我们要定制的 YAML 资源中添加 kustomization.yaml 文件
  • 在 YAML 中添加定制的内容
  • 然后运行 kustomize build 命令

kustomization.yaml文件中是什么样的内容呢?我们举一个简单的示例来说明下。

假如我们有一个由购物车团队部署的 Pod,供移动应用团队使用。同时,安全团队有一个要求,要求将移动应用团队使用的所有服务保存在 ”backend-for-frontend“ 的命名空间下。此外,应用运维团队还需要添加一个标签,以团队命名的分布式调用链标签。这个需求中的kustomization.yaml 文件内容大致如下所示:

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Helm 有哪些优缺点?
    • 示例1:维护成本 - Git Fork 或者复制
      • 示例2:安全风险
        • 示例3:不同团队关注点交叉
          • 示例4:在持续部署流水线中打补丁
            • Kustomize 如何使用
              • Helm ➕ Kustomize
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档