Helm入门到实战演示

目录

1、Helm介绍

2、Helm v3版本变化

3、安装Helm v3

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

5、Helm基本使用

5.1 搜索和下载Chart

5.2 部署chart

5.2.1 helm部署memcached服务

5.3 release相关操作

6、自定义Chart模板

6.1 自定义一个Chart

6.2 Chart.yaml编写规则

6.3 go模板写的资源清单文件

6.4 _helpers.tpl文件

6.5 values.yaml文件编写

6.6部署release

7. Helm常用命令演示

7.1 检查values语法格式

7.2 upgrade升级release

7.3 回滚release

7.4 打包Chart

7.5 操作release命令

7.6 操作Chart命令


文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘

链接:https://pan.baidu.com/s/1YFf-vPYuwRQiL9HR6gcP7Q 
提取码:qj3o 
 

1、Helm介绍

官网:Helm | Docs

Helm

helm 官方的chart站点:

https://hub.kubeapps.com/

Helm是kubernetes的包管理工具,相当于linux环境下的yum/apt-get命令。

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

Helm可以解决的问题:运维人员写好资源文件模板

                 交给开发人员填写参数即可

Helm中的一些概念:

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

(2)Chart:helm程序包,一系列用于描述k8s资源相关文件的集合,比方说我们部署nginx,需要deployment的yaml,需要service的yaml,这两个清单文件就是一个helm程序包,在k8s中把这些yaml清单文件叫做chart图表。

2、Helm v3版本变化

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

该版本主要变化如下:
架构变化:
1、Helm服务端Tiller被删除

该版本主要变化如下:
架构变化:
1、Helm服务端Tiller被删除

3、安装Helm v3

下载地址:

https://github.com/helm/helm/releases

K8s版本支持的各个helm版本对照表:

Helm | Helm版本支持策略Helm | Helm版本支持策略描述Helm的补丁发布策略,以及Helm和Kubernetes之间支持的最大版本偏差https://helm.sh/zh/docs/topics/version_skew/

 

[root@xianchaomaster1~]# tar zxvf helm-v3.12.3-linux-amd64.tar.gz

[root@xianchaomaster1 ~]# mv linux-amd64/helm /bin/

#查看helm版本:

[root@xianchaomaster1 ~]# helm version

version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}

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

阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts)

官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内可能无法访问。

微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库推荐,基本上官网有的chart这里都有,国内可能无法访问。

#添加阿里云的chart仓库

