Helm 是 Kubernetes 的包管理器。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。
在红帽系的Linux中我们使用yum来管理RPM包,类似的,在K8s中我们可以使用helm来管理资源对象(Deployment、Service、Ingress...)实现K8s中应用的快速发布、升级、维护和分享。helm官方文档
helm install命令,在 Kubernetes 集群上安装该chart的新版本。Helm (v3版本)为 K8s 提供的功能包括:
Helm可以用源码或构建的二进制版本安装。参考:安装Helm
Artifact Hub 是一个开源项目,我们通过它来查找、安装或发布k8s应用。
除了通过web搜索,也可以通过helm命令行方式:
#helm search hub redisURL CHART VERSION APP VERSION DESCRIPTIONhttps://hub.helm.sh/charts/bitnami/redis 16.4.0 6.2.6 Redis(TM) is an opensource, advanced key-value...https://hub.helm.sh/charts/wenerme/redis 16.4.0 6.2.6 Redis(TM) is an opensource, advanced key-value......找到redis版本为6.2.6,chart版本16.4.0的包,访问 url https://hub.helm.sh/charts/bitnami/redis 新版本已被重定向到artifacthub.io

由图上信息可以知redis是一个来自Bitnami仓库(由VMware主导的开源软件仓库),通过验证的版本,仓库地址https://charts.bitnami.com/bitnami
要安装这个应用我们应先将Bitnami仓库添加到本地配置中。
#helm repo add bitnami https://charts.bitnami.com/bitnami安装redis,release名称为redis-dev
# helm install redis-dev bitnami/redisNAME: redis-devLAST DEPLOYED: Sun Feb 13 20:09:30 2022NAMESPACE: defaultSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:CHART NAME: redisCHART VERSION: 16.4.0APP VERSION: 6.2.6这样我们可以轻松发布一个一主三从的redis集群到k8s中
# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONredis-dev default 1 2022-02-13 20:09:30.755534484 +0800 CST deployed redis-16.4.0Helm 通过向资源对象中添加标签来跟踪安装在 Kubernetes 集群上的chart。这些标签看起来像app.kubernetes.io/managed-by=Helm和app.kubernetes.io/instance: myapp。
# kubectl get all -l app.kubernetes.io/instance=redis-devNAME READY STATUS RESTARTS AGEpod/redis-dev-master-0 1/1 Running 0 27mpod/redis-dev-replicas-0 1/1 Running 0 27mpod/redis-dev-replicas-1 1/1 Running 0 24mpod/redis-dev-replicas-2 1/1 Running 0 23mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/redis-dev-headless ClusterIP None <none> 6379/TCP 27mservice/redis-dev-master ClusterIP 10.96.52.104 <none> 6379/TCP 27mservice/redis-dev-replicas ClusterIP 10.96.230.162 <none> 6379/TCP 27mNAME READY AGEstatefulset.apps/redis-dev-master 1/1 27mstatefulset.apps/redis-dev-replicas 3/3 27m删除redis-dev的发布,将会移除标签跟踪的所有资源对象。
# helm uninstall redis-devrelease "redis-dev" uninstalled显然大多数时候我们更想发布自己的应用到K8s中或者需要对将要发布的开源软件做一些配置上的修改,所以我们可以通过helm自己构建一个chart或者使用helm pull下载一个chart做修改后再上传的内部或外部仓库中。
下面来创建一个简易的nginx chart
# helm create chart-nginxCreating chart-nginxchart的目录结构,你可以删除模板中的所有文件自建或使用默认模板
# tree chart-nginx/chart-nginx/├── charts #依赖的chart目录├── Chart.yaml #chart版本信息├── templates #资源对象模板目录│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── hpa.yaml│ ├── ingress.yaml│ ├── NOTES.txt #提示信息│ ├── serviceaccount.yaml│ ├── service.yaml│ └── tests│ └── test-connection.yaml└── values.yaml #模板值3 directories, 10 filesChart.yaml声明了版本信息,我们可以进行自定义
# Chart.yamlapiVersion: v2name: chart-nginxdescription: A Helm chart for Kubernetestype: applicationversion: 0.1.0 #chart版本appVersion: 1.0.0 #app版本helm默认创建的模板文件deployment.yaml如下:

