Bootstrap

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之间支持的最大版本偏差icon-default.png?t=O83Ahttps://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: [email protected]

  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. {{- define "myapp.serviceAccountName" -}}: 这行定义了一个名为 "myapp.serviceAccountName" 的模板函数,它将用于生成服务账户的名称。
  3. {{- if .Values.serviceAccount.create }}: 这行代码使用条件语句来检查是否应该创建服务账户。这里是根据用户在 Helm 部署过程中是否设置了 .Values.serviceAccount.create 来判断是否需要创建。
  4. {{- default (include "myapp.fullname" .) .Values.serviceAccount.name }}: 如果需要创建服务账户(即用户在 .Values.serviceAccount.create 中设置为 true),则生成的服务账户名称将是 myapp.fullname(应用的完整名称)作为一部分,然后根据用户提供的 .Values.serviceAccount.name 覆盖这一部分。如果用户没有提供 .Values.serviceAccount.name,则使用 myapp.fullname 作为服务账户名称的一部分。
  5. {{- else }}: 如果不需要创建服务账户,就会执行这部分。
  6. {{- default "default" .Values.serviceAccount.name }}: 这行代码将 .Values.serviceAccount.name 作为服务账户的名称。如果没有提供这个值,将使用默认值 "default"
  7. {{- end }}: 这是模板函数的结束标记,表示 "myapp.serviceAccountName" 模板函数的定义结束。

6.5 values.yaml文件编写

[root@xianchaomaster1 myapp]# cat values.yaml

# Default values for myapp.

# This is a YAML-formatted file.

# Declare variables to be passed into your templates.

replicaCount: 2

image:

  repository: nginx

  pullPolicy: IfNotPresent

  # Overrides the image tag whose default is the chart appVersion.

  tag: "latest"

imagePullSecrets: []

nameOverride: ""

fullnameOverride: ""

serviceAccount:

  # Specifies whether a service account should be created

  create: true

  # Annotations to add to the service account

  annotations: {}

  # The name of the service account to use.

  # If not set and create is true, a name is generated using the fullname template

  name: ""

podAnnotations: {}

podSecurityContext: {}

  # fsGroup: 2000

securityContext: {}

  # capabilities:

  #   drop:

  #   - ALL

  # readOnlyRootFilesystem: true

  # runAsNonRoot: true

  # runAsUser: 1000

service:

  type: ClusterIP

  port: 80

ingress:

  enabled: false

  className: ""

  annotations: {}

    # kubernetes.io/ingress.class: nginx

    # kubernetes.io/tls-acme: "true"

  hosts:

    - host: chart-example.local

      paths:

        - path: /

          pathType: ImplementationSpecific

  tls: []

  #  - secretName: chart-example-tls

  #    hosts:

  #      - chart-example.local

resources: {}

  # We usually recommend not to specify default resources and to leave this as a conscious

  # choice for the user. This also increases chances charts run on environments with little

  # resources, such as Minikube. If you do want to specify resources, uncomment the following

  # lines, adjust them as necessary, and remove the curly braces after '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: {}

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

6.6部署release

[root@xianchaomaster1 myapp]# helm install nginx ./

AME: nginx

LAST DEPLOYED: Sun Aug 20 15:35:14 2023

NAMESPACE: default

STATUS: deployed

REVISION: 1

NOTES:

1. Get the application URL by running these commands:

  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=nginx" -o jsonpath="{.items[0].metadata.name}")

  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")

  echo "Visit http://127.0.0.1:8080 to use your application"

  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

[root@xianchaomaster1 myapp]# kubectl get pods

NAME                              READY   STATUS    RESTARTS   AGE

nginx-myapp-5dd768b8bd-mcwgq      1/1     Running   0          2m51s

[root@xianchaomaster1 myapp]# kubectl get svc

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE

nginx-myapp       ClusterIP   10.103.62.174   <none>        80/TCP           8m38s

7. Helm常用命令演示

7.1 检查values语法格式

[root@xianchaomaster1 myapp]# helm lint /root/myapp/

==> Linting /root/myapp/

[INFO] Chart.yaml: icon is recommended

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

#通过上面可看到语法正确

7.2 upgrade升级release

[root@xianchaomaster1 myapp]# kubectl get svc

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE

nginx-myapp                 ClusterIP   10.106.231.94   <none>        80/TCP      

[root@xianchaomaster1 myapp]# helm upgrade --set service.type="NodePort" nginx .

Release "nginx" has been upgraded. Happy Helming!

NAME: nginx

LAST DEPLOYED: Sun Aug 20 15:52:59 2023

NAMESPACE: default

STATUS: deployed

REVISION: 2

NOTES:

1. Get the application URL by running these commands:

  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services nginx-myapp)

  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")

  echo http://$NODE_IP:$NODE_PORT

[root@xianchaomaster1 myapp]# kubectl get svc

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE

nginx-myapp                 NodePort    10.106.231.94   <none>        80:30334/TCP   5m2s

#通过上面可以看到Service的type类型已经变成了nodePort

7.3 回滚release

#查看历史版本

[root@xianchaomaster1 myapp]# helm history nginx

REVISION UPDATED                  STATUS     CHART       APP VERSION DESCRIPTION     

1        Sun Aug 20 15:35:14 2023 superseded myapp-0.1.0 1.16.0      Install complete

2        Sun Aug 20 15:52:59 2023 deployed   myapp-0.1.0 1.16.0      Upgrade complete

#把myapp回滚到版本1

[root@xianchaomaster1 myapp]# helm rollback nginx 1

[root@xianchaomaster1 myapp]# kubectl get svc

NAME                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE

nginx-myapp                 ClusterIP   10.106.231.94   <none>        80/TCP      

#可以看到service已经完成回滚了

7.4 打包Chart

[root@xianchaomaster1 myapp]# helm package /root/myapp/

Successfully packaged chart and saved it to: /root/myapp/myapp-0.0.1.tgz

参考:https://helm.sh/zh/docs/helm/helm/

7.5 操作release命令

升级release版本

helm upgrade

回滚release版本

helm rollback

创建一个release实例

helm install

卸载release

helm uninstall

查看历史版本

helm history

7.6 操作Chart命令

#检查Chat的语法

helm lint

chart相关的

查看chart的详细信息

helm inspect

把chart下载下来

helm pull

把chart打包

helm package

;