目录

一、Helm 介绍

1.1 Helm 是什么

1.2 Helm 解决了什么痛点

1.3 Helm 相关组件及概念

1.4 Helm v3 版本变化

1.5 总结

二、安装 Helm

2.1 下载 Helm

2.2 安装 Helm

2.3 配置国内存放 chart 仓库的地址

三、Helm 基本使用

3.1 搜索和下载 Chart

3.2 部署 chart

3.3 release 相关操作

四、自定义 Chart 模板

4.1 自定义一个 Chart

4.2 Chart.yaml 编写规则

4.3 go 模板文件渲染

4.4 values.yaml 文件编写

4.5 部署 release

五、Helm 语法

5.1 _helpers.tpl

5.2 内置对象

5.3 变量

5.4 include

5.5 with

5.6 toYaml 转 yaml

5.7 Values 对象

5.8 管道

六、Helm 常用命令演示

6.1 检查 values 语法格式

6.2 upgrade 升级 release

6.3 回滚 release

6.4 打包 Chart


一、Helm 介绍

1.1 Helm 是什么

        Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使⽤的 apt、Centos 中使⽤的 yum 或者 Python 中的 pip ⼀样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成,能够将⼀组 K8S 资源打包统⼀管理,是查找、共享和使⽤为Kubernetes 构建的软件的最佳⽅式。

1.2 Helm 解决了什么痛点

        在 Kubernetes中部署⼀个可以使⽤的应⽤,需要涉及到很多的 Kubernetes 资源的共同协作。⽐如你安装⼀个 WordPress 博客,⽤到了⼀些 Kubernetes (下⾯全部简称 k8s)的⼀些资源对象,包括 Deployment ⽤于部署应⽤、Service 提供服务发现、Secret 配置 WordPress 的⽤户名和密码,可能还需要 pv 和 pvc 来提供持久化服务。并且 WordPress 数据是存储在 mariadb ⾥⾯的,所以需要 mariadb 启动就绪后才能启动 WordPress。这些 k8s 资源过于分散,不⽅便进⾏管理,直接通过 kubectl 来管理⼀个应⽤,你会发现这⼗分蛋疼。

所以总结以上,我们在 k8s 中部署⼀个应⽤,通常⾯临以下⼏个问题:

  • 如何统⼀管理、配置和更新这些分散的 k8s 的应⽤资源⽂件;

  • 如何分发和复⽤⼀套应⽤模板;

  • 如何将应⽤的⼀系列资源当做⼀个软件包管理。

        Helm 的首要目标一直是让“从零到 Kubernetes”变得轻松。无论是运维、开发人员、经验丰富的 DevOps工程师,还是刚刚入门的学生,Helm的目标是让大家在两分钟内就可以在 Kubernetes 上安装应用程序。

Helm 可以解决的问题:运维人员写好资源文件模板,交给开发人员填写参数即可!

1.3 Helm 相关组件及概念

注意:Helm V3 已废弃 Tiller组件!了解即可!

Helm(Helm V2)包含两个组件,分别是 helm 客户端 和 Tiller 服务器:

  • Helm:命令行客户端工具,主要用于 Kubernetes 应用中的 chart 的创建、打包、发布和管理。

  • Tiller(v3 已废除):Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来⽣成⼀个release 并管理 release

  • Chart:helm 程序包,即 Helm 的打包格式叫做 chart。一系列用于描述 k8s 资源相关文件的集合,比方说我们部署 nginx,需要 deployment 的 yaml,需要 service 的yaml,这两个清单文件就是一个 helm 程序包,在k8s 中把这些 yaml 清单文件叫做 chart 图表。所谓 chart 就是⼀系列⽂件, 它描述了⼀组相关的 k8s 集群资源。

  • Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在 k8s 中创建出真实运行的资源对象。即使⽤ helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

  • Repoistory:Helm chart 的仓库,提供部署 k8s 应用程序需要的那些 yaml 清单文件,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引⽂件和压缩包。

  • vlues.yaml 文件:为模板中的文件赋值,可以实现我们自定义安装。如果是 chart 开发者需要自定义模板,如果是 chart 使用者只需要修改 values.yaml 即可。

  • chart ---> 通过 values.yaml 这个文件赋值 --> 生成 release 实例

