Helm[1] 作为 Kubernetes 体系的包管理工具,已经逐渐成为了应用分发标准,在 .NET 开发中,可以理解为与 NuGet 包类似。回顾之前文章中的介绍,Kubernetes 中单个服务的部署有时会涉及到多种资源类型,如:Deployemet
、Service
、Ingress
、PVC
、ConfigMap
、Secret
等,而通过 Helm 可以把服务相关资源打包到一个 chart 中,以 chart 为单位,进行版本管理,简化 Kubernetes 部署应用的版本控制、打包、发布、删除、更新等操作。
以下是 Helm 3 的架构图,通过 Helm Client 创建 chart ,然后把基于 chart 将相关资源在 Kubernetes 中创建,同时 chart 可被保存到 chart 仓库,进行 chart 包管理与共享。
Helm 安装与配置
Helm 3 的安装参考文档 Installing Helm[2] 简单几步即可完成,我这里采用的是 Binary Releases 方式。安装完成后需添加 chart 仓库源,有了 chart 仓库源才能进行搜索与安装。下面先添加 azure
和 aliyun
的仓库源:
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
经过以上配置,就可以通过 helm search repo xxxx
搜索相关 chart 包进行安装使用(和 docker search 类似)。如:
搭建 repo
这里将使用 harbor[3] 来保存 Helm chart,下载最新 harbor-offline-installer[4] 的 release 版本,解压后对 harbor.yml
进行相关修改,主要调整配置如下(如果不使用 https ,需要注释配置文件中 https 相关字段):
hostname: 192.168.124.9 # 访问地址
http:port: 8888 # 端口
chart:absolute_url: enabled
首次安装,执行以下命令(之后停止或启动执行 ./docker-compose start|stop
):
./install.sh --with-clair --with-chartmuseum
安装成功后,访问 http://192.168.124.9:8888
,创建名为 charts
的项目作为接下来使用的 chart 仓库。
在 Helm 中添加自建的 repo http://192.168.124.9:8888/chartrepo/charts
,因为 charts 项目是私有级别,所以在添加时需要传入用户名和密码,如下:
helm repo add harbor http://192.168.124.9:8888/chartrepo/charts --username=admin --password=Harbor12345
helm repo update
创建 Chart
执行命令 helm create k8sdemo
创建名为 k8sdemo
的 chart,会生成一批文件,文件结构如下图,可以看出有些文件是我们比较熟悉的,如:deployement.yaml
、ingress.yaml
、service.yaml
:
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
charts:存放该 chart 依赖的所有子 chart;
Chart.yaml:基本信息定义,如:名称、版本、描述等;
templates:存放模板文件,
_helpers.tpl
定义变量,NOTES.txt
注释文件,yaml 文件则是各资源类型定义模板,tests
下是相关的测试模板;values.yaml:定义模板中需要使用的常量,如果需要对常量进行二次处理,则需要在
_helpers.tpl
通过变量实现,如:
{{- define "k8sdemo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
在 templates 文件夹下的模板文件中包含大量的常量、变量的引用,具体语法就不详细介绍了,基本多看两眼都能理解
k8sdemo chart 创建主要包含以下 3 个文件的调整:
values.yaml
主要修改内容如下,创建 3 个 Pod,镜像使用beckjin/k8sdemo:1.0.0
版本,以 NodePort 的方式提供服务,对外端口为 31000,其他可保持默认:
replicaCount: 3image:repository: beckjin/k8sdemopullPolicy: IfNotPresenttag: "1.0.0"service:type: NodePortport: 80nodePort: 31000
templates/deployment.yaml
主要修改健康检查的配置,默认是 /
路由,这里改成 /weatherforecast
,如下:
livenessProbe:httpGet:path: /weatherforecastport: http
readinessProbe:httpGet:path: /weatherforecastport: http
templates/service.yaml
主要修改 nodePort 字段,引用常量 Values.service.nodePort
,如下:
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpnodePort: {{ .Values.service.nodePort }}protocol: TCPname: http
其他的几个模板文件暂无需调整,可通过查看每个 yaml 文件的具体代码,像 hpa.yaml
、ingress.yaml
、serviceaccount.yaml
都是含开关控制的,默认不启用。最后可以通过 helm lint k8sdemo/
进行语法检查,如果没问题就可以直接打包成 chart 使用了。
推送到 repo
chart 的推送这里将使用 helm-push[5] 插件来完成,它的作用是将创建出来的 chart 包推送到远端的 chart 仓库。由于网络上的问题,建议直接下载对应系统版本的 release 包,上传至 Helm 的插件目录,Linux 下为:/root/.local/share/helm/plugins/
。
└── helm-push├── bin│ └── helmpush├── helm-push_0.8.1_linux_amd64.tar.gz├── LICENSE└── plugin.yaml
将 k8sdemo 文件夹进行打包,生成 k8sdemo-1.0.0.tgz
helm package k8sdemo/
推送到 harbor
helm push k8sdemo-1.0.0.tgz harbor
推送成功后在 charts 项目的 Helm Charts
下会有出现对应的 chart 包:
安装 Chart
在进行安装使用前,需要先进行 helm repo update
操作,不然获取不到最新的内容,另外可执行命令 helm search repo k8sdemo
查看结果:
执行命令 helm install k8sdemo harbor/k8sdemo
进行安装,最终会输出如下内容,这部分信息其实是在 NOTES.txt
中定义的。我们可以根据提示信息执行命令,获取服务访问地址,当然也可以直接通过 kubectl get services
查看。
升级
如果 chart 需要升级,可修改 Chart.yaml
中的 version
字段,重新打包并推送,然后 helm repo update
更新 chart 仓库,最后执行 helm upgrade k8sdemo harbor/k8sdemo
进行升级。
回滚
通过 helm history k8sdemo
查看历史版本,然后执行 helm rollback k8sdemo 版本号
即可回滚到之前的版本。
参考资料
[1]
Helm: https://helm.sh/
[2]Installing Helm: https://helm.sh/docs/intro/install/
[3]harbor: https://github.com/goharbor/harbor
[4]harbor-offline-installer: https://github.com/goharbor/harbor/releases
[5]helm-push: https://github.com/chartmuseum/helm-push