[root@xianchaomaster1 ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

#显示如下:

"aliyun" has been added to your repositories

 #添加bitnami的chart仓库

[root@xianchaomaster1 ~]# helm repo add bitnami https://charts.bitnami.com/bitnami

#更新chart仓库

[root@xianchaomaster1 ~]# helm repo update

#查看配置的chart仓库有哪些

[root@xianchaomaster1 ~]# helm repo list

NAME    URL                                                   

aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

bitnami https://charts.bitnami.com/bitnami

#删除chart仓库地址

[root@xianchaomaster1 ~]# helm repo remove aliyun

"aliyun" has been removed from your repositories

#重新添加阿里云的chart仓库

[root@xianchaomaster1 ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

#更新chart仓库

[root@xianchaomaster1 ~]# helm repo update

#从指定chart仓库地址搜索chart

[root@xianchaomaster1 ~]# helm search repo aliyun

Chart:图表

是YAML文件的集合

5、Helm基本使用

5.1 搜索和下载Chart

#查看阿里云chart仓库中的memcached

[root@xianchaomaster1 ~]# helm search repo aliyun |grep memcached

aliyun/mcrouter                0.1.0         0.36.0        Mcrouter is a

aliyun/memcached               2.0.1                       Free & open

#查看chart信息

[root@xianchaomaster1 ~]# helm show chart  aliyun/memcached

apiVersion: v1

description: Free & open source, high-performance, distributed memory object caching

  system.

home: http://memcached.org/

icon: https://upload.wikimedia.org/wikipedia/en/thumb/2/27/Memcached.svg/1024px-Memcached.svg.png

keywords:

- memcached

- cache

maintainers:

- email: gtaylor@gc-taylor.com

  name: Greg Taylor

name: memcached

sources:

- https://github.com/docker-library/memcached

version: 2.0.1

#下载chart包到本地

[root@xianchaomaster1 ~]#  helm pull  aliyun/memcached

[root@xianchaomaster1 ~]# tar zxvf memcached-2.0.1.tgz

[root@xianchaomaster1 ~]# cd memcached

[root@xianchaomaster1 memcached]# ls

Chart.yaml  README.md  templates  values.yaml

Chart.yaml: chart的基本信息,包括版本名字之类

templates: 存放k8s的部署资源模板,通过渲染变量得到部署文件

values.yaml:存放全局变量,templates下的文件可以调用

[root@xianchaomaster1 memcached]# cd templates/

[root@xianchaomaster1 templates]# ls

_helpers.tpl  NOTES.txt  pdb.yaml  statefulset.yaml  svc.yaml

_helpers.tpl      存放能够复用的模板

NOTES.txt         为用户提供一个关于chart部署后使用说明的文件

5.2 部署chart

5.2.1 helm部署memcached服务

#安装memcached的Chart

[root@xianchaonode1 ~]# docker load -i memcache_1_4_36.tar.gz

#如果k8s用的是docker做容器运行时,用docker load -i导出镜像

[root@xianchaonode1 ~]# ctr -n=k8s.io images import memcache_1_4_36.tar.gz

#如果k8s用的是containerd做容器运行时,用ctr -n=k8s.io images导出镜像

#修改statefulset.yaml文件

[root@xianchaomaster1 ~]# cd memcached

[root@xianchaomaster1 memcached]# rm -rf templates/pdb.yaml

[root@xianchaomaster1 memcached]# cat templates/statefulset.yaml

apiVersion后面的value值变成apps/v1

spec下添加selector字段

  selector:

    matchLabels:

        app: {{ template "memcached.fullname" . }}

        chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"

        release: "{{ .Release.Name }}"

        heritage: "{{ .Release.Service }}"

#删除affinity亲和性配置

[root@xianchaomaster1 memcached]# helm install memcached ./

NAME: memcached

LAST DEPLOYED: Fri Jul 16 07:58:54 2021

NAMESPACE: default

STATUS: deployed

REVISION: 1

TEST SUITE: None

NOTES:

Memcached can be accessed via port 11211 on the following DNS name from within your cluster:

memcached-memcached.default.svc.cluster.local

If you'd like to test your instance, forward the port locally:

  export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached-memcached" -o jsonpath="{.items[0].metadata.name}")

  kubectl port-forward $POD_NAME 11211

In another tab, attempt to set a key:

  $ echo -e 'set mykey 0 60 5\r\nhello\r' | nc localhost 11211

You should see:

  STORED

#验证memcache是否部署成功:

[root@xianchaomaster1 memcached]# kubectl get pods

NAME                               READY   STATUS    RESTARTS   AGE

memcached-memcached-0              1/1     Running   0          56s

memcached-memcached-1              1/1     Running   0          50s

memcached-memcached-2              1/1     Running   0          37s

[root@xianchaomaster1 memcached]# yum install nc -y

测试memecached服务是否正常:

[root@xianchaomaster1 memcached]#  export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached-memcached" -o jsonpath="{.items[0].metadata.name}")

[root@xianchaomaster1 memcached]#  kubectl port-forward $POD_NAME 11211

[root@xianchaomaster1 memcached]# echo -e 'set mykey 0 60 5\r\nhello\r' | nc localhost 11211

5.3 release相关操作

#查看release发布状态

[root@xianchaomaster1 memcached]# helm list

NAME      NAMESPACE REVISION UPDATED                                 STATUS   CHART           APP VERSION

memcached default   1        2021-07-16 08:04:44.172578607 +0800 CST deployed memcached-2.0.1     

#删除release

[root@xianchaomaster1 memcached]# helm delete memcached

release "memcached" uninstalled

#删除release会把release下对应的资源也删除

[root@xianchaomaster1 memcached]# kubectl get pods

memecached的pod也被删除了

6、自定义Chart模板

6.1 自定义一个Chart

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

[root@xianchaomaster1 ~]# helm create myapp

[root@xianchaomaster1 ~]# cd myapp/

[root@xianchaomaster1 myapp]# yum install tree -y

[root@xianchaomaster1 myapp]# tree ./

./

├── 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 模板生成部署文件

6.2 Chart.yaml编写规则

[root@xianchaomaster1 myapp]# cat Chart.yaml

apiVersion: v2

name: myapp

description: A Helm chart for Kubernetes

version: 0.0.1

appVersion: "latest"

type: application

maintainer:

- name: xianchao

  wechat: luckylucky421302

appVersion: "1.16.0"

上述YAML文件中各字段的解释说明:

  • apiVersion: 这指定了Helm Chart的API版本,这里使用的是v2版本。在 v2 版本的 Helm 中,apiVersion 是 v1,而在 v3 版本的 Helm 中,apiVersion 升级为 v2
  • name: 指定Chart的名称,这个名称将用于在Helm中引用这个Chart。
  • description: 这是对Chart的描述,用于说明这个Chart是做什么的。
  • type: 这指定Chart的类型,可以是'application'(应用程序)或'library'(库)。在这个示例中,类型为'application',意味着这是一个可以部署的应用程序Chart。
  • version: 这是Chart的版本号。每当对Chart和其模板(templates)进行更改时,包括应用版本,都应该递增这个版本号。版本号遵循语义化版本(Semantic Versioning)规范。
  • appVersion: 指的是镜像标签的版本号

6.3 go模板写的资源清单文件

[root@xianchaomaster1 myapp]# cat 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: 80

              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 }}