1.4 Helm v3 版本变化

2019 年 11 月 13 日,Helm 团队发布 Helm v3 的第一个稳定版本。

该版本主要变化如下:

  1. Helm 服务端 Tiller 被删除;

  2. Release 名称可以在不同命名空间重用;

  3. 支持将 Chart 推送至 Docker 镜像仓库中;

  4. 使用 JSONSchema 验证 chartvalues。

1.5 总结

        helm 把 kubernetes 资源打包到一个 chart 中,制作并完成各个 chart 和 chart 本身依赖关系并利用 chart 仓库实现对外分发,而 helm 还可通过 values.yaml 文件完成可配置的发布,如果chart 版本更新了,helm 自动支持滚更更新机制,还可以一键回滚,但是不是适合在生产环境使用,除非具有定义自制 chart 的能力。

二、安装 Helm

K8s 版本支持的各个 helm 版本对照表:Helm | Helm版本支持策略

Helm 安装官方文档:Helm | 安装Helm

2.1 下载 Helm

Helm 下载地址:Releases · helm/helm · GitHub

因为我们这次的 k8s 版本为 1.23.x,所以此次下载 Helm v3.10.3 版本即可!

2.2 安装 Helm

[root@k8s-master1 ~]# ls
anaconda-ks.cfg  helm-v3.10.3-linux-amd64.tar.gz

[root@k8s-master1 ~]# tar -zxvf helm-v3.10.3-linux-amd64.tar.gz 

[root@k8s-master1 ~]# mv linux-amd64/helm /usr/local/bin/

[root@k8s-master1 ~]# helm version
version.BuildInfo{Version:"v3.10.3", GitCommit:"835b7334cfe2e5e27870ab3ed4135f136eecc704", GitTreeState:"clean", GoVersion:"go1.18.9"}

# 设置 helm 自动补全命令
[root@k8s-master1 ~]# helm completion bash > /etc/bash_completion.d/helm
[root@k8s-master1 ~]# bash

2.3 配置国内存放 chart 仓库的地址

官方 Chart GitHub 地址:GitHub - bitnami/charts: Bitnami Helm Charts

