一.Helm的介绍

1.什么是Helm

(1)在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。 况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制, 很大程度上简化了 Kubernetes 应用的部署和管理。

(2)Helm 本质就是让 K8s 的应用管理(Deployment、Service 等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml、service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。

总:Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。

2.Helm 的三个重要的概念

①Chart

**Helm 的软件包,采用 TAR 格式。**类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。

②Repository(仓库)

Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

③Release

使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。可以理解为 Helm 使用 Chart 包部署的一个应用实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。

以 MySQL chart 为例,如果你想在你的集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name。可以将 release 想象成应用程序发布的版本号。

总:Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。

3.Helm3 与 Helm2 的区别

(1)Helm2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。
用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。

(2)在 Helm 3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。

Helm 的官方网站 https://helm.sh/

二.Helm 部署(3.6版本)

1.安装 helm

#下载二进制 Helm client 安装包
https://github.com/helm/helm/tags
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#命令补全
source <(helm completion bash)

2.使用 helm 安装 Chart

#添加常用的 chart 仓库,
#Bitnami 仓库是 Bitnami 公司提供的官方 Helm Chart 仓库。Bitnami 为各种常见的应用程序和中间件(如 WordPress、MySQL、Redis 等)提供了预先配置好的 Helm Chart
helm repo add bitnami https://charts.bitnami.com/bitnami
#stable 仓库是一个由社区维护的官方 Helm Chart 仓库。该仓库提供了许多常用的开源应用程序的 Helm Chart,包括数据库(如 MySQL、PostgreSQL)、Web 服务器(如 Nginx、Apache)、监控工具(如 Prometheus、Grafana)等
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#aliyun 仓库是阿里云(Alibaba Cloud)提供的 Helm Chart 仓库。该仓库包含一系列经过优化和测试的 Helm Chart,可以用于在阿里云 Kubernetes 服务上快速部署各种应用程序。
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#incubator 仓库是 Helm 社区的孵化器(Incubator)仓库,该仓库包含一些正在开发中或者尚未正式发布的 Helm Chart。这些 Chart 可能还不是稳定版本,但可以用于实验、测试和尝试新功能。
helm repo add incubator https://charts.helm.sh/incubator

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#更新 charts 列表
helm repo update          
helm repo list

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#查看 stable 仓库可用的 charts 列表
helm search repo stable
#搜索相关的charts 列表
helm search repo bitnami|grep nginx

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#删除 incubator 仓库
helm repo remove aliyun

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#查看 chart 信息
helm show chart stable/mysql     #查看指定 chart 的基本信息

helm show all stable/mysql		 #获取指定 chart 的所有信息
#安装 chart
①安装 redis chart,有状态
helm install my-redis bitnami/redis [-n default]   #指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace

helm install bitnami/redis --generate-name    #不指定 release 的名字时,需使用 –generate-name 随机生成一个名字

#查看创建的pod
kubectl get pod

#查看pending问题,这边是没有pv、pvc,因为redis是有状态应用需要安装动态pv、pvc即可
kubectl describe pod my-redis-master-0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#安装 chart
②安装 nginx chart,无状态
helm install my-nginx33 bitnami/nginx

#查看创建的pod
kubectl get pod

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#查看所有 release
helm ls 
helm list

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#查看指定的 release 状态
helm status my-redis          
#删除指定的 release
helm uninstall my-redis 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.Helm 自定义模板

charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。

①拉取 chart

#拉取 chart
mkdir /opt/helm
cd /opt/helm
#拉取包下下来可以查看mysql的具体信息
helm pull stable/mysql
#查看下载的安装包
ls
mysql-1.6.9.tgz
#解压安装包
tar xf mysql-1.6.9.tgz
#方便查看mysql的信息安装tree
yum install -y tree
#查看mysql
tree mysql

mysql
├── Chart.yaml
├── README.md
├── templates
│   ├── configurationFiles-configmap.yaml
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── initializationFiles-configmap.yaml
│   ├── NOTES.txt
│   ├── pvc.yaml
│   ├── secrets.yaml
│   ├── serviceaccount.yaml
│   ├── servicemonitor.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   └── tests
│       ├── test-configmap.yaml
│       └── test.yaml
└── values.yaml

#查看调用的配置文件
cd /opt/helm/mysql/
ls

Chart.yaml  README.md  templates  values.yaml

可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。

chart 是包含至少两项内容的helm软件包:
(1)软件包自描述文件 Chart.yaml,这个文件必须有 name 和 version(chart版本) 的定义
(2)一个或多个模板,其中包含 Kubernetes 清单文件:
●NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
●deployment.yaml:创建 deployment 的资源清单文件
●service.yaml:为 deployment 创建 service 的资源清单文件
●ingress.yaml: 创建 ingress 对象的资源清单文件
●_helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用

②创建自定义的 chart(举例:nginx)

#创建自定义的 chart
helm create nginx

tree nginx
nginx
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
cat nginx/templates/deployment.yaml
#在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。
比如在 deployment.yaml 中定义的容器镜像:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
cat nginx/values.yaml | grep repository

  repository: nginx
#以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

③修改 chart

cd /opt/helm/
vim nginx/Chart.yaml

apiVersion: v2
name: nginx                     #chart名字
description: A Helm chart for Kubernetes
type: application               #chart类型,application或library
version: 0.1.0                  #chart版本,如果需要升级可以修改,例如version: 0.1.1
appVersion: 1.16.0              #application部署版本
vim nginx/values.yaml
replicaCount: 3

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "latest"                 #设置镜像标签

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  create: true
  annotations: {}
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true                 #开启 ingress
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: www.gree.com         #指定ingress域名
      paths:
        - path: /
          pathType: Prefix      #指定ingress路径类型
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local
#取消注释及括号
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

④打包 chart

helm lint nginx        #检查依赖和模版配置是否正确

helm package nginx     #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

⑤部署 chart

helm install nginx-test1 ./nginx --dry-run --debug    #使用 --dry-run 参数验证 Chart 的配置,并不执行安装,前提并未有nginx-test1这个名

helm install nginx ./nginx -n default           #部署 chart,release 版本默认为 1
或者
helm install nginx ./nginx-0.1.0.tgz
#可根据不同的配置来 install,默认是 values.yaml
#安装方式,此处使用的是①
①当前目录安装
cd /opt/helm/
helm install nginx-test1 ./nginx
②文件安装
helm install nginx-test1 ./nginx -f ./nginx/values-prod.yaml
helm ls
NAME       	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART       	APP VERSION
my-nginx33 	default  	1       	2023-10-09 10:20:46.26572364 +0800 CST 	deployed	nginx-15.3.1	1.25.2     
nginx-test1	default  	1       	2023-10-09 11:49:51.697369207 +0800 CST	deployed	nginx-0.1.0 	1.16.0        

kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-test1-bdd5b55f5-9x4qt               1/1     Running             0          2m44s
pod/nginx-test1-bdd5b55f5-dbjgg               1/1     Running             1          2m44s
pod/nginx-test1-bdd5b55f5-hd6kq               1/1     Running             0          2m44s

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes         ClusterIP      10.96.0.1       <none>        443/TCP           32d
service/nginx-test1        ClusterIP      10.96.106.34    <none>        80/TCP            2m44s

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#部署 ingress
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
kubectl get pod,svc -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-controller-54b86f8f7b-n57cp   1/1     Running   0          19h

NAME                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx   NodePort   10.96.117.149   <none>        80:30977/TCP,443:30046/TCP   19h

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

kubectl get ingress
NAME                CLASS    HOSTS          ADDRESS        PORTS   AGE
nginx-test1         <none>   www.gree.com              80        6m55s
vim /etc/hosts
#node02地址+www.gree.com
.....
192.168.198.13  www.gree.com
curl http://www.gree.com:30046

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

⑥修改为 NodePort 访问后,升级

vim nginx/values.yaml

service:
  type: NodePort
  port: 80
  nodePort: 30080

ingress:
  enabled: false
vim nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "nginx.fullname" . }}
  labels:
    {{- include "nginx.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
      nodePort: {{ .Values.service.nodePort }}              #指定 nodePort
  selector:
    {{- include "nginx.selectorLabels" . | nindent 4 }}
#升级 release,release 版本加 1
helm upgrade nginx-test1 nginx

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP      10.96.0.1       <none>        443/TCP           32d
nginx-test1        NodePort       10.96.106.34    <none>        80:30080/TCP      13m

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

curl 192.168.198.13:30080

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://192.168.198.13:30080/

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

⑦回滚

#根据 release 版本回滚
helm history nginx-test1             #查看 release 版本历史

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

helm rollback nginx-test1 1          #回滚 release 到版本1
helm history nginx-test1           #nginx release 已经回滚到版本 1
REVISION	UPDATED                 	STATUS    	CHART      	APP VERSION	DESCRIPTION     
1       	Mon Oct  9 11:49:51 2023	superseded	nginx-0.1.0	1.16.0     	Install complete
2       	Mon Oct  9 12:02:18 2023	superseded	nginx-0.1.0	1.16.0     	Upgrade complete
3       	Mon Oct  9 12:07:59 2023	deployed  	nginx-0.1.0	1.16.0     	Rollback to 1   
kubectl get svc

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注:通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。

#在命令行使用 --set 指定参数来部署(install,upgrade)release
#注:此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。
helm upgrade nginx-test1 nginx --set image.tag='1.15'
helm history nginx-test1

这是用于使用 Helm 更新(upgrade)一个已部署的 Helm Chart。

  • helm upgrade:用于更新一个已经部署的 Helm Chart。
  • nginx-test1:Helm 安装命名的名称(release name)
  • nginx:更新的 Helm Chart 的名称,更新名为 “nginx” 的 Chart。
  • --set image.tag='1.15':这是 Helm 标志(flag),用于设置 Chart 的值。在这种情况下,它将指定将 Chart 中的 image.tag 值设置为 ‘1.15’。这样做可以更改应用程序或服务所使用的 Docker 镜像的版本。

总:使用 Helm 更新已部署的名为 “nginx-test1” 的 Helm Chart 实例,并将其中的 image.tag 值设置为 ‘1.15’。这将导致 Helm 部署新的版本或变体(tag)的 Docker 镜像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

helm upgrade nginx-test1 nginx --set image.tag='1.15' --debug

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#回滚到1查看指定参数的变化
helm rollback nginx-test1 1
helm upgrade nginx-test1 nginx --debug

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.Helm 仓库

helm 可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 harbor 仓库。

①安装 harbor

#在线下载
https://github.com/goharbor/harbor/releases/tag/v1.9.2
cd /opt
#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose

tar zxvf harbor-offline-installer-v1.9.1.tgz
cd harbor/
vim harbor.yml
hostname: 192.168.198.11
harbor_admin_password: Harbor12345     #admin用户初始密码
data_volume: /data                     #数据存储路径,自动创建
chart:
  absolute_url: enabled                #在chart中启用绝对url
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor          #日志路径
#安装带有 Clair service 和 chart 仓库服务的 Harbor
./install.sh --with-clair --with-chartmuseum

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

②安装 push 插件

#在线安装
helm plugin install https://github.com/chartmuseum/helm-push
#离线安装
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
#此处是将安装包拉入到opt目录下
cd /opt
mkdir ~/.local/share/helm/plugins/helm-push
tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
helm repo ls

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

helm plugin list

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#登录 Harbor WEB UI 界面,创建一个新项目
浏览器访问:http://192.168.198.11 ,默认的管理员用户名和密码是 admin/Harbor12345
点击 “+新建项目” 按钮
填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#添加仓库
helm repo add harbor http://192.168.198.11/chartrepo/chart_repo --username=admin --password=Harbor12345
#注:这里的 repo 的地址是<Harbor URL>/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
#推送 chart 到 harbor 中
cd /opt/helm
helm push nginx harbor

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#浏览器中查看 chart_repo 项目中的 Helm Charts

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.helm的概念

helm是K8s的软件(chart)包的管理器

chart是helm软件包,tar包的格式,包含定义K8S各种资源对象的yaml配置文件

2.helm三个概念

(1)chart:代表的helm的包,可以理解为yum的rpm包,是yaml文件的集合

chart.yaml:软件包自描述文件, 定义chart的元信息,比如 chart的名称、应用版本、版本

templates/* yaml :包含k8s 各种资源对象的配置清单模版,通过变量表达式给配置字段引用相关参数值

values.yaml:默认的参数数据文件,tamplates里的配置清单模版中变量的表达式默认会引用这个文件里字段的参数值

(2)Repository(仓库):是运行在K8S集群中的chart的实例,没安装一次就会产生一个新的release,进行应用级别的版本管理

保存 chart仓库:

helm repo add/remove/list

helm search repo 仓库名

(3)Release:用来存储和共享charts的地方,它提供K8S的包所使用的

通过 helm install 部署chart的实例:

helm install(安装)/uninstall(卸载)/ status(状态)/1s(查看)/list(查看)

3.helm相关命令

helm pull——拉取

push——推送
create——创建chart的目录

package——把chart的目录打包成tar

install+实例名称 chart目录或者chart的tar包【-f 配置文件】【-n命名空间】部署的实例

upgrade 【–set 字段=值】 升级1——更新实例

history——查看实例的历史版本信息

roliback——回滚的实例版本

status——查看实例的状态

uninstall——卸载实例

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