上述yaml文件解释说明:

  1. {{- if not .Values.autoscaling.enabled }}: 这是一个 Helm 模板的条件语句。它会检查 .Values.autoscaling.enabled 参数是否为假(即未启用自动扩展),如果条件为真,则执行下面的代码块。not 关键字用于取反,所以 not .Values.autoscaling.enabled 表示如果自动扩展没有启用。
  2. replicas: {{ .Values.replicaCount }}: 这行代码位于条件语句的代码块内。它设置 Deployment 的副本数。.Values.replicaCount 是从 Helm 的 values 文件中获取的副本数配置参数的值。这个值会被插入到模板中,作为 Deployment 的副本数。

所以,如果 autoscaling.enabled 参数没有启用(即为假),那么 Deployment 的副本数将会使用配置文件中定义的 .Values.replicaCount 参数的值来设置。如果启用了自动扩展,则不会应用这个副本数设置,而是由自动扩展机制根据负载动态调整副本数。

  1. {{- with .Values.podAnnotations }}: 这是一个 Helm 模板的条件语句。它检查 .Values.podAnnotations 参数是否存在(非空),如果条件为真,则执行下面的代码块。这意味着只有当有 Pod 注解需要添加时,才会执行这段代码。
  2. annotations:: 这行代码表示在 Pod 模板的元数据部分中定义注解。
  3. {{- toYaml . | nindent 8 }}: 这部分代码用于将 .Values.podAnnotations 参数转换为 YAML 格式,并通过 nindent 8 命令进行缩进。toYaml 是一个 Helm 函数,它将参数转换为 YAML 格式。nindent 8 是一个 Helm 函数,用于对生成的 YAML 进行缩进,使其适应于 YAML 文件中的正确位置。

综合起来,这段代码的作用是,在 Pod 的元数据部分添加一组注解。这些注解来自于 .Values.podAnnotations 参数,该参数是从 Helm 的 values 文件中获取的。如果该参数存在,那么它的值会被转换为 YAML 格式并缩进,然后添加到 Pod 的元数据中作为注解,从而将这些元数据信息关联到 Pod 上。

6.4 _helpers.tpl文件

{{/*

Expand the name of the chart.

*/}}

{{- define "myapp.name" -}}

{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}

{{- end }}

  1. {{/* ... */}}: 这是 Helm 模板中的注释标记,用于添加注释,其中 /* ... */ 之间的内容会被视为注释,不会对模板执行产生影响。
  2. {{- define "myapp.name" -}}: 这里使用 define 定义了一个名为 "myapp.name" 的模板函数。它意味着我们正在创建一个可以在其他模板中调用的函数,并且函数名是 "myapp.name"。
  3. {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}: 这是模板函数的实际内容。它结合了几个操作来生成一个合适的应用名称。
    • default .Chart.Name .Values.nameOverride: 这一部分代码使用 Helm 模板函数的 default 来选择默认值。它会先尝试使用 .Values.nameOverride,如果未定义,则使用 .Chart.Name(Chart 的名称)作为默认值。
    • trunc 63: 如果生成的名称超过了 63 个字符,这一步会截断名称,确保它不会超过 Kubernetes 资源名称的长度限制。
    • trimSuffix "-": 如果名称末尾有 - 符号,则会将其删除。
  4. {{- end }}: 这是模板函数的结束标记,表示 "myapp.name" 模板函数的定义结束。

{{/*

Create a default fully qualified app name.

We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).

If release name contains chart name it will be used as a full name.

*/}}

{{- define "myapp.fullname" -}}

{{- if .Values.fullnameOverride }}

{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}

{{- else }}

{{- $name := default .Chart.Name .Values.nameOverride }}

{{- if contains $name .Release.Name }}

{{- .Release.Name | trunc 63 | trimSuffix "-" }}

{{- else }}

{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}

{{- end }}

{{- end }}

