目录
如下图所示,在一个企业中,可能存在多个不同的应用业务,每个业务可能包含多至十几、甚至几十个资源清单,那么对于“运维”和“研发”人员来讲,这么多的资源清单,通过人力去区分辨别,即便有“名称空间namespace”和不同“路径目录”来进行区分,也是非常吃力的;
所以,我们就需要借助k8s资源清单的管理工具,进行以业务为单位的资源清单管理,通过一些手段,来实现业务的升级、回滚等等操作在一个文件上(通过helm的values.yaml文件),一个文件就能够管理一套业务体系,进而压缩、减轻了运维压力实现高效管理业务的目的;

chart:应用描述,在helm中,一个chart代表一个业务的资源清单相关文件的合集;
release:基于chart的部署实体,一个chart被helm运行后,会生成一个release实体,这个release实体会在k8s集群中创建对应的资源对象;
百度网盘链接:https://pan.baidu.com/s/1RmT3YLhxPngDFgECQ1Kyqw
提取码:6a64
- # 解压
- [root@k8s1 data]# tar -xvf helm-v3.12.3-linux-amd64.tar.gz
-
- # 设置全局命令
- mv linux-amd64/helm /usr/local/bin/
[root@k8s1 data]# helm completion bash > /etc/bash_completion.d/helm
- [root@k8s1 data]# mkdir -p /data/helm/oslee/chart
- [root@k8s1 chart]# cd /data/helm/oslee/chart
- # 创建
- [root@k8s1 chart]# helm create oslee01
- Creating oslee01
-
- # 查看
- [root@k8s1 chart]# ll oslee01/
- 总用量 8
- drwxr-xr-x 2 root root 6 5月 6 08:34 charts
- -rw-r--r-- 1 root root 1143 5月 6 08:34 Chart.yaml
- drwxr-xr-x 3 root root 162 5月 6 08:34 templates
- -rw-r--r-- 1 root root 1874 5月 6 08:34 values.yaml
- [root@k8s1 chart]# kubectl create ns helm-oslee01
- namespace/helm-oslee01 created