helm 采用go模板,官方文档Chart模板
通过deployment模板中可以看到image的值会引用value文件中定义的image.repository和tag,如果tag值为空则返回默认引用Chart.appVersion的值。
接着根据需要更新value.yaml文件中image和service等相关信息,同时关闭serviceAccount、ingress、hpa的创建。

模板文件service.yaml定义好了type和pod的引用。

一个基本的nginx chart创建好了。通过helm template 命令渲染模板查看一下
# helm template chart-nginx---# Source: chart-nginx/templates/service.yamlapiVersion: v1kind: Servicemetadata: name: RELEASE-NAME-chart-nginx labels: helm.sh/chart: chart-nginx-0.1.0 app.kubernetes.io/name: chart-nginx app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/version: "1.0.0" app.kubernetes.io/managed-by: Helmspec: type: NodePort ports: - port: 80 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: chart-nginx app.kubernetes.io/instance: RELEASE-NAME---# Source: chart-nginx/templates/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: RELEASE-NAME-chart-nginx labels: helm.sh/chart: chart-nginx-0.1.0 app.kubernetes.io/name: chart-nginx...再通过helm lint检查语法
==> Linting chart-nginx[INFO] Chart.yaml: icon is recommended1 chart(s) linted, 0 chart(s) failedok,通过helm install发布到k8s,参照NOTES说明可进行访问。
# helm install chart-nginx --generate-nameNAME: chart-nginx-1644771770LAST DEPLOYED: Mon Feb 14 01:02:50 2022NAMESPACE: defaultSTATUS: deployedREVISION: 1NOTES:1. Get the application URL by running these commands: export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services chart-nginx-1644771770) export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT查看资源正常。
# kubectl get all -l app.kubernetes.io/name=chart-nginxNAME READY STATUS RESTARTS AGEpod/chart-nginx-1644771770-69bbb4fdf8-gqdk7 1/1 Running 0 3m59spod/chart-nginx-1644771770-69bbb4fdf8-wwxw2 1/1 Running 0 3m59sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/chart-nginx-1644771770 NodePort 10.96.231.61 <none> 80:32631/TCP 3m59sNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/chart-nginx-1644771770 2/2 2 2 3m59sNAME DESIRED CURRENT READY AGEreplicaset.apps/chart-nginx-1644771770-69bbb4fdf8 2 2 2 3m59s首先通过helm packge将chart-nginx打包
# helm package chart-nginxSuccessfully packaged chart and saved it to: .../../chart-nginx-0.1.0.tgz建立chart私有仓库,可参考开源项目chartmuseum,如有必要你也可将仓库提交至artifacthub发布到互联网。
将chart-nginx-0.1.0.tgz上传至仓库后,通过curl列出chart信息如下:
# curl http://192.168.1.123:8088/api/charts |python -m json.tool{ "chart-nginx": [ { "apiVersion": "v2", "appVersion": "1.0.0", "created": "2022-02-13T17:37:43.653117345Z", "description": "A Helm chart for Kubernetes", "digest": "58a687be62a2a2a2b1dd177675bbc5aa49ac754df2219149bb4798636662b57c", "name": "chart-nginx", "type": "application", "urls": [ "charts/chart-nginx-0.1.0.tgz" ], "version": "0.1.0" } ]}将仓库添加到你的其他k8s集群helm中,实现应用共享和发布。
# helm repo add chartmuseum http://192.168.1.123:8088"chartmuseum" has been added to your repositories搜索chart-nginx
# helm search repo chart-nginxNAME CHART VERSION APP VERSION DESCRIPTIONchartmuseum/chart-nginx 0.1.0 1.0.0 A Helm chart for Kubernetes通过仓库发布chart-nginx
# helm install my-chart-nginx chartmuseum/chart-nginxNAME: my-chart-nginxLAST DEPLOYED: Mon Feb 14 01:54:34 2022NAMESPACE: defaultSTATUS: deployedREVISION: 1...以上我们对helm进行了基本介绍以及如何创建一个自己的helm chart,如何结合私有仓库chartmuseum在K8s中发布应用。
希望小作文对你有些许帮助,如果内容有误请指正。通过博客阅读:iqsing.github.io