{{- end }}

  1. 备注:{{/* ... */}}: 这是 Helm 模板中的注释标记,用于添加注释,其中 /* ... */ 之间的内容会被视为注释,不会对模板执行产生影响。
  2. {{- define "myapp.fullname" -}}: 这里使用 define 定义了一个名为 "myapp.fullname" 的模板函数,它将用于生成完整的应用名称。
  3. {{- if .Values.fullnameOverride }}: 这里使用 if 语句检查是否在 Helm 部署时提供了 .Values.fullnameOverride。如果提供了,将会使用这个值来覆盖生成的应用名称。
  4. {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}: 如果提供了 .Values.fullnameOverride,那么它将作为应用名称。但是,会通过 trunc 将名称截断为不超过 63 个字符,并使用 trimSuffix "-" 删除末尾的 - 符号。
  5. {{- $name := default .Chart.Name .Values.nameOverride }}: 如果没有提供 .Values.fullnameOverride,那么将使用 .Chart.Name 作为默认的名称。
  6. {{- if contains $name .Release.Name }}: 这一部分检查 .Release.Name 是否包含在名称中,如果包含,说明 .Release.Name 已经在名称中,不需要重复添加。
  7. {{- .Release.Name | trunc 63 | trimSuffix "-" }}: 如果 .Release.Name 已经在名称中,就直接使用 .Release.Name 作为完整名称。同样,会通过 trunc 和 trimSuffix "-" 对名称进行处理。
  8. {{- else }}: 如果 .Release.Name 不包含在名称中,就使用 .Release.Name 和 $name 的组合来生成一个完整的名称,确保不超过 63 个字符。
  9. {{- end }}: 这是模板函数的结束标记,表示 "myapp.fullname" 模板函数的定义结束。

{{/*

Create chart name and version as used by the chart label.

*/}}

{{- define "myapp.chart" -}}

{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}

{{- end }}

备注:

  1. {{/* ... */}}: 这是 Helm 模板中的注释标记,用于添加注释,其中 /* ... */ 之间的内容会被视为注释,不会对模板执行产生影响。
  2. {{- define "myapp.chart" -}}: 这里使用 define 定义了一个名为 "myapp.chart" 的模板函数,它用于生成 Chart 的名称和版本的组合,作为一个通用的标签。
  3. {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}: 这是模板函数的内容。它将 Chart 的名称和版本用 - 符号连接在一起,并将版本中的 + 替换为 _,然后通过 trunc 将结果截断为不超过 63 个字符,并通过 trimSuffix "-" 删除末尾的 - 符号。

{{/*

Common labels

*/}}

{{- define "myapp.labels" -}}

helm.sh/chart: {{ include "myapp.chart" . }}

{{ include "myapp.selectorLabels" . }}

{{- if .Chart.AppVersion }}

app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}

{{- end }}

app.kubernetes.io/managed-by: {{ .Release.Service }}

{{- end }}

备注:

  1. {{/* Common labels */}}: 这是一个注释,指明下面的代码段用于生成通用标签。
  2. {{- define "myapp.labels" -}}: 这里使用 define 定义了一个名为 "myapp.labels" 的模板函数,用于生成一些通用的标签。
  3. helm.sh/chart: {{ include "myapp.chart" . }}: 这一行生成一个标签,将之前定义的 "myapp.chart" 模板函数的结果作为 helm.sh/chart 标签的值。这个标签用于标识所使用的 Helm Chart 的名称和版本。
  4. {{ include "myapp.selectorLabels" . }}: 这里通过 include 调用了名为 "myapp.selectorLabels" 的另一个模板函数,用于生成一些用于选择器标签(Selector Labels)的标签,包括应用名称和实例名称。这些标签有助于将资源归类并在 Kubernetes 中进行查询。
  5. {{- if .Chart.AppVersion }}: 这一行检查 .Chart.AppVersion 是否存在,如果存在则表示在 Chart 的 Chart.yaml 文件中定义了应用版本。
  6. app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}: 如果应用版本存在,这一行生成一个标签,将应用版本作为 app.kubernetes.io/version 标签的值,并使用 quote 函数将值引用起来。这个标签用于表示应用程序的版本。
  7. app.kubernetes.io/managed-by: {{ .Release.Service }}: 这一行生成一个标签,将 .Release.Service 作为 app.kubernetes.io/managed-by 标签的值,表示该应用是由 Helm Release 管理的。这个标签用于表示资源的管理方式。

{{/*

Selector labels

*/}}

{{- define "myapp.selectorLabels" -}}

app.kubernetes.io/name: {{ include "myapp.name" . }}

app.kubernetes.io/instance: {{ .Release.Name }}

{{- end }}

{{/*

Create the name of the service account to use

*/}}

{{- define "myapp.serviceAccountName" -}}

{{- if .Values.serviceAccount.create }}

{{- default (include "myapp.fullname" .) .Values.serviceAccount.name }}

{{- else }}

{{- default "default" .Values.serviceAccount.name }}

{{- end }}

{{- end }}

备注:

  1. {{/* Create the name of the service account to use */}}: 这是一个注释,用于说明下面的代码块是用来创建服务账户名称的。
  2. 上一篇:mac git管理(新)


    下一篇:MySQL 常用的数组函数一