大家好,我是张晋涛。
在 Kubernetes 中,当我们要部署一个应用时,往往会涉及一个或多个部署资源。我们如果使用 YAML 文件来对这些资源的依赖及关联关系进行组织、配置,这往往十分复杂繁琐并且可移植性较差。 Helm 这个 Kubernetes 环境中的包管理器可以帮助我们更快速便捷的来实现资源的组织和部署。
本期的主要内容将围绕 Helm 来进行展开。欢迎小伙伴们留言讨论 (觉得内容还不错,就请点赞点在看及转发,谢谢)。
Helm 的诞生及发展
Helm 1
最早期的 Helm 是一个内部黑客马拉松项目,旨在帮助独立开发人员创建 Kubernetes 资源包并将其部署至集群当中。它是于 2015 年在 Deis 创建,后被微软收购 。在同年的11月9日由 CNCF 主办的 KubeCon 上,正式推出(现在称之为 Helm Classic),这是 Helm 的第一个公开版本。
Helm 2
2016 年 1 月,Helm Classic 与名为 Kubernetes Deployment Manager 的 GCS 工具合并成 Helm,并移至 Kubernetes下。之后,Helm 加入了 CNCF,成为顶级项目,并已成功毕业。
在 Helm 2 开发周期中,引入了一个服务端组件 Tiller。Tiller 可以让多个操作者在同一组发布中进行交互,在共享集群中的团队协作发挥了一定的作用。但是,基于 Kubernetes 1.6 的安全策略,在将 Tiller 安装到多租户集群时,DevOps 和 SRE 必须学习额外的操作步骤。此外,由于 Tiller 是一个服务端组件,在安全性上有很严重的缺陷,所有能访问 Tiller 的用户都具备了相同的权限。
这就引出了:如何化繁为简,即不能陷入在安全控制的繁复上;又不能扩大非预期的权限授予。
在 Helm 2 中,默认使用 ConfigMaps 来存储发布信息,在 Helm 2.7.0 版本中,实现了首个使用 Secrets 存储发布信息的特性。
Helm 3
Tiller 的目标是可以通过 Kubernetes API 来获取信息,在客户端进行 charts 渲染并且将记录存储于 Kubernetes 。 Helm 3 做的第一个决定就是移除 Tiller。随着 Tiller 消失,Helm 的安全模型得到了简化。可以借助 kubeconfig 文件来为 Helm 进行授权。
在 Helm 3 中,默认使用 Secrets 存储发布信息(Release)。并且也将其 Go 模块路径从 k8s.io/helm
切换到了 helm.sh/helm/v3
。
发展
从 2015 年开始,Helm 的贡献者迅速扩张。下方图表显示了随时间推移的贡献者百分比,按国家/地区细分(这是基于 GitHub 上的数据)。自 Helm 加入 CNCF 后,贡献代码的公司总数增加了 41%,从 930 家增加到 1,314 家。(官网上 2015-2019 年的数据对比)
2020 年 4 月 30 日,CNCF 宣布 Helm 正式毕业,这是 CNCF 的第十个毕业项目。
此外,CNCF 的 Artifact Hub 于 2020 年 10 月取代了 Helm Hub 。Artifact Hub 是一个基于 Web 的应用程序,可用于查找、安装和发布 CNCF 项目的包和配置。比如,我们想快速找到 Helm 的 Chart 和插件就可以借助于 Artifact Hub。
Helm 基础介绍
Helm 架构
Helm 是使用 Go 语言编写的,使用 client-go 和 apiserver 进行交互。它将信息存储在 Kubernetes 内部的 Secrets 中(Release),不需要自己的数据库。
Helm 有两个重要的部分:
- Helm CLI - Helm Client 是面向最终用户的命令行客户端。主要负责:本地 chart 开发、管理存储库、管理发布、与 Helm registry 交互。
- Library - Helm 库是独立的,它封装了 Helm 逻辑,支持不同的客户端使用。(可以开心的随意导入使用)
Helm 基本概念
- Chart - Chart files ,即有组织的 YAML 。
- Chart package - Chart files 打包之后就是 Chart package 。
- Chart registry - 存储共享 Chart 。
- Release - 是在 Kubernetes 集群中运行的 Chart 实例。一个 Chart 可以多次安装到同一个集群,每次安装时都会创建一个新的 Release。
Helm 的 Chart 托管
helm charts registry 就是一个 HTTP Server。
它包含一个 index.yaml 文件和一些 chart package。从 Helm 2.2.0 开始,支持对存储库的客户端 SSL 身份验证。其他身份验证协议可作为插件使用。index.yaml 包含存储库中所有 charts 的索引。
chart registry 中的 chart 必须正确打包 ( helm package chart-name/) 并进行版本控制。
Helm v3.8.0 支持通过 OCI Registry 进行 package 分发。chart package 能够在基于 OCI 的 registry 中存储和共享。
- v3.8.0 之前,是实验性的,需要开启。需要设置:export HELM_EXPERIMENTAL_OCI=1
- v3.8.0 之后,默认开启。
Helm 插件
Helm 插件是一种可以通过helmCLI 访问的工具。Helm 插件存在于 $HELM_PLUGINS
。
- Helm 插件可以在 Helm 中添加和删除,而不会影响核心 Helm 工具。
- Helm 插件可以用任何编程语言编写。
- Helm 插件与 Helm 集成,会出现在 helm help 等处。
Helm 版本支持
Helm vs Kubernetes 的版本支持
Helm 不同操作系统下的默认路径
Helm 实践操作
Helm 的部署安装
Helm 是使用 Go 编写的,我们安装时只要下载其二进制文件即可。
一般从 Helm 仓库的 Release 页面进行下载即可。
当然,我们也可以使用下面的脚本自动化的进行安装。
(MoeLove) ➜ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 11156 100 11156 0 0 10399 0 0:00:01 0:00:01 --:--:-- 10406
Helm v3.8.1 is available. Changing from version v3.8.0.
Downloading https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
[sudo] tao 的密码:
helm installed into /usr/local/bin/helm
Helm 的常见操作
创建 Chart
通过 helm create
命令,可以快速的创建一个 Helm Chart。 新创建的 Chart 中预先包含了一些必要的文件。
比如 Chart.yaml
文件中,包含了 Chart 相关的一些元信息。
(MoeLove) ➜ helm create foo
Creating foo
(MoeLove) ➜ ls
foo
(MoeLove) ➜ tree
.
└── foo
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
4 directories, 10 files
查看 Chart 的元信息
我们也可以直接通过 helm show
查看 Chart 相关的一些信息,而无需打开各配置文件。
(MoeLove) ➜ helm show chart foo
apiVersion: v2
appVersion: 1.16.0
description: A Helm chart for Kubernetes
name: foo
type: application
version: 0.1.0
安装
可以通过 helm install
命令将 Helm Chart 安装到 Kubernetes 集群中。
(MoeLove) ➜ helm install foo foo -n demo --create-namespace
NAME: foo
LAST DEPLOYED: Fri Mar 25 01:55:11 2022
NAMESPACE: demo
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace demo -l "app.kubernetes.io/name=foo,app.kubernetes.io/instance=foo" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace demo $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace demo port-forward $POD_NAME 8080:$CONTAINER_PORT
查看 Release
通过 helm list
可以查看已经部署到 Kubernetes 中的 Release 资源。
(MoeLove) ➜ helm -n demo list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
foo demo 1 2022-03-25 01:55:11.18271151 +0800 CST deployed foo-0.1.0 1.16.0
删除 Release
通过 helm uninstall
可以用于删除 Release。
(MoeLove) ➜ helm -n demo uninstall foo
release "foo" uninstalled
打包
通过 helm package
命令可以对 Chart 进行打包。然后通过 helm repo index
命令即可生成 index.yaml
文件。
在此目录中启动一个 HTTP Server ,就可以作为 Helm repo 供下载/安装 Helm Chart 使用了。
(MoeLove) ➜ helm package foo
Successfully packaged chart and saved it to: /tmp/helm/foo-0.1.0.tgz
(MoeLove) ➜ ls
foo foo-0.1.0.tgz
(MoeLove) ➜ helm repo index .
(MoeLove) ➜ ls
foo foo-0.1.0.tgz index.yaml
总结
在本篇中,主要介绍了 Helm 的发展历程,以及其中的核心概念及一些常见的操作方式。
本系列的后续内容中会提供 Helm 的高级用法,以及企业级云原生应用的交付及管理相关的内容,敬请期待!
欢迎订阅我的文章公众号【MoeLove】