NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

在 Kubernetes 平台上如何使用 Helm 部署以获得最佳体验?

  • 2020-05-18
  • 本文字数:3312 字

    阅读完需:约 11 分钟

在Kubernetes平台上如何使用Helm部署以获得最佳体验?

在本文中,我们将介绍 Kubernetes 平台上一个十分常用的部署工具——Helm,同时讨论如何在不同类型的工作流中使用 Helm 能最有效地为 Kubernetes 上的基础架构提供简单安全的部署。


Helm 是 Kubernetes 软件生态中的一个软件包管理器,提供了一种“简单的方法来查找、共享和使用为 Kubernetes 而构建的软件”,因此它是常用的管理应用程序部署的工具之一。需要注意的是,Helm 是一种打包格式,而非将代码部署到 Kubernetes 上的工作流程。


Helm 是围绕 chart 构建的。从根本上来说,这些 chart 是一系列定义 Kubernetes 资源相关的 YAML 文件,是 Helm 用于打包 Kubernetes 资源的方式。chart 可以让我们给 Kubernetes 构建模块。

一个基本的 Helm chart

~/charts/app├── Chart.yaml├── README.md├── templates│   ├── NOTES.txt│   ├── _helpers.tpl│   ├── deployment.yaml│   ├── ingress.yaml│   ├── secret.yaml│   └── service.yaml└── values.yaml
复制代码


一个最简单的 Helm chart 由一个 chart 元数据(Chart.yaml 和 values.yaml)和组成主要 chart 的 template 构成。主要的 chart 配置包括 chart 的命名和版本控制。values 文件中提供安装 chart 时配置参数的默认值。Helm 作为一个抽象层,简化了一组可以扩展为多个 Kubernetes 资源清单的值。

Deployment、Service 和 Ingress

大多数 Helm chart 的核心工作是发布联网的应用程序。有 3 种资源是部署应用程序的关键,同时还能够从外部集群与之进行通信:


  • Deployment 发布你的代码

  • Service 将流量从内部路由到你的代码

  • Ingress 将外部流量路由到集群中的代码


现在让我们来看一个关于在 Helm chart 中 service 的例子以及 template 如何让我们重定义选项:


kind: Servicemetadata:  name: {{ include "app.fullname" . }}  labels:{{ include "app.labels" . | indent 4 }}spec:  type: {{ .Values.service.type }}
复制代码


这一简单的 service 资源示例显示了一些模板工具,可用于创建帮助程序以指定资源的全名。创建此服务的相应值如下所示:


service:  type: ClusterIP  port: 80
复制代码


这是使用 Helm 抽象出底层资源的一个简单示例。

固定的工作发布流程

Helm 旨在减少分散的资源管理以安装软件到你的集群中。在选择 Helm 发布代码时,这里有两套工作流程:


  1. 发布第三方代码到集群。此代码通常是语义版本,并以较慢的节奏发布,可能是每月或每年,具体取决于更新周期。

  2. 持续部署到你的 Kubernetes 集群。这类代码常常每日发布,或者更频繁。


第一种情况是 Helm 最初的设计目的,它要求 chart 实现语义版本并使 chart 升级相对简单。使用 Helm 最有效的方法是配合第三方程序一起使用,如 Terraform。这组合可以在集群中实现稳定且一致的发布流程。这通常与你的基础架构的其余部分一起作为代码工作流程。


本文的主要目的是了解在持续部署过程中如何使用 Helm。在开始时,有效地执行此操作可能看起来很简单,但要确保部署有效,还是需要注意一些事项。


使用 Helm 和 CLI 一起部署会相对简单,指定以下命令集以使用生产 value 文件中的值在默认命名空间中发布新的 chart:


helm upgrade --install release-name \  --namespace default \  --values ./production.yml
复制代码


当我运行这一命令时会发生什么呢?Helm 有一个称为 Tiller 的服务端,Helm 打开与 Kubernetes 集群的连接,并将你的 Helm chart 与作为参数传递的值一起写入此连接。服务端组件将这些值发送给模板,并将它们应用到 Kubernetes 集群中。