# 添加官方的 chart 仓库:
[root@k8s-master1 ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories

# 添加阿里云的 chart 仓库:
[root@k8s-master1 ~]# helm repo add ali-stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"ali-stable" has been added to your repositories

# 查看 repo 列表
[root@k8s-master1 ~]# helm repo list
NAME      	URL                                                   
bitnami   	https://charts.bitnami.com/bitnami                    
ali-stable	https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

# 更新 chart 仓库
[root@k8s-master1 ~]# helm repo update

# 删除 chart 仓库地址(不用操作,了解即可)
helm repo remove ali-stable

三、Helm 基本使用

3.1 搜索和下载 Chart

# 搜索 nginx 的 chart 包
[root@k8s-master1 ~]# helm search repo nginx
NAME                            	CHART VERSION	APP VERSION	DESCRIPTION                                       
ali-stable/nginx-ingress        	0.9.5        	0.10.2     	An nginx Ingress controller that uses ConfigMap...
ali-stable/nginx-lego           	0.3.1        	           	Chart for nginx-ingress-controller and kube-lego  
bitnami/nginx                   	13.2.27      	1.23.3     	NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller	9.3.30       	1.6.4      	NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel             	2.1.15       	0.4.9      	DEPRECATED NGINX Open Source for Intel is a lig...
ali-stable/gcloud-endpoints     	0.1.0        	           	Develop, deploy, protect and monitor your APIs ...

# 搜索指定阿里云 chart 仓库中的 memcached
[root@k8s-master1 ~]# helm search repo ali-stable | grep memcached
ali-stable/mcrouter               	0.1.0        	0.36.0       	Mcrouter is a memcached protocol router for sca...
ali-stable/memcached              	2.0.1        	             	Free & open source, high-performance, distribut...

# 查看 chart 信息
[root@k8s-master1 ~]# helm show chart  ali-stable/memcached

# 下载 chart 包到本地
[root@k8s-master1 ~]# helm pull ali-stable/memcached
[root@k8s-master1 ~]# ls
anaconda-ks.cfg  helm-v3.10.3-linux-amd64.tar.gz  linux-amd64  memcached-2.0.1.tgz
[root@k8s-master1 ~]# tar -zxvf memcached-2.0.1.tgz
[root@k8s-master1 ~]# tree memcached
memcached
├── Chart.yaml            # chart 的基本信息,包括版本名字之类
├── README.md 
├── templates             # 存放 k8s 的部署资源模板,通过渲染变量得到部署文件
│   ├── _helpers.tpl      # 存放能够复用的模板(也叫自定义模板)
│   ├── NOTES.txt         # 为用户提供一个关于 chart 部署后使用说明的文件
│   ├── pdb.yaml
│   ├── statefulset.yaml
│   └── svc.yaml
└── values.yaml           # 配置全局变量或参数,templates 下的文件可以调用

3.2 部署 chart

安装 memcached 的 Chart:

[root@k8s-master1 ~]# cd memcached/

# 修改 yaml 文件(因为这个 mecached 版本比较老,需要做些修改才能运行)
[root@k8s-master1 ~/memcached]# vim templates/statefulset.yaml 
apiVersion: apps/v1            # 修改 apiVersion 后面的 value 值变成 apps/v1
kind: StatefulSet
metadata:
  name: {{ template "memcached.fullname" . }}
  labels:
    app: {{ template "memcached.fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
spec:                          # spec 下添加 selector 字段
  selector:
    matchLabels:
      app: {{ template "memcached.fullname" . }}
      chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
      release: "{{ .Release.Name }}"
      heritage: "{{ .Release.Service }}"
  serviceName: {{ template "memcached.fullname" . }}
  replicas: {{ .Values.replicaCount }}
·····

删除 affinity 亲和性配置:

# 当前目录安装
[root@k8s-master1 ~/memcached]# helm install memcached .

# 指定 chart 安装
helm install memcached ali-stable/memcached

[root@k8s-master1 ~/memcached]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
memcached-memcached-0   1/1     Running   0          119s
memcached-memcached-1   1/1     Running   0          69s
memcached-memcached-2   1/1     Running   0          19s

# 测试 memecached 服务是否正常:
[root@k8s-master1 ~/memcached]# yum install -y nc
[root@k8s-master1 ~/memcached]# export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached-memcached" -o jsonpath="{.items[0].metadata.name}")
[root@k8s-master1 ~/memcached]# kubectl port-forward $POD_NAME 11211

# 新开另一个终端
[root@k8s-master1 ~/memcached]# echo -e 'set mykey 0 60 5\r\nhello\r' | nc localhost 11211
STORED

release 服务正常!!!

3.3 release 相关操作

# 查看 release 发布状态
[root@k8s-master1 ~/memcached]# helm list
NAME     	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART          	APP VERSION
memcached	default  	1       	2023-02-20 21:17:48.767757778 +0800 CST	deployed	memcached-2.0.1	 

# 删除 release
[root@k8s-master1 ~/memcached]# helm delete memcached

# 删除 release 会把 release 下对应的资源也删除
[root@k8s-master1 ~/memcached]# kubectl get pods
No resources found in default namespace.

memecached 的 pod 也被删除了!

四、自定义 Chart 模板

Chart 模板指南:Helm | 从这里开始吧

4.1 自定义一个 Chart

当我们安装好 helm 之后我们可以开始自定义 chart,那么我们需要先创建出一个模板如下:

[root@k8s-master1 ~]# helm create myapp
[root@k8s-master1 ~]# tree myapp
myapp
├── charts                            # 用于存放所依赖的子 chart
├── Chart.yaml                        # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates                         # 模板目录,保留创建 k8s 的资源清单文件
│   ├── deployment.yaml               # deployment 资源的 go 模板文件
│   ├── _helpers.tpl                  # 模板助手文件,定义的值可在模板中使用
│   ├── hpa.yaml                      # 水平 pod 自动扩缩容 go 模板文件
│   ├── ingress.yaml                  # 七层代理 go 模板文件
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml                  # service 的 go 模板文件
│   └── tests
│       └── test-connection.yaml
└── values.yaml                       # 模板的值(配置全局变量)文件,这些值会在安装时应用到 GO 模板生成部署文件

4.2 Chart.yaml 编写规则

[root@k8s-master1 ~]# cd myapp/
[root@k8s-master1 ~/myapp]# vim Chart.yaml 
apiVersion: v2
name: myapp
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"

解释说明:

        Chart.yaml 文件主要用来描述对应 chart 的相关属性信息,其中 apiVersion 字段用于描述对应 chart 使用的 api 版本,默认是 v2 版本;name 字段用于描述对应 chart 的名称;description 字段用于描述对应 chart 的说明简介;type 字段用户描述对应 chart 是应用程序还是库文件,应用程序类型的 chart,它可以运行为一个 release,但库类型的 chart 不能运行为 release,它只能作为依赖被 application 类型的 chart 所使用;version 字段用于描述对应 chart 版本;appVersion 字段用于描述对应 chart 内部程序的版本信息。

4.3 go 模板文件渲染

[root@k8s-master1 ~/myapp]# vim templates/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp.fullname" . }}
  labels:
    {{- include "myapp.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "myapp.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "myapp.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "myapp.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: {{ .Values.service.port }}
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

解释:

        该部署清单模板文件,主要用 go 模板语言来写的,其中 {{ include "myapp.fullname" . }} 就表示取 myapp 的全名;{{ .Values.image.repository }} 这段代码表示读取当前目录下的 values 文件中的 image.repository 字段的值;{{ .Values.image.tag | default .Chart.AppVersion }} 表示对于 values 文件中 image.tag 的值或者读取 default.chart 文件中的 AppVersion 字段的值;nindent 4:表示首行缩进 4 个字母;TRUNC(NUMBER)表示截断数字。

        简单讲 go模板就是应用对应 go 模板语法来定义关属性的的值,一般都是从 values.yaml 文件中加载对应字段的值作为模板文件相关属性的值。

4.4 values.yaml 文件编写

replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: ""

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

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

podAnnotations: {}

podSecurityContext: {}

securityContext: {}

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: ""
  annotations: {}
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []

resources: {}

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

nodeSelector: {}

tolerations: []

affinity: {}

解释:

        比如我们要引用 values.yaml 文件中的 image 字段下的 tag 字段的值,我们可以在模板文件中写成 {{ .Values.image.tag }};如果在命令行使用 --set 选项来应用我们可以写成 image.tag;修改对应的值可以直接编辑对应 values.yaml 文件中对应字段的值,也可以直接使用 --set 指定对应字段的对应值即可;默认情况在命令行使用 --set 选项给出的值,都会直接被替换,没有给定的值,默认还是使用 values.yaml 文件中给定的默认值。

4.5 部署 release

[root@k8s-master1 ~/myapp]# helm install myapp .

[root@k8s-master1 ~/myapp]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myapp-7d7647cfcc-pkbsw   1/1     Running   0          52s

[root@k8s-master1 ~/myapp]# helm list
NAME 	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART      	APP VERSION
myapp	default  	1       	2023-02-21 10:58:43.315274539 +0800 CST	deployed	myapp-0.1.0	1.16.0 

五、Helm 语法

Helm templates 中的语法官方文档:Helm | 模板函数列表

5.1 _helpers.tpl

        在 chart 中以 “下划线” 开头的文件,称为”子模版”。例如在 _helper.tpl 中定义子模块,格式:{{- define "模版名字" -}} 模版内容 {{- end -}}

{{- define "nginx.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}

# 若 .Values.nameOverride 为空,则默认值为 .Chart.Name

引用模板,格式:{{ include "模版名字" 作用域}}

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "nginx.fullname" . }}

5.2 内置对象

Build-in Objects: Helm | Built-in Objects

Chart 预定义对象可直接在各模板中使用。

Release:      # 代表 Release 对象,属性包含:Release.Name、Release.Namespace、Release.Revision等
Values:       # 表示 values.yaml 文件数据
Chart:        # 表示 Chart.yaml 数据
Files:        # 用于访问 chart 中非标准文件

Capabilities: # 用于获取 k8s 集群的一些信息
   - Capabilities.KubeVersion.Major:K8s的主版本

Template:     # 表示当前被执行的模板
   - Name:    # 表示模板名,如:myapp/templates/deployment.yaml
   - BasePath:# 表示路径,如:myapp/templates

5.3 变量

默认情况点( . ), 代表全局作用域,用于引用全局对象。

helm 全局作用域中有两个重要的全局对象:Values 和 Release

# Values
# 这里引用了全局作用域下的 Values 对象中的 key 属性。 
{{ .Values.key }}
# Values 代表的就是 values.yaml 定义的参数,通过 .Values 可以引用任意参数。

# 例子:
{{ .Values.replicaCount }}

# 引用嵌套对象例子,跟引用 json 嵌套对象类似
{{ .Values.image.repository }}

# Release 
# 其代表一次应用发布,下面是 Release 对象包含的属性字段:
Release.Name       - release 的名字,一般通过 Chart.yaml 定义,或者通过 helm 命令在安装应用的时候指定。
Release.Time       - release 安装时间
Release.Namespace  - k8s 名字空间
Release.Revision   - release 版本号,是一个递增值,每次更新都会加一
Release.IsUpgrade  - true 代表当前 release 是一次更新.
Release.IsInstall  - true 代表当前 release 是一次安装
Release.Service:   - The service that is rendering the present template. On Helm, this is always Helm.

自定义模版变量。

# 变量名以 $ 开始命名, 赋值运算符是 := (冒号+等号)
{{- $relname := .Release.Name -}}

# 引用自定义变量:
# 不需要 . 引用
{{ $relname }}

5.4 include

# include 是一个函数,所以他的输出结果是可以传给其他函数的

# 例子 1:
env:
  {{- include "xiaomage" . }}

# 结果:
          env:
- name: name
  value: xiaomage
- name: age
  value: secret
- name: favourite
  value: "Cloud Native DevSecOps"
- name: wechat
  value: majinghe11

# 例子 2:
env:
  {{- include "xiaomage" . | indent 8}}

# 结果:
          env:
            - name: name
              value: xiaomage
            - name: age
              value: secret
            - name: favourite
              value: "Cloud Native DevSecOps"
            - name: wechat
              value: majinghe11

5.5 with

        with 关键字可以控制变量的作用域,主要就是用来修改 . 作用域的,默认 . 代表全局作用域,with 语句可以修改 . 的含义

# 例子:
# .Values.favorite 是一个 object 类型
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}   # 相当于.Values.favorite.drink
food:  {{ .food  | upper | quote }}
{{- end }}

5.6 toYaml 转 yaml

将数据转为 yaml 格式。

spec:
  strategy:
{{ toYaml .Values.strategy | indent 4 }}

------------------------------------------------------------------
values.yaml 数据:
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 0

------------------------------------------------------------------
渲染效果:
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0

5.7 Values 对象

values 对象的值有四个来源:

  1. chart 包中的 values.yaml 文件;
  2. 父 chart 包的 values.yaml 文件;
  3. 使用 helm install 或者 helm upgrade 的 -f 或者 --values 参数传入的自定义的 yaml 文件;
  4. 通过 --set 参数传入的值。
cat global.yaml 
course: k8s

cat mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  course:  {{ .Values.course }}

helm install --name mychart --dry-run --debug -f global.yaml ./mychart/
helm install --name mychart --dry-run --debug --set course="k8s" ./mychart/

# 运行部分结果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"
  course:  k8s
# 编辑 mychart/values.yaml,在最后加入
course:
  k8s: klvchen
  python: lily

cat mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  k8s:  {{ quote .Values.course.k8s }}      # quote 叫双引号
  python:  {{ .Values.course.python }}

helm install --name mychart --dry-run --debug ./mychart/

# 运行结果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"
  k8s:  "klvchen"
  python:  lily

5.8 管道

k8s:  {{ quote .Values.course.k8s }} # 加双引号
k8s:  {{ .Values.course.k8s | upper | quote }} # 大写字符串加双引号
k8s:  {{ .Values.course.k8s | repeat 3 | quote }} # 加双引号和重复 3 次字符串

六、Helm 常用命令演示

Helm 命令大全:Helm | Helm

6.1 检查 values 语法格式

helm lint

验证 chart 是否存在问题

简介

该命令使用一个 chart 路径并运行一系列的测试来验证 chart 的格式是否正确。

如果遇到引起 chart 安装失败的情况,会触发 [ERROR] 信息,如果遇到违反惯例或建议的问题,会触发 [WARNING]。

helm lint PATH [flags]

实践:

[root@k8s-master1 ~/myapp]# helm lint /root/myapp/
==> Linting /root/myapp/
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

6.2 upgrade 升级 release

helm upgrade

升级版本

简介

该命令将发布升级到新版的 chart。

        升级参数必须是发布和 chart。chart 参数可以是:chart 引用('example/mariadb'),chart 目录路径,打包的 chart 或者完整 URL。 对于 chart 引用,除非使用'--version'参数指定,否则会使用最新版本。

        要在 chart 中重写 value,需要使用'--values'参数并传一个文件或者从命令行使用'--set'参数传个配置, 要强制字符串值,使用'--set-string'。当值本身对于命令行太长或者是动态生成的时候,可以使用 '--set-file' 设置独立的值。 也可以在命令行使用'--set-json'参数设置 json 值(scalars/objects/arrays)。

        可以多次指定'--values'/'-f'参数,最后(最右边)指定的文件优先级最高。比如如果myvalues.yaml 和 override.yaml 同时包含了名为 'Test'的 key,override.yaml 中的设置会优先使用:

helm upgrade -f myvalues.yaml -f override.yaml redis ./redis

        可以多次指定'--set'参数,最后(最右边)指定的优先级最高。比如'bar' 和 'newbar'都设置了一个名为'foo'的可以, 'newbar'的值会优先使用:

helm upgrade --set foo=bar --set foo=newbar redis ./redis

实践:

[root@k8s-master1 ~/myapp]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   42d
myapp        ClusterIP   10.98.112.104   <none>        80/TCP    156m

[root@k8s-master1 ~/myapp]# helm upgrade --set service.type="NodePort" myapp .

[root@k8s-master1 ~/myapp]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        42d
myapp        NodePort    10.98.112.104   <none>        80:30575/TCP   3h20m

6.3 回滚 release

helm rollback

回滚发布到上一个版本

简介

该命令回滚发布到上一个版本

        回滚命令的第一个参数是发布的名称,第二是修订(版本)号,如果省略此参数,会回滚到上一个版本。

要查看修订号,执行 'helm history RELEASE'。

helm rollback <RELEASE> [REVISION] [flags]

实践:

# 查看历史版本
[root@k8s-master1 ~/myapp]# helm history myapp 
REVISION	UPDATED                 	STATUS    	CHART      	APP VERSION	DESCRIPTION     
1       	Tue Feb 21 10:58:43 2023	superseded	myapp-0.1.0	1.16.0     	Install complete
2       	Tue Feb 21 14:18:59 2023	deployed  	myapp-0.1.0	1.16.0     	Upgrade complete

# 把 myapp 回滚到版本 1
[root@k8s-master1 ~/myapp]# helm rollback myapp 1
Rollback was a success! Happy Helming!

# 可以看到 service 已经完成回滚了
[root@k8s-master1 ~/myapp]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   42d
myapp        ClusterIP   10.98.112.104   <none>        80/TCP    3h23m

6.4 打包 Chart

helm package

将 chart 目录打包到 chart 归档中

简介

        该命令将 chart 打包成一个 chart 版本包文件。如果给定路径,就会在该路径中查找 chart(必须包含 Chart.yaml 文件)然后将目录打包。

chart 版本包会用于 Helm 包仓库。

        要签名一个 chart,使用'--sign'参数,在大多数场景中,也要提供'--keyring path/to/secret/keys'和'--key keyname'。

$ helm package --sign ./mychart --key mykey --keyring ~/.gnupg/secring.gpg

如果'--keyring'未指定,除非配置了其他方式,不然 Helm 通常会指定公共秘钥环。

helm package [CHART_PATH] [...] [flags]

实践:

[root@k8s-master1 ~/myapp]# helm package /root/myapp/
Successfully packaged chart and saved it to: /root/myapp/myapp-0.1.0.tgz
[root@k8s-master1 ~/myapp]# ls
charts  Chart.yaml  myapp-0.1.0.tgz  templates  values.yaml

上一篇文章:【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(下)_Stars.Sky的博客-CSDN博客

下一篇文章:【Kubernetes 企业项目实战】09、Rancher 2.6 管理 k8s-v1.23 及以上版本高可用集群_Stars.Sky的博客-CSDN博客

Logo

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

更多推荐