今天要来讲说 Helm 这个工具
因为 Helm 版本会不断推陈出新, 因此在今天的内容着重再概念上的说明
而实作的部份不太多琢磨
对 k8s 丛集来说, Helm 是一个套件管理工具
如同 apt 之於 Debain, yum 之於 Fedora, Homebrew 之於 MacOS
假设今天要布署一个 Elastic stack for logging 在一个已发布的 app 上
基本上会需要一个 StatefulSet 因为需要纪录状态
可能还需要一个 Secret 来储存机敏资料
一个 ConfigMap 来储存共用变数
可能还会需要设定 k8s User Permission 来限制存取权限等等
当然 应该会布署几个 Service 来做运行
要做这些设定其实不是很容易
假设今天工作团队中的其他人也要做类似的功能
这时我们就可以透过 Helm 把这些发布过的设定档 (yaml files) 打包成一个 Package (Chart) 放到某个 Chart Repository 让其他团队成员使用
让降低其他团队成员要布署类似功能的复杂度
参考 Helm Chart Repostiory 官方文件定义
这本篇文章提到 Repository 都是指 Chart Repository
Chart Repositroy 是一个 HTTP 的服务器, 用来存放打包好的 Chart 供其他人使用
因为 Chart Repository 主要是支援放置打包过的 yaml 或是 tar 这类打包档案, 因此以下都是可以用来当作 Chart Repository 的选项, GCS(Google Cloud Storage), AWS S3 Bucket, Github Pages, 或是自己建立的 Web Serser.
个别设定内容可以参考官方设定
在这边这个 Registry 就笔者理解是跟 Docker Registry 一样的概念
Helm 在 v3.x.x 开始支援 OCI-based 的存放 Chart 方式
docker run -dp 5000:5000 --restart=always --name registry registry
如果你希望这个 Registry 可以再重开之後保存状态可以在上面指令後加入 -v $(pwd)/registry:/var/lib/registry 参数, 让状态用 docker volume 挂载在 host 机器上
首先, 建立 auth.htpasswd 档案使用以下指令:
htpasswd -cB -b auth.htpasswd myuser mypass
然後透过以下指令跑 Docker
docker run -dp 5000:5000 --restart=always --name registry \
-v $(pwd)/auth.htpasswd:/etc/docker/registry/auth.htpasswd \
-e REGISTRY_AUTH="{htpasswd: {realm: localhost, path: /etc/docker/registry/auth.htpasswd}}" \
registry
把多个设定档(yaml files) 针对某个功能打包成的 Package 就是所谓的 Helm Chart
而产生出来的 Helm Chart 会放到 Chart Repository 让其他人使用
有一些常用到 database app(mongodb, mysql), elastic search, monitoring app(promothes)这些都可以在 Helm repository找到
都可以透过 Helm 工具快速建制使用
建制 app 的时候, 可以使用 helm search hub $功能关键字
来查询是否已经有建制过的 Helm Charts 可以直接拿到使用
或者到 artifact hub 搜索
而这些 Helm Charts 可以放在公开的 Repository 或是私有的
因为有些公司内部建制内部使用的 Package 不会公开
Helm 的另一个功用是用来做范本引擎
举例来说:
假设我们要发布的多个容器服务建制内容只有差在名称跟版本其他是一样的
就可以一样的地方写出一个建立范本, 然後在不同的地方使用变数代入
如 container-pod-template.yaml
apiVersion: v1
kind: Pod
metadata:
name: {{ .Values.name }}
spec:
containers:
- name: {{ .Values.container.name }}
image: {{ .Values.container.image }}
port: {{ .Values.container.port }}
还有对应的 values.yaml
name: my-app
container:
name: my-app-container
image: my-app-image
port: 9001
注意的是, 这边的 Values 物件除了可以透过 yaml 来设定也可以使用 helm install 指令加上 --set 来设定
另外一个使用 Helm 的情境是在不同建制环境中布署相同的应用
只要把原本的应用打包成一个 Chart, 然後发布在不同环境的 k8s 丛集上
Helm 在发布之後, 都会纪录每次发布的版本
可以用以下指令查看过去发布的历史
helm history $release_name
透过以下指令察看 $release_name 目前状况
helm status $release_name
如果这个 $release_name 状态不好
可以使用以下指令做回复到上一个版本
helm rollback $release_name
要注意的是, 当已经做 helm install 某个 chart 之後
下一次, 如果要对 chart 做更新会使用 helm upgrade 这样就会只更新修改的部份
而不是重新起一个新的 Deployment 产生过多的 Deployment
这边想对於注入值的机制做一些说明
因为基本上, values.yaml 的值是 .Value 物件的预设值
然而, 这个预设值可以在 helm install 指令透过以下两个方式复写掉
1 指定 values 参数到另一个设定值 my-values.yaml
helm install --values=my-values.yaml $chart_name
2 加入 --set 指定参数值
helm install --set version=2.0.0
ref https://helm.sh/docs/intro/install/
这边是以 v3.7.0 版本来说明
笔者这边以 snap 在 Ubuntu 20.04 做安装指令为范例如下:
sudo snap install helm --classic
其他 OS 的安装方式可以参考 官方网站
在 v2.x.x 的版本
Helm 分成 client 与 server 的部份
而 server 又被称为 Tiller
主要由 client 发送指令给 Tiller, Tiller 负责实际发布 service
在这样架构下, Tiller 可以对 k8s 丛集新增修改服务, 具有极大的掌控权
因此会担心当 Tiller 被攻击时, 会有资安疑虑
所以在 v3.x.x 的版本移除掉了 Tiller, 只剩下 client 的部份
这边指令, 以 v3.7.0 版来说明
直接从 https://artifiacthub.io 来搜寻
helm search hub $chart_name
举例来说: 搜寻 elasticsearch 的 chart
helm search hub elasticsearch
另外可以自行设定要搜寻的 Repository
helm repo add $repo_name $repo_url
在已经加入的 Repository 搜寻 chart
helm search repo $chart_name
在 v3.7.0 可以透过以下指令来建立 chart
helm create $chart_name [flag]
本文以 v3.7.0 为范例:
每个chart 本身会已 Chart 的名称为资料夹
而内部会有几个重要的档案:
1 Chart.yaml
记载关於 Chart 一些 metadata, 比如说 apiVersion, kubeversion 之类
2 values.yaml
预设的一些 .Value 物件的一些参数值
3 charts 资料夹
有所有跟这个 Chart 有依赖的 chart yaml 档案
4 templates 资料夹
保存这个 Chart 有用到的范本档案, 这些范本档案可以存取 values.yaml 里面的设定值
5 crds 资料夹
保存可以自订资源定义档, 这个在 v2.x.x 版本没有这个资料夹
6 README.md
关於这个 Chart 的说明档, 非必要存在
7 LICENSE
关於这个 Chart 的授权声明档, 非必要存在
举 wordpress 这个 chart 为例:
wordpress/
Chart.yaml # A YAML file containing information about the chart
LICENSE # OPTIONAL: A plain text file containing the license for the chart
README.md # OPTIONAL: A human-readable README file
values.yaml # The default configuration values for this chart
values.schema.json # OPTIONAL: A JSON Schema for imposing a structure on the values.yaml file
charts/ # A directory containing any charts upon which this chart depends.
crds/ # Custom Resource Definitions
templates/ # A directory of templates that, when combined with values,
# will generate valid Kubernetes manifest files.
templates/NOTES.txt # OPTIONAL: A plain text file containing short usage notes
在 v3.7.0 可以透过以下指令来储存目前 chart 到 local cache
helm chart save $chart_directory $repo_url_with_chart_name_and_version
在 v3.7.0 可以透过以下指令来把建立好的 chart 推送到 Repository
helm chart push $repo_url_with_chart_name_and_version
State生命周期 State 的生命周期是指 StatefuleWidget 中的 State 从...
-EAP和802.1X 以下是维基百科的摘录: EAP不是有线协议;相反,它仅定义消息格式。每个使...
陈述式(statement) 定义:单行程序码,只有用来命令执行的功能,无法回传值。 流程控制类:i...
今天来说如何在css中使用圆角的效果,我依旧使用昨天的粉色方块,在粉色方块的css中枢日以下程序码 ...
建立子元素 React.createElement("标签名称",{属性obje...