IT 铁人赛 k8s 入门30天 -- day11 Helm - Package Manager

前言

今天要来讲说 Helm 这个工具

因为 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 让其他团队成员使用

让降低其他团队成员要布署类似功能的复杂度

Chart Repositroy

参考 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

在这边这个 Registry 就笔者理解是跟 Docker Registry 一样的概念

Helm 在 v3.x.x 开始支援 OCI-based 的存放 Chart 方式

透过 Docker 来跑一个自行建立的 Registry自行建立 local Registry

docker run -dp 5000:5000 --restart=always --name registry registry

如果你希望这个 Registry 可以再重开之後保存状态可以在上面指令後加入 -v $(pwd)/registry:/var/lib/registry 参数, 让状态用 docker volume 挂载在 host 机器上

加入 Auth

首先, 建立 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

Helm Chart

把多个设定档(yaml files) 针对某个功能打包成的 Package 就是所谓的 Helm Chart

而产生出来的 Helm Chart 会放到 Chart Repository 让其他人使用

Helm 使用情境

共用常用布署

有一些常用到 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

value 注入 template 的机制

这边想对於注入值的机制做一些说明

因为基本上, 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

安装 Helm

ref https://helm.sh/docs/intro/install/

这边是以 v3.7.0 版本来说明

笔者这边以 snap 在 Ubuntu 20.04 做安装指令为范例如下:

sudo snap install helm --classic

其他 OS 的安装方式可以参考 官方网站

Helm 版本差异

在 v2.x.x 的版本

Helm 分成 client 与 server 的部份

而 server 又被称为 Tiller

主要由 client 发送指令给 Tiller, Tiller 负责实际发布 service

在这样架构下, Tiller 可以对 k8s 丛集新增修改服务, 具有极大的掌控权

因此会担心当 Tiller 被攻击时, 会有资安疑虑

所以在 v3.x.x 的版本移除掉了 Tiller, 只剩下 client 的部份

Helm 搜寻套件指令

这边指令, 以 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

Helm 建立

在 v3.7.0 可以透过以下指令来建立 chart

helm create $chart_name [flag]

Chart 结构

本文以 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

Helm Save Chart 到 local cache

在 v3.7.0 可以透过以下指令来储存目前 chart 到 local cache

helm chart save $chart_directory $repo_url_with_chart_name_and_version

Helm Push Chart 到 Repository

在 v3.7.0 可以透过以下指令来把建立好的 chart 推送到 Repository

helm chart push $repo_url_with_chart_name_and_version 

<<:  聊天室(上)- 客制元件Xib建立

>>:  Day 21 - 研习计画之结案发表与业师心得篇

Flutter体验 Day 7-State生命周期

State生命周期 State 的生命周期是指 StatefuleWidget 中的 State 从...

LEAP(轻量级可扩展认证协议)

-EAP和802.1X 以下是维基百科的摘录: EAP不是有线协议;相反,它仅定义消息格式。每个使...

为了转生而点技能-javascript,day3(陈述式及表达式、函式陈述式与函式表达式

陈述式(statement) 定义:单行程序码,只有用来命令执行的功能,无法回传值。 流程控制类:i...

css 圆角效果

今天来说如何在css中使用圆角的效果,我依旧使用昨天的粉色方块,在粉色方块的css中枢日以下程序码 ...

[Day27] React - 建立子元素

建立子元素 React.createElement("标签名称",{属性obje...