【helm install 自定义名称 chart名称 名称空间】
- [root@k8s1 chart]# helm install oslee oslee01 -n helm-oslee01
- NAME: oslee
- LAST DEPLOYED: Mon May 6 08:38:23 2024
- NAMESPACE: helm-oslee01
- STATUS: deployed
- REVISION: 1
- NOTES:
- 1. Get the application URL by running these commands:
- export POD_NAME=$(kubectl get pods --namespace helm-oslee01 -l "app.kubernetes.io/name=oslee01,app.kubernetes.io/instance=oslee" -o jsonpath="{.items[0].metadata.name}")
- export CONTAINER_PORT=$(kubectl get pod --namespace helm-oslee01 $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
- echo "Visit http://127.0.0.1:8080 to use your application"
- kubectl --namespace helm-oslee01 port-forward $POD_NAME 8080:$CONTAINER_PORT
-
- # 查看pod
- [root@k8s1 chart]# kubectl get pods -o wide -n helm-oslee01
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- oslee-oslee01-6cc5f96486-j5dvw 1/1 Running 0
-
- # 访问pod
- [root@k8s1 chart]# curl -I 10.100.1.7
- HTTP/1.1 200 OK
- [root@k8s1 chart]# helm list -n helm-oslee01
- NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
- oslee helm-oslee01 1 2024-05-06 08:38:23.83927724 -0400 EDT deployed oslee01-0.1.0 1.16.0

至此,部署服务就结束了;
我们继续深入下去,我们不知为何,就部署了一个nginx1.16的版本服务,我们接下来,改变一下nginx的版本,我们将nginx的版本修改为1.20.1;
[root@k8s1 chart]# vi oslee01/values.yaml

这次名称叫oslee02
[root@k8s1 chart]# helm install oslee02 oslee01 -n helm-oslee01

我们修改了values.yaml的tag,再次安装得到的pod旧村nginx的1.16版本变成了1.20版本;
- [root@k8s1 chart]# helm list -n helm-oslee01
- NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
- oslee helm-oslee01 1 2024-05-06 08:38:23.83927724 -0400 EDT deployed oslee01-0.1.0 1.16.0
- oslee02 helm-oslee01 1 2024-05-06 08:49:17.194473592 -0400 EDT deployed oslee01-0.1.0 1.16.0
- [root@k8s1 chart]# helm uninstall oslee02 -n helm-oslee01
- release "oslee02" uninstalled
再次查看
- [root@k8s1 chart]# helm list -n helm-oslee01
- NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
- oslee helm-oslee01 1 2024-05-06 08:38:23.83927724 -0400 EDT deployed oslee01-0.1.0 1.16.0

Chart.yaml:这是每个 Helm Chart 的元数据文件,包含 Chart 的名称、版本、描述、主页、依赖关系等信息。它是描述 Chart 的基本信息和版本控制的核心文件。
values.yaml:此文件包含了 Chart 的默认配置值。用户可以通过 Helm 命令行参数或提供自定义的
values.yaml文件来覆盖这些默认值,以实现定制化部署。templates/:这个目录包含了一系列的 YAML 文件模板,它们会被 Helm 用来生成最终部署到 Kubernetes 的资源配置文件。这些模板可以引用
values.yaml中的值,支持条件语句、循环等高级特性,使得配置更加灵活。
- 例如:
deployment.yaml、service.yaml、configmap.yaml等,分别定义了 Deployment、Service、ConfigMap 等 Kubernetes 资源。- NOTES.txt:安装chart成功后的提示信息;
easy-paas-admin/
├── Chart.yaml
├── templates
│ ├── configmap.yaml
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
- # Chart.yaml
-
- apiVersion: v2
- name: easy-paas-admin
- description: A Helm chart for Kubernetes
- type: application
- version: 1.0.1
- # values.yaml
-
- easyPaasAdmin:
- namespace: "easy-paas"
- replicaCount: 2
- image:
- repository: "registry.cn-hangzhou.aliyuncs.com/oslee-dockerhub/easy-paas-admin"
- tag: "latest"
- matchLabels:
- value: "easy-paas-admin"
- ports:
- containerPort: 8001
- servicePort: 8001
- nodePort: 30081
- volumeMounts:
- mountPath: "/data/admin/config/"
- configData:
- config.yaml: |
- server:
- "name": "easy-paas-admin"
- "port": ":8001"
- "version": "1.0.1"
- mysql:
- "driver": "mysql"
- "host": "192.168.11.10"
- "port": "3306"
- "database": "easy_gateway"
- "username": "root"
- "password": "root"
- "charset": "utf8mb4"
- redis:
- "username": "default"
- "address": "192.168.11.10:6379"
- "password": "123456"
- cluster:
- "cluster_ip": "127.0.0.1"
- "cluster_port": "8080"
- "cluster_ssl_port": "4433"
- # configmap.yaml
-
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: {{ .Chart.Name }}
- namespace: {{ .Values.easyPaasAdmin.namespace }}
- data:
- {{- toYaml .Values.easyPaasAdmin.configData | nindent 2 }}
- # deployment.yaml
-
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: {{ .Chart.Name }}
- namespace: {{ .Values.easyPaasAdmin.namespace }}
- spec:
- replicas: {{ .Values.easyPaasAdmin.replicaCount }}
- selector:
- matchLabels:
- app: {{ .Values.easyPaasAdmin.matchLabels.value }}
- template:
- metadata:
- labels:
- app: {{ .Values.easyPaasAdmin.matchLabels.value }}
- namespace: {{ .Values.easyPaasAdmin.namespace }}
- spec:
- containers:
- - name: {{ .Chart.Name }}
- image: {{ .Values.easyPaasAdmin.image.repository }}:{{ .Values.easyPaasAdmin.image.tag }}
- ports:
- - containerPort: {{ .Values.easyPaasAdmin.ports.containerPort }}
- volumeMounts:
- - name: config-volume
- mountPath: {{ .Values.easyPaasAdmin.volumeMounts.mountPath }}
- readOnly: true
- - name: host-timezone
- mountPath: /etc/localtime
- readOnly: true
- volumes:
- - name: config-volume
- configMap:
- name: {{ .Chart.Name }}
- - name: host-timezone
- hostPath:
- path: /etc/localtime
- # service.yaml
-
- apiVersion: v1
- kind: Service
- metadata:
- name: {{ .Chart.Name }}
- namespace: {{ .Values.easyPaasAdmin.namespace }}
- spec:
- type: NodePort # 或 NodePort, ClusterIP 根据需求
- selector:
- app: {{ .Values.easyPaasAdmin.matchLabels.value }}
- ports:
- - protocol: TCP
- port: {{ .Values.easyPaasAdmin.ports.servicePort }}
- targetPort: {{ .Values.easyPaasAdmin.ports.containerPort }}
- nodePort: {{ .Values.easyPaasAdmin.ports.nodePort }}
- # 执行指令
-
- kubectl create ns easy-paas
- helm install easy-paas-admin ./easy-paas-admin -n easy-paas
-
-
- # 其他指令
- # helm list -n easy-paas
- # helm uninstall easy-paas-admin -n easy-paas
- # helm upgrade easy-paas-admin ./easy-paas-admin -n easy-paas
- # helm history easy-paas-admin
- # helm rollback easy-paas-admin 1 -n easy-paas
helm list -n easy-paas

- easyPaasAdmin:
- namespace: "easy-paas"
- # 副本数改为3
- replicaCount: 3
- image:
- repository: "registry.cn-hangzhou.aliyuncs.com/oslee-dockerhub/easy-paas-admin"
- tag: "latest"
- matchLabels:
- value: "easy-paas-admin"
- ports:
- containerPort: 8001
- servicePort: 8001
- nodePort: 30081
- volumeMounts:
- mountPath: "/data/admin/config/"
- configData:
- config.yaml: |
- server:
- "name": "easy-paas-admin"
- "port": ":8001"
- # 软件版本改为1.0.2
- "version": "1.0.2"
- mysql:
- "driver": "mysql"
- "host": "192.168.11.10"
- "port": "3306"
- "database": "easy_gateway"
- "username": "root"
- "password": "root"
- "charset": "utf8mb4"
- redis:
- "username": "default"
- "address": "192.168.11.10:6379"
- "password": "123456"
- cluster:
- "cluster_ip": "127.0.0.1"
- "cluster_port": "8080"
- "cluster_ssl_port": "4433"
helm upgrade easy-paas-admin ./easy-paas-admin -n easy-paas

helm history easy-paas-admin -n easy-paas

helm rollback easy-paas-admin 1 -n easy-paas

可以通过配置chart.yaml这个文件,来控制显示helm list的元数据信息

我们知道,docker拉取镜像是有共有仓库阿里云、华为云、清华源..和私有仓库harbor....
同理,helm也有这个机制;
互联网公开的chart仓库,可以直接使用他们制作好的包;
1,微软仓库:Index of /kubernetes/charts/
2,阿里云仓库:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
默认情况下是没有任何仓库地址的
- [root@k8s1 helm]# helm repo list
- Error: no repositories to show
- # 添加微软云的helm仓库
- [root@k8s1 helm]# helm repo add azure http://mirror.azure.cn/kubernetes/charts/
- "azure" has been added to your repositories
-
- # 添加阿里云的helm仓库
- [root@k8s1 helm]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
- "aliyun" has been added to your repositories
- [root@k8s1 helm]# helm repo update
- Hang tight while we grab the latest from your chart repositories...
- ...Successfully got an update from the "aliyun" chart repository
- ...Successfully got an update from the "azure" chart repository
- Update Complete. ⎈Happy Helming!⎈
- [root@k8s1 helm]# helm repo list
- NAME URL
- azure http://mirror.azure.cn/kubernetes/charts/
- aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm search repo elasticsearch

helm pull aliyun/elasticsearch-exporter
- # 解压
- tar xf elasticsearch-exporter-0.1.2.tgz
-
- # 使用
- helm install es elasticsearch-exporter
注意:你安装chart的时候,可能失败,因为chart中的k8s对应api-server版本可能不一样,所以对应的资源清单的一级字段也不一样,导致安装失败;发现这个问题,就去看看资源清单的api版本是否与目前你使用的k8s的api版本相同,否则就需要修改资源清单的api版本了。
提示:chartmuseum项目还不错哟~
推荐阅读:
https://github.com/helm/chartmuseum
https://hub.docker.com/r/chartmuseum/chartmuseum