这些是 Helm 运行部署的基础知识。固定的部分和工作流程包括确定作为参数传递的值以及何时运行 Helm 升级命令。接下来,我们将讨论在企业内执行这些操作的正确方式。

避免在每个 service 都创建一个 chart

使用 Helm chart 的一个好处是你可以跨组织或跨项目使用一个通用的配置也能够保持一致,还能将配置合并到一个 chart 中。虽然将单个 chart 放在要部署的每个 repository 中更简单,但是还是需要花费一些时间来构建一组核心 chart,这些 chart 可用于整个组织的 service。


这可以加快诸如标准化健康检查路径之类的速度,并保持跨资源配置的一致。此外,如果你想在 Kubernetes 资源成熟时采用更新的 api 版本,你可以从中心位置执行此操作。


但是目前 Helm chart 逐渐变得冗长,因此在实际操作中创建十分困难。你需要确保未定义的变量不会出错,同时标签是一致的,并且不会有任何 Yaml 缩进错误。然后最好将 Helm chart 交给那些使用 Kubernetes 方面经验丰富的人进行创建,开发人员可以将其作为模板。

分离生产和 staging 配置值

你推送到 chart 中的配置值能在环境之间分离开。构建简单的可扩展的 chart 可以覆盖每个环境。


例如,一个优秀的工作流程为每个环境提供不同的 value 文件,并且文件之间有特定区别:


~/myapp└── config    ├── production.yml    └── staging.yml
复制代码


根据部署环境使用每个 value 文件,这与使用 if 语句或其他逻辑将配置 bake 到 Helm chart 相反。Helm 可以抽象出 Kubernetes 资源,而 value 文件是传递环境和应用程序特定信息的方式。


请使用“require”语句和 linting 工具以确保在部署时没有未定义的值。如果以下变量未定义,可能会导致相对严重的配置问题:


host: {{ .Values.hostPrefix }}.example.com
复制代码

Secret 管理

Kubernetes secret 是管理应用程序 secret 最简单的方式之一。Helm 不会尝试以任何方式管理 secret 而你可能会陷入配置复杂工作流程的困境。这里有一个 secret 管理的简单的建议:


  1. 使用你的 CI/CD 在它们的 dashboard 中存储 secret

  2. 传递 secret value 到在 deployment 上的 chart value

  3. 当这些 secret value 发生变化时,使用校验来 roll out 这些 pod


我们想在集群中发布一个新的 secret,以便在我们的 deployment 流水线中可审计和可见,同时我们希望开发人员也可以访问它。


这里推荐一个十分好用的 secret 管理的工具——vault,它深度集成了 Kubernetes 以提供更进一步的安全性。它可能需要花费更长的时间设置,但它提供了一些企业可以使用的高级功能。

编辑 value

确保在使用 Helm CLI 时,只有 Helm 可以更改 Kubernetes 资源清单中的值。例如,不要在 Helm 的外部修改 deployment 的副本并且使用 Helm 来更改 value。如果你之前使用过 Kubernetes,你可能使用过 kubectl apply 这个工具。这是应用基础设施到集群中最简单的方式之一。但 Helm 不与 kubectl 使用相同的技术。这意味着如果你在 Helm 外部编辑基础设施,下次运行 Helm 命令时可能会导致问题。

Helm chart repository

Helm chart repository 本质上是一个 web 服务器,提供 chart 资源。你可以 github.com/helm/charts 上查看官方提供的 chart 资源。chart repository 最初是为了语义版本 chart 而设计的。因此,chart repository 无法很好地处理并发更新。


Helm chart 应该是语义版本的模块,它们代表底层基础架构以部署应用程序。将它们视为一个用于抽象 Kubernetes 复杂性的库。将 chart 存储在整个组织可访问的 repository 中,并允许开发人员使用这些 chart 来在企业中进行部署。


在整个组织中分发 chart 的简单方式是使用 S3 甚至 GitHub 版本作为 chart 的存储。还有一个简单的模式是拥有一个共同的 myorg / charts repository,其中包含您的团队已经策划和构建的所有 chart,都可以安装到 Kubernetes 中。

保护你的 Tiller

