Helm是GO语言编写的,是管理kubernetes集群中应用程序包的客户端工具。Helm是类似于centos上的yum工具或Ubuntu上的apt-get工具。
除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。
Helm中并不提供镜像,但资源清单中会指明相关的镜像仓库。您可以在 CNCF Helm 项目旅程报告中阅读详细的背景信息。
Helm 可以从源代码安装、从预构建的二进制版本和 包管理器等方式安装。
下面以macOS和windows为例安装 helm
(1) Homebrew (macOS)
Helm 社区的成员为 Homebrew 贡献了一个 Helm 公式构建。这个公式通常是最新的。
brew install helm
(2)从 Chocolatey (Windows)
Helm 社区的成员 为Chocolatey贡献了一个Helm 包构建 。这个包通常是最新的。
choco install kubernetes-helm
下面介绍 使用 Helm 管理 Kubernetes 集群上的包的基础知识。
helm 通过三大概念来管理 k8s 上的包:
chart看作linux中rpm包,repository看作repo仓库,release就是我们的yum install安装启动后的软件。
再举个例子
chart看作docker镜像,release看作 docker镜像运行的容器,而Repository看作我们的docker Hub镜像仓库。
下面操作 以nginx为例
Helm 自带一个强大的搜索命令,可以从两种来源中进行搜索:
从 Artifact Hub 中搜索所有的 nginx charts。
$ helm search hub nginx
URL CHART VERSION APP VERSION DESCRIPTION
https://artifacthub.io/packages/helm/wiremind/n... 2.1.1 An NGINX HTTP server
https://artifacthub.io/packages/helm/zrepo-test... 5.1.5 1.16.1 Chart for the nginx server
https://artifacthub.io/packages/helm/mirantis/n... 0.1.0 1.16.0 A NGINX Docker Community based Helm chart for K...
使用 helm repo add命令,添加gitlab仓库。
$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories$ helm search repo nginx
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 10.2.1 1.21.6 NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller 9.1.27 1.2.0 NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel 1.0.5 0.4.7 NGINX Open Source for Intel is a lightweight se...
bitnami/kong 5.0.2 2.7.0 Kong is a scalable, open source API layer (aka ...
helm search repo 命令,你可以从你所添加的仓库中查找chart的名字。helm install命令来安装它。Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
$ helm install my-nginx bitnami/nginx --version 10.2.1
NAME: my-nginx
LAST DEPLOYED: Fri May 6 11:06:07 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 10.2.1
APP VERSION: 1.21.6
使用 helm status来追踪 release 的状态、信息。
$ helm status my-nginx
NAME: my-nginx
LAST DEPLOYED: Fri May 6 11:06:07 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 10.2.1
APP VERSION: 1.21.6
查看helm安装,releases的列表[root@master helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-nginx default 1 2022-05-06 11:06:07.215433713 +0800 CST deployed nginx-10.2.1 1.21.6
浏览器访问,验证nginx服务
查看nginx的svc
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 115d
my-nginx LoadBalancer 10.102.231.181 <pending> 80:30769/TCP 25m

上述nginx安装只是使用仓库chart的默认配置。不利于个性化需求和生成环境的使用。我们也可以修改chart默认配置,也可以自己创建Charts模板。
# helm create testnginx
Creating testnginx
# tree testnginx/
testnginx/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
templates/ 目录下,会注意到一些文件:
我们删除templates/目录下的文件:
# rm -rf testnginx/templates/*
修改values.yaml文件
# cat values.yaml
name: app-nginx
image:
repository: 192.168.200.11/library/nginx
创建deploy.yaml文件,并引用values.yaml文件的字段,之后只要我们修改values.yaml文件,就可以达到改变templates/deploy.yaml文件的效果。
# cat templates/deploy.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: {{ .Values.name }}
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: web-nginx
image: {{ .Values.image.repository }}
ports:
- name: http
containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: svc-nginx
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: nginx
type: NodePort
使用helm install创建release
# helm install test-nginx testnginx/
NAME: test-nginx
LAST DEPLOYED: Fri May 6 14:52:43 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
检查服务
# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
test-nginx default 1 2022-05-06 14:52:43.081379354 +0800 CST deployed testnginx-0.1.0 1.16.0
# kubectl get deploy,pod
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/app-nginx 1/1 1 1 5m14s
NAME READY STATUS RESTARTS AGE
pod/app-nginx-57fbfbd5c5-g2sjq 1/1 Running 0 5m14s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 115d
service/svc-nginx NodePort 10.106.42.241 <none> 80:32755/TCP 5m14s

当我们想给我们的服务升级版本时,就需要使用到helm upgrade 命令非常简便快捷
name: app-nginx
image:
#repository: 192.168.200.11/library/nginx
repository: 192.168.200.11/library/nginx-2
# helm upgrade test-nginx testnginx/
Release "test-nginx" has been upgraded. Happy Helming!
NAME: test-nginx
LAST DEPLOYED: Fri May 6 15:26:08 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

假如在一次发布过程中,发生了不符合预期的事情,就需要使用helm rollback 命令回滚到之前的发布版本。
[root@master helm]# helm history test-nginxREVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Fri May 6 15:28:12 2022 superseded testnginx-0.1.0 1.16.0 Install complete
2 Fri May 6 15:28:56 2022 superseded testnginx-0.1.0 1.16.0 Upgrade complete# helm rollback test-nginx 1
回滚到版本1
