Helm入门到实战演示

news2024/10/18 15:19:48

目录

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: 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. {{- 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节撒钱啦,快来薅羊毛!!!!!!!!!!!!!!!!

豆包MarsCode是给开发用的一款智能助手&#xff0c;能够实现代码智能补全、AI问答、智能测试等功能。 目前有一个推广活动&#xff0c;体验送10火星币&#xff0c;邀请一个新用户得10火星币&#xff0c;20个火星币就可以获得20京东E卡&#xff0c;隔日到账。 整个过程10分钟不…

STM32CUBEIDE的使用【三】RTC

于正点原子潘多拉开发板&#xff0c;使用stm32官方免费软件进行开发 CubeMx 配置 使用CubeMx 配置RTC 勾选RTC 设置日期和时间 配置LCD的引脚用来显示 STM32CUBEIDE 在usbd_cdc_if.c中重定向printf函数用于打印 #include <stdarg.h>void usb_printf(const char *f…

海思hi3536c配置内核支持USB摄像头

linux内核版本&#xff1a;linux-3.18.20 配置步骤 进入Device Drivers 选择Multimedia support&#xff0c;并进入 选择Media USB Adapters&#xff0c;并进入 如下图&#xff0c;选择这几项&#xff1a; 保存退出&#xff0c;重新编译内核下载 内核更新后&#xff0c…

标准版admin后台页面添加及开发操作流程及注意事项

基础介绍 CRMEB后台管理是基于vue2技术栈进行开发搭建的 Vue Router 使用的是v3版本&#xff0c;mode为history模式 如需修改 mode 请在src/setting.js中修改routerMode 新建页面 新建路由 根据目录结构&#xff0c;需要在src/router/modules中对应模块中&#xff0c;添加对…

FineReport 数据显示方式

在客户端的浏览器中&#xff0c;查看报表的效果都是通过对基础数据进行加工而来的。 制作一张报表模板&#xff0c;首先需准备报表所需的基础数据。 基础数据的来源方式有多种&#xff0c;不管数据来源于哪种方式&#xff0c;经过哪些预处理&#xff0c;最终都是返回如下图1所示…

mysql数据同步ES方案---Canal

引言 之前公司开发社交APP的时候 在开发和初上线阶段&#xff0c;我们一直采用的是 MySQL 来存储用户的各种数据&#xff0c;满足基本的查询需求。当时系统业务量小&#xff0c;数据规模有限&#xff0c;因此 MySQL 能很好地支持查询操作&#xff0c;响应速度快&#xff0c;系…

你认为BI不需要建模,那就大错特错了

BI 是一种数据类的技术解决方案&#xff0c;将许多来自不同企业业务系统的数据提取有分析价值的数据进行清洗、转换和加载&#xff0c;就是抽取Extraction、转换 Transformation、加载Loading 的ETL过程&#xff0c;最终合并到一个数据仓库中&#xff0c;按照一定的建模方式例如…

【学习】安装cudf和cuml

为了把cpu上跑的SVM程序搬到GPU上跑&#xff0c;需要装这俩包&#xff0c;但是搞了半天装不上&#xff0c;最后发现是清华源的问题。换了中科大的源没问题了。 rapids官网&#xff1a;RAPIDS | GPU Accelerated Data Science 官网安装&#xff1a;Installation Guide - RAPID…

安装CentOS 8镜像和创建CentOS 8虚拟机教程

一、安装虚拟机 网上查找教程&#xff0c;我用的是VMware 17 二、下载CentOS 8镜像 1.阿里云下载CentOS 8镜像 centos安装包下载_开源镜像站-阿里云 (aliyun.com) 选择需要下载的版本&#xff0c;(建议)下载dvd1版本的iso&#xff08;也有下载boot版本的iso&#xff0c;创…

用柔性神经k-Opt学习搜索路径问题的可行和不可行区域(未完,先看前驱文章L2S)

文章目录 Abstract1 IntroductionAbstract 介绍了一种名为 Neural k-Opt(NeuOpt)的新型学习搜索(L2S)求解器,用于解决路径问题。它学习执行基于定制的动作分解方法和定制的循环双流(Recurrent Dual-Stream)解码器的灵活 k-opt 交换。 作为一项开创性的工作,我们绕过了…

使用YOLOv8进行实时人员跟踪和计数

在计算机视觉领域,实时跟踪和统计人数对于各种应用至关重要,从监控到事件管理。在这篇博客文章中,我们将探讨如何利用YOLOv8和ByteTracker实现准确的人数统计。 引言 YOLOv8(You Only Look Once,第八版)是一种以其速度和准确性而闻名的最新对象检测模型。 ByteTracker是一…

Oracle DECODE 丢失时间精度的原因与解决方案

在Oracle数据库中&#xff0c;DECODE 函数是一个非常实用的条件处理函数&#xff0c;通常用于替代简单的 CASE WHEN 语句。它根据给定的值列表进行匹配&#xff0c;如果匹配成功则返回相应的值。如果不匹配&#xff0c;返回一个默认值。 问题描述 SELECT DECODE(-21, -1, NU…

低代码可视化-uniapp购物车页面-代码生成器

购物车页面是电子商务网站或应用程序中的一个关键功能页面&#xff0c;它允许用户查看、编辑和管理他们选择加入购物车的商品。下面通过低代码可视化实现一个uniapp购物车页面&#xff0c;把购物车整个事件都集成进去。实现完成后可以保存为页面模板。 收货地址选择 如果尚未…

基于SpringBoot+Vue+uniapp微信小程序的垃圾分类系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Cursor 、v0 和 Bolt.new:当今 AI 编程工具的全面解析与对比

AI 驱动的编码工具正在迅速发展&#xff0c;每次新版本的发布都承诺将改变我们的开发流程。这些工具旨在通过智能代码建议、重复任务的自动化&#xff0c;甚至从自然语言提示生成整个代码片段来提升生产力。10月4日&#xff0c;StackBlitz 推出了 Bolt.new&#xff0c;进一步丰…

建议大家尽早培养自己的表达能力!分享6个有效工具~

在日常工作生活中&#xff0c;有效沟通是成事的不二法则。现在很多人不热衷沟通&#xff0c;对人际交往没热情&#xff0c;但是会和不用&#xff0c;与不想也不会是两回事&#xff0c;所以掌握一些沟通技巧很有必要。 如何进行有效沟通&#xff1f;推荐大家进行结构化表达和沟…

代码复现(五):GCPANet

文章目录 net.py1.class Bottleneck&#xff1a;残差块2.class ResNet&#xff1a;特征提取3.class SRM&#xff1a;SR模块4.class FAM&#xff1a;FIA模块5.class CA&#xff1a;GCF模块6.class SA&#xff1a;HA模块7.class GCPANet&#xff1a;网络架构 train.pytest.py 论文…

计算机视觉——人像的分割与无缝融合

1.概述 新加坡现代汽车集团创新中心的一篇新论文提供了一种在计算机视觉中分离“融合”人像的方法——在这些情况下&#xff0c;对象识别框架发现一个人在某种程度上与另一个人“太接近”&#xff08;例如例如“拥抱”动作或“站在后面”的姿势&#xff09;&#xff0c;并且无法…

从零实现数据结构:堆的实现和简单堆排序

事先说明&#xff0c;这里采用的都是小堆。下面是代码中的小堆示意图 这里向大家分享一个常见数据结构可视化的网址&#xff1a;Data Structure Visualization (usfca.edu) 声明部分heap.h&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include &…

Turtle画树丛

Turtle画树丛&#xff0c;50棵树&#xff0c;左侧的树向左倾斜&#xff0c;右侧的树向右倾斜。 完整代码如下&#xff1a; import turtle import randomdef draw_tree(pos,hd,angle,len,init_len,level): t.penup()t.goto(pos)t.pendown()t.setheading(hd)if pos[0]<0:t…