如果你的 Kubernetes 集群有严格的访问控制,你可能会被 Tiller(Helm 的服务器端组件)作为 Kubernetes 集群中的超级用户运行的问题难住。对于此,有一些解决方法但需要使用一些更复杂的配置。而对于大多数团队而言,默认的配置是连接到 Helm 时具有集群的管理员访问权限,因此太过复杂的配置不太适合。


一个常见的修复这一问题的方法是在不同的命名空间中创建一个不同的 Tiller 实例。如果你的 Kubernetes 集群规模很大,这可能是一种将特定团队细分为只能访问单个 Tiller 的方法。

总结

新的 Kubernetes deployment 面临的最大挑战之一是没有花时间阅读最佳实践和意见以在第一次时正确设置 deployment 流水线。Helm deployment 有许多问题,你需要找到正确的设置,一旦正确完成,即可获得灵活性等优势,可以有效地连接你的 deployment。


2020-05-18 18:011154

评论

发布
暂无评论
发现更多内容

配置企业应用业务流程别头大,有工作流引擎就不怕

Marilyn

敏捷开发

算法图解:如何用两个栈实现一个队列?

王磊

Java 数据结构 算法和数据结构

让“物”能说会道,揭晓华为云IOT黑科技

华为云开发者联盟

物联网 华为云

JMM 应用实例:单例模式

朱华

单例模式

使用Hugo和GitHub搭建博客

Felix

GitHub GitHub Pages Blog Hugo

这个应用魔方厉害了,让软件开发者效率提升10倍

华为云开发者联盟

软件开发 代码

前端科普系列(5):ESLint - 守住优雅的护城河

vivo互联网技术

Java 大前端 代码仓库

【架构师训练营 1 期】第五周作业

诺乐

超越视觉支持语音新版OpenVINO发布,为更多智能边缘开发者赋能

E科讯

Go发起HTTP2.0请求流程分析(后篇)——标头压缩

Gopher指北

后端 HTTP2.0 Go 语言

5. Bean Validation声明式验证四大级别:字段、属性、容器元素、类

YourBatman

Hibernate-Validator Bean Validation 数据校验

架构师训练营 - 第 5 周课后作业(1 期)

Pudding

环信入选2020在线教育视频云创新排行TOP10

DT极客

阿里云盘线下交流会

兔2🐰🍃

阿里云网盘 Teambition 线下体验

1024丨奈学教育致敬程序员:‘3+2’战略发布会圆满落幕

古月木易

奈学教育

独家揭秘 | 京东物流Elasticsearch大规模“迁移上云”实践

京东科技开发者

云计算

iOS touch事件点的获取

teoking

ios

架构师训练第五周 -编程语言实现一致性 hash 算法

郎哲158

JVM系列笔记 - 虚拟机栈

朱华

JVM

架构训练营 - 第5周课后作业 - 学习总结

Pudding

10月24日,“网安小酒馆”线上活动开启,有红包,更有名酒相送

Cloudaemon

一文快速入门分库分表中间件 Sharding-JDBC (必修课)

程序员小富

Java 分库分表

【架构师训练营 1 期】第五周学习总结

诺乐

万字长文深入理解java中的集合-附PDF下载

程序那些事

java编程 JAVA集合 java集合总结 java集合使用 java秘籍

LAXCUS 大数据集群操作系统:一个分布式分时共享 E 级系统软件(五)

陈泽云

人工智能 数据库 大数据 操作系统

mongodb源码实现系列-网络传输层模块实现二

杨亚洲(专注MongoDB及高性能中间件)

MySQL 数据库 mongodb 高性能 分布式数据库mongodb

1024丨奈学教育致敬程序员:‘3+2’战略发布会圆满落幕

奈学教育

程序员 奈学教育

两个程序员老友的会面

Learun

敏捷开发

Consistent Hashing算法实现 - JavaScript

非阻塞的无界线程安全队列 —— ConcurrentLinkedQueue

程序员小航

Java 源码 并发 源码阅读 JUC

Docker内部组件

混沌畅想

Docker 容器 运维

在Kubernetes平台上如何使用Helm部署以获得最佳体验?_文化 & 方法_Rancher_InfoQ精选文章