当前位置: 首页 > news >正文

Helm 学习之路,一文弄懂

1. 什么是 Helm

1.1 概述

Helm 是 Kubernetes 应用程序的包管理器,和redhat中yum 管理包类似.

1.2 架构图v3

1.3 下载

官当

最新版本

官方github

curl -LO https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz

1.4 安装

  • 解压

#由于是二进制,直接解压到/usr/local/bin下就可以使用
tar zxvf helm-v3.15.2-linux-amd64.tar.gzmv linux-amd64/helm /usr/local/bin/helm#查看版本
[root@kube-master ~]# helm version
version.BuildInfo{Version:"v3.15.2", GitCommit:"1a500d5625419a524fdae4b33de351cc4f58ec35", GitTreeState:"clean", GoVersion:"go1.22.4"}

其他方式参考,具体内容可参考官方 安装文档

1.5 win下安装

winget install Helm.Helm

  • 查看版本

2. 添加国内仓库

  • 微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库推荐,基本上官网有的chart这里都有

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

  • 官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内卡

#添加阿里云
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts#添加微软
helm repo add stable http://mirror.azure.cn/kubernetes/charts#更新
helm repo update#查看
helm repo list
helm search repo stable

3. ArtifactHub 使用

比如我们想要部署 Nginx,首先在 ArtifactHub 上进行搜索:

Bitnami 是 Helm 中最常用的仓库之一,它内置了很多常用的 Kubernetes 应用,点击nginx,进入主界面,之后点击右侧的install, 可以看到如何进行部署

4. Helm 概念 

Helm 中几个个非常重要的概念:

  • Repository

  • Chart

  • Release

  • Value

  • Template

  • Namespace

4.1 Repository

存放安装包的仓库,可以使用 helm env 查看

[root@kube-master ~]# helm env
HELM_BIN="helm"
HELM_BURST_LIMIT="100"
HELM_CACHE_HOME="/root/.cache/helm"
HELM_CONFIG_HOME="/root/.config/helm"
HELM_DATA_HOME="/root/.local/share/helm"
HELM_DEBUG="false"
HELM_KUBEAPISERVER=""
HELM_KUBEASGROUPS=""
HELM_KUBEASUSER=""
HELM_KUBECAFILE=""
HELM_KUBECONTEXT=""
HELM_KUBEINSECURE_SKIP_TLS_VERIFY="false"
HELM_KUBETLS_SERVER_NAME=""
HELM_KUBETOKEN=""
HELM_MAX_HISTORY="10"
HELM_NAMESPACE="default"
HELM_PLUGINS="/root/.local/share/helm/plugins"
HELM_QPS="0.00"
HELM_REGISTRY_CONFIG="/root/.config/helm/registry/config.json"
HELM_REPOSITORY_CACHE="/root/.cache/helm/repository"
HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"

4.2 Chart

Chart,是 Helm 特有的安装包格式,这个安装包中包含了一个 Kubernetes 应用的所有资源文件

4.3 Release

Release 就是安装到 Kubernetes 中的 Chart 实例,每个 Chart 可以在集群中安装多次,每安装一次,就会产生一个 Release

4.4 Value

Helm Chart的参数,用于配置Kubernetes对象

4.5 Template

使用Go模板语言生成Kubernetes对象的定义文件

4.6 Namespace

Kubernetes中用于隔离资源的逻辑分区

4.7 部署流程

  1. 开发者首先创建并编辑chart的配置;

  2. 接着打包并发布至Helm的仓库(Repository);

  3. 当管理员使用helm命令安装时,相关的依赖会从仓库下载;

  4. 接着helm会根据下载的配置部署资源至k8s;

5. Helm语法

Helm官当

5.0 与5相比变化点

1.HelmCLI个别名字更名

helm delete  更名为 helm uninstallhelm inspect 更名为 helm showhelm fetch 更名为 helm pull

2.移除了用于本地临时搭建Chart Repository的helm serve命令

3.自动创建名称空间

在不存在的命名空间中创建发行版时,Helm2创建了命名空间。Helm3遵循其他Kubernetes对象的行为,如果命名空间不存在则返回错误.

4.不再需要requirements.yaml,依赖关系是直接在chart.yaml中定义.

5.1 模版注释

Chart.yaml

apiVersion: chart API 版本 (必需)  #必须有
name: chart名称 (必需)     # 必须有 
version: 语义化2 版本(必需) # 必须有kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:- 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:- 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)- name: chart名称 (nginx)version: chart版本 ("1.2.3")repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )tags: # (可选)- 用于一次启用/禁用 一组chart的tagimport-values: # (可选)- ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用maintainers: # (可选) # 可能用到- name: 维护者名字 (每个维护者都需要)email: 维护者邮箱 (每个维护者可选)url: 维护者URL (每个维护者可选)icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:example: 按名称输入的批注列表 (可选).

values.yaml

templates

图片

image-20240709152235643

templates/ 目录下的文件被视为使用 Go 模板语言的动态 YAML 模板,并带有一些附加功能。

YAML 模板可防止配置重复,并允许您在开发、暂存和生产环境中安装相同的图表。

5.2 内置对象

Release 对象

Values 对象

Chart 对象

Capabilities 对象

Template 对象

常用使用的

内置作用
Release.Namerelease名称
Release.Namespacerelease命名空间
Release.Revisionrelease版本号。起始是1,每次升级或回滚都会自增1
Release.Servicerelease 服务的名称

5.3 内置函数

文档

upper

将整个字符串转换为大写:

upper "hello"

lower

将整个字符串转换为小写:

lower "HELLO"

title

转换为标题大小写:


title "hello world"

returns Hello World

5.4 流程控制

5.4.0 运算符

运算符作用
eq等于(equal to)
ne不等于(not equal to)
lt小于(less than)
le小于等于(less than or equal to)
gt大于(greater than)
ge大于等于(greater than or equal to)

5.4.1 if/else 条件块

  • 语法

如果值为如下情况,则if条件评估为 false


一个布尔型的假一个数字零一个空的字符串一个 nil(空或 null)一个空的集合(map,slice,tuple,dict,array)

例子:

上面配置是基于同一个pod 部署两个容器,一个是应用一个是nginx 的配置的通用模板。也就是说默认是关闭nginx 配置的,如果启用可以通过--set nginx.enabled=true 方式。

说明

当模板引擎运行时,它会删除

图片

中的内容,但保留其余空白,如下方式删除空行

图片

花括号里面的中横行“-” 的用途是清除helm 渲染后的yml 文件里面的空行,由于像if 判断这些语句不是k8s里面yml 文件里的配置信息,所以渲染后的yml 文件中if 等语句的位置会产生空行,所以加上“-”就会清除空行

谨慎使用:如:-}} ,这将会把如上的结果生成在同一行,因为它消除了两边的换行符.

5.4.2 with 指定范围

  • 定义

with作用域,用来控制变量范围。回想一下,.是对 当前作用域 的引用。因此 .Values就是告诉模板在当前作用域查找Values对象。

with语句块内不能再 .Release.Name对象,否则报错

  • 语法

{{ with PIPELINE }}# restricted scope
{{ end }}
  • 案例

apiVersion: v1
kind: ConfigMap
metadata:name: {{.Release.Name}}-configmap
data:myvalue: "Hello World"
{{- with .Values.favorite}}
drink: {{.drink | default "tea" | quote}}
food: {{.food | upper | quote}}
{{- end}}注意,现在我们可以引用 .drink 和 .food 无需对其进行限定。这是因为该 with 声明设置 . 为指向 .Values.favorite。在 {{end}} 后 . 复位其先前的范围。但是请注意!在受限范围内,此时将无法从父范围访问其他对象。例如,下面会报错:
{{- with .Values.favorite}}
drink: {{.drink | default "tea" | quote}}
food: {{.food | upper | quote}}
release: {{.Release.Name}}    #此处报错
{{- end}}解决方式:
{{- $releaseName := .Release.Name -}}      #在with区域外定义要引入的值,在里面再通过变量引入
{{- with .Values.favorite}}
drink: {{.drink | default "tea" | quote}}
food: {{.food | upper | quote}}
release: {{ $releaseName }}              #通过定义的变量引入
{{- end}}

5.4.3 range 循环块

  • 定义

Helm 的模板语言中,遍历集合的方式是使用 range 操作(类似for)

  • 语法


{{ range PIPELINE }}# restricted scope
{{ end }}
  • 案例

cat values.yaml favorite:drink: coffeefood: pizzapizzaToppings:- mushrooms- cheese- peppers- onions将这个列表打印到我们的 ConfigMap 中:cat templates/configmap.yaml apiVersion: v1kind: ConfigMapmetadata:name: {{.Release.Name}}-configmapdata:myvalue: "Hello World"{{- with .Values.favorite}}drink: {{.drink | default "tea" | quote}}food: {{.food | upper | quote}}{{- end}}toppings: |-                            #因为此处要引入的是多行字符串,所以通过"|-"方式 {{- range .Values.pizzaToppings}}- {{. | title | quote}}               #"." 就是循环的对象中的单个元素,由此可见range也具有with 一样的功能,可以限定范围。{{- end}}循环自建的元祖有时能快速在模板中创建一个列表,然后遍历该列表是很有用的。Helm 模板有一个功能可以使这个变得简单:tuple。sizes: |-{{- range tuple "small" "medium" "large"}}- {{.}}{{- end}}{{/*输出如下*/}}sizes: |-- small- medium- large用于类似列表的对象以同时捕获索引和值:toppings: |-{{- range $index, $topping := .Values.pizzaToppings}}{{$index}}: {{ $topping }}{{- end}}注意,range 首先是变量,然后是赋值运算符,然后是列表。这将分配整数索引(从零开始)给 $index,值给 $topping。运行它将产生:对于同时具有键和值的数据结构,我们可以使用 range 来获得两者apiVersion: v1kind: ConfigMapmetadata:name: {{.Release.Name}}-configmapdata:myvalue: "Hello World"{{- range $key, $val := .Values.favorite}}{{$key}}: {{ $val | quote }}{{- end}}#favorite 定义在 values.yaml中,如上文所示。

5.4.4 变量

  • 定义

Helm模板中,变量是对另一个对象的命名引用。遵循$name变量的格式且指定了一个特殊的赋值运算符::=

变量通常不是 “全局” 的。它们的范围是它们所在的块

  • 案例

这段代码会失败

{{- with .Values.favorite}}drink: {{.drink | default "tea" | quote}}food: {{.food | upper | quote}}release: {{.Release.Name}}
{{- end}}Release.Name 不在该 with 块中限制的范围内。解决范围问题的一种方法是将对象分配给可以在不考虑当前范围的情况下访问的变量。

使用变量重写上面的 Release.Name

apiVersion: v1
kind: ConfigMap
metadata:name: {{.Release.Name}}-configmap
data:myvalue: "Hello World"
{{- $relname := .Release.Name -}}
{{- with .Values.favorite}}drink: {{.drink | default "tea" | quote}}food: {{.food | upper | quote}}release: {{$relname}}
{{- end}}注意,在我们开始 with 块之前,我们赋值 $relname :=.Release.Name。现在在 with 块内部,$relname 变量仍然指向发布名称。因为变量不受with 范围限制。

5.4.5 命名模板

模版

在命名模板时要注意一个重要的细节:模板名称是全局的。如果声明两个具有相同名称的模板,则最后加载一个模板是起作用的模板。

define定义命名模板

可以在/templates/*.yaml 文件中定义命名模板也可以在/templates/_helpers.tpl 定义

template/include 使用命名模板

include与template 区别

include 是可以替代template 的更高级的用法,可以增加缩进功能。

例如创建一个configmap 它的lable 和 data 下面的数据缩进是不同的,lable 缩进在metadata 下面,所以lable 下面的数据是相比于顶格是缩进四个空格。data 本身就是顶格写的,它下面的数据缩进两个空格即可

define 定义的命名模板内容如果同时引入到lable 和 data 下面,那么相同的内容但是缩进不同,如果直接用template 引入那么就会原模原样引入不缩进而是顶格引入到yaml 中

这样不符合configmap 的定义语法可能不报错但是不会生效这两部分内容,
即使在模本文件中缩进引用{{- template "mychart.labels" . }},依然不生效,
所以在引入过程中需要增加空格所以include 可以替代template 增加空格,语法为:{{- include "mychart.labels" .| indent 4 }} 数字4表示缩进几个空格
  • 案例

cat _helpers.tpl{{/* 生成基本的资源配置 */}}{{- define "resources" }}{{- with .Values.resources}}limits:cpu: {{ .limits.cpu }}memory: {{ .limits.memory }}requests:cpu: {{ .requests.cpu }}memory: {{ .requests.memory }}{{- end }}{{- end }}cat templates/deployment.yaml
...- name: {{ .Release.Name }}-nginximage: {{ .Values.image.repository }}/nginx-qa:{{ .Values.image.tagn }}imagePullPolicy: {{ .Values.image.pullPolicy }}ports:- containerPort: 80protocol: TCPresources:{{- include "resources" .| indent 10 }}            #在此处通过命名模板名字引用volumeMounts:- name: nginx-configmountPath: /etc/nginx/conf.d...

5.4.6 模板中"-"


示例一
...
name: {{- Values.name -}} #话括号里面的横线左边的会删除括号左边的空格,右边的会删除右边的空格,在此处一般不加这俩“-”
...
示例二
...
{{-if Values.nginx.enable }} #此处作用就是删除if 和 end 逻辑语句所占的空行,因为这些流程控制语句不会渲染成实际的yaml 配置,默认保留空行再yaml 文件中,所以需要用“-”删除
...
{{- end }}
...

5.4.7 调试

Helm也提供了--dry-run --debug调试参数,帮助验证模板正确性。在执行helm install时候带上这两个参数就可以把对应的values值和渲染的资源清单打印出来,而不会真正的去部署一个release

helm install web --dry-run /root/mychart

5.5 set格式和限制

--set 选项使用0或多个 name/value 对

1、最简单的name/value对

--set name=value
等价于
name: value

2、多个name/value对

--set a=b,c=d
等价于
a: b
c: d

3、更复杂的表达式

--set outer.inner=value
等价于
outer:inner: value

4、列表的表达

--set name={a, b, c}
等价于
name:- a- b- c

5、name/key可以设置为null或者空数组


--set name=[],a=null
由
name:- a- b- c
a: b
变为了
name: []
a: null

6、使用数组下标的语法来访问列表中的元素

从 2.5.0 版本开始支持

--set servers[0].port=80
等价于
servers:- port: 80

7、多个值得数组下标语法

--set servers[0].port=80,servers[0].host=example
等价于
servers:- port: 80host: example

8、特殊字符转义

--set name=value1\,value2
等价于
name: "value1,value2"

9、转义.

--set nodeSelector."kubernetes\.io/role"=master
等价于
nodeSelector:kubernetes.io/role: master

6. Helm命令

官方

helm --help  通过help获取更多解释

6.1 添加仓库

helm repo add

[root@kube-master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories

helm repo list

[root@kube-master ~]# helm repo list
NAME    URL
bitnami https://charts.bitnami.com/bitnami

helm repo update

helm repo update repo_name

helm repo remove

 helm repo remove repo_name

6.2 创建

helm create

[root@kube-master ~]# helm create demo[root@kube-master ~]# tree demo
demo
├── charts                 # 依赖其他包的charts文件
├── Chart.yaml      # chart的描述文件,包括ico地址,版本信息等
├── templates              # 存放k8s模板文件目录
│   ├── deployment.yaml    # Kubernetes deployment 配置
│   ├── _helpers.tpl       # 下划线开头的文件为公共文件,可以被其他模板引用
│   ├── hpa.yaml           # #水平 pod 自动扩缩容 go 模板文件
│   ├── ingress.yaml  # Kubernetes ingress 配置
│   ├── NOTES.txt           # 用户运行 helm install 时候的提示信息
│   ├── serviceaccount.yaml # Kubernetes serviceaccount 配置
│   ├── service.yaml        # Kubernetes service 配置
│   └── tests    # test
│       └── test-connection.yaml
└── values.yaml             #模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件
目录结构介绍
目录说明
charts可选目录,可能包含子chart
Chart.yaml包含chart描述的主文件
templatesKubernetes 资源定义为模板的目录
values.yaml定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖
.helmignore定义打包时要忽略的模式的地方(概念上与 .gitignore 类似)

helm lint

检查语法是否正确


[root@kube-master ~]# helm lint ./demo
==> Linting ./demo
[INFO] Chart.yaml: icon is recommended1 chart(s) linted, 0 chart(s) failed

6.3 下载

helm pull

helm pull bitnami/nginx

6.4 查询

helm ls

[root@kube-master ~]# helm ls --all
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

helm list

#显示某个命名空间下的所有 Release
[root@kube-master ~]# helm  list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

helm status

#查询某个 Release 的状态信息
helm status my-nginx

helm get

获取某个 Release 的扩展信息,包括:

  • helm get hooks - 获取 Release 关联的钩子信息

  • helm get manifest - 获取 Release 的清单信息

  • helm get notes - 获取 Release 的注释

  • helm get values - 获取 Release 的 values 文件

  • helm get all - 获取 Release 的所有信息

helm history

helm history my-nginx

helm search hub

ArtifactHub 中搜索 Chart

helm search hub nginx

helm search repo

helm search repo nginx

helm show

该命令用于显示 Chart 的基本信息,包括:

  • helm show chart - 显示 Chart 定义,实际上就是 Chart.yaml 文件的内容

  • helm show crds - 显示 Chart 的 CRD

  • helm show readme - 显示 Chart 的 README.md 文件中的内容

  • helm show values - 显示 Chart 的 values.yaml 文件中的内容

  • helm show all - 显示 Chart 的所有信息

6.5 安装

Helm的执行安装顺序

Helm按照以下顺序安装资源:

  • Namespace

  • NetworkPolicy

  • ResourceQuota

  • LimitRange

  • PodSecurityPolicy

  • PodDisruptionBudget

  • ServiceAccount

  • Secret

  • SecretList

  • ConfigMap

  • StorageClass

  • PersistentVolume

  • PersistentVolumeClaim

  • CustomResourceDefinition

  • ClusterRole

  • ClusterRoleList

  • ClusterRoleBinding

  • ClusterRoleBindingList

  • Role

  • RoleList

  • RoleBinding

  • RoleBindingList

  • Service

  • DaemonSet

  • Pod

  • ReplicationController

  • ReplicaSet

  • Deployment

  • HorizontalPodAutoscaler

  • StatefulSet

  • Job

  • CronJob

  • Ingress

  • APIService

6.6 更新

helm upgrade

格式:

helm upgrade [RELEASE] [CHART] [flags]
指定'--values'/'-f'参数

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


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

修改nginx镜像版本为1.27.0

helm upgrade my-nginx nginx-helm-1.0.0.tgz --set image.tag=1.27.0

6.7 回滚

helm rollback

查看发布历史

#查看
[root@kube-master ~]# helm list
NAME NAMESPACE REVISION UPDATED                                 STATUS   CHART      APP VERSION
demo default   3        2024-07-16 18:06:26.685169771 +0800 CST deployed demo-1.0.0 v1#查看历史发布
[root@kube-master ~]# helm history demo
REVISION UPDATED                  STATUS     CHART      APP VERSION DESCRIPTION
1        Tue Jul 16 18:03:50 2024 superseded demo-1.0.0 v1          Install complete
2        Tue Jul 16 18:04:14 2024 superseded demo-2.0.0 v2          Upgrade complete
3        Tue Jul 16 18:06:26 2024 deployed   demo-1.0.0 v1          Rollback to 1

回滚到第一个版本

helm rollback <name> <REVISION>

6.8 模版渲染

本质就是以yaml文件查看内容

[root@kube-master ~]# helm template ./demo
---
# Source: demo/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: release-name-demolabels:helm.sh/chart: demo-0.1.0app.kubernetes.io/name: demoapp.kubernetes.io/instance: release-nameapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
automountServiceAccountToken: true

6.9 卸载 Release

#删除
helm uninstall my-nginx

7. 手动发布Helm

7.1 创建

helm create demo
  • 查看目录结构

[root@kube-master demo]# tree -L 2
.
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
└── values.yaml3 directories, 9 files
  • 修改配置文件

  1. 编辑自描述文件 Chart.yaml , 修改version和appVersion信息

apiVersion: v2
name: demo
description: A Helm chart for Kubernetes# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 1.0.0 # 修改 项目版本号# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "v1" # 修改 镜像版本
  1. 编辑values.yaml配置文件

修改副本数和镜像

replicaCount: 2image:repository: registry.cn-zhangjiakou.aliyuncs.com/hsuing/demoapppullPolicy: IfNotPresent# 0verrides the image tag whose default is the chart appVersion.tag: ""

7.2 打包Chart

  • 检查语法是否正确


helm lint demo
  • 打包自定义的chart

[root@kube-master helm]# helm package demo
Successfully packaged chart and saved it to: /root/helm/demo-0.1.0.tgz

7.3 发布Chart

将打包好的Chart发布到一个Helm Repository中。可以使用helm repo add命令添加一个Repository,然后使用helm push命令将Chart推送到Repository中


helm repo add myrepo https://example.com/charts
helm push nginx-helm-1.0.0.tgz myrepo

7.4 安装Release

[root@kube-master helm]# helm  install demo demo-0.1.0.tgz
NAME: demo
LAST DEPLOYED: Tue Jul 16 17:46:20 2024
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=demo,app.kubernetes.io/instance=demo" -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
  • 查看pod

[root@kube-master helm]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS      AGE
demo-857bf7c87b-l9lkv                     1/1     Running   0             17s
demo-857bf7c87b-mrx7x                     1/1     Running   0             17s

7.5 管理Release

更新
  1. 编辑自描述文件 Chart.yaml , 修改version和appVersion信息

  2. 重新打包

  • 检查语法

helm lint demo
  • 打包

helm package demo

3.更新chart

helm upgrade demo demo-2.0.0.tgz
回滚
  • 查看当前版本

[root@kube-master helm]# helm list
NAME NAMESPACE REVISION UPDATED                                STATUS   CHART      APP VERSION
demo default   2        2024-07-16 18:04:14.47907591 +0800 CST deployed demo-2.0.0 v2
  • 查看历史版本


[root@kube-master helm]# helm history demo
REVISION UPDATED                  STATUS     CHART      APP VERSION DESCRIPTION
1        Tue Jul 16 18:03:50 2024 superseded demo-1.0.0 v1          Install complete
2        Tue Jul 16 18:04:14 2024 deployed   demo-2.0.0 v2          Upgrade complete
  • 回滚指定版本

[root@kube-master helm]# helm rollback demo 1
Rollback was a success! Happy Helming!

8.Helm导出YAML文件

从helm 导出到普通yaml文件,两边是可以互相转换的,下期讲解如何从yaml文件到helm的转换,不用为再次编写helm而苦恼

8.0渲染导出

  • 当前路径

[root@kube-master helm]# pwd
/root/helm[root@kube-master helm]# ls
demo  demo-1.0.0.tgz  demo-2.0.0.tgz
  • 导出

helm template  demo --output-dir /root/hantest/wrote /root/hantest//demo/templates/serviceaccount.yaml
wrote /root/hantest//demo/templates/service.yaml
wrote /root/hantest//demo/templates/deployment.yaml
wrote /root/hantest//demo/templates/tests/test-connection.yaml

相关文章:

Helm 学习之路,一文弄懂

1. 什么是 Helm 1.1 概述 Helm 是 Kubernetes 应用程序的包管理器,和redhat中yum 管理包类似. 1.2 架构图v3 1.3 下载 官当 最新版本 官方github curl -LO https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz 1.4 安装 解压 #由于是二进制,直接解压到/usr/local/b…...

【面试题解答】一个有序数组 nums ,原地删除重复出现的元素

面试题解答 仅供学习 文章目录 面试题解答题目一、python代码1.1 代码1.2 示例用法1.2.1 示例11.2.2 示例2 二、讲解2.1 初始化2.2 遍历2.3 返回 题目 要解决这个问题&#xff0c;可以使用双指针方法进行原地修改&#xff0c;以确保每个元素最多出现两次。 一、python代码 1.1…...

【数据结构算法经典题目刨析(c语言)】随机链表的复制(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 一、题目描述 二、思路分析 三、代码实现 一、题目描述 二、思路分析 要完成一个带随机指针的链表的复制&#xff0c;有一个巧妙的办法:分三步走 1.完成节…...

cqyjldfx

CVE-2023-27179 靶标介绍&#xff1a; GDidees CMS v3.9.1及更低版本被发现存在本地文件泄露漏洞&#xff0c;漏洞通过位于 /_admin/imgdownload.php 的 filename 参数进行利用。攻击者可以通过向 filename 参数传递恶意输入来下载服务器上的任意文件。 提示有本地文件泄露&a…...

大数据——HBase原理

摘要 HBase 是一个开源的、非关系型的分布式数据库系统&#xff0c;主要用于存储海量的结构化和半结构化数据。它是基于谷歌的 Bigtable 论文实现的&#xff0c;运行在 Hadoop 分布式文件系统&#xff08;HDFS&#xff09;之上&#xff0c;并且可以与 Hadoop 生态系统的其他组…...

《电视技术》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《电视技术》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《电视技术》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国电子科技集团公司 主办单位&#xff…...

网络编程 --------- 2、socket网络编程接口

1、什么是socket 套接字 socke套接字是一个编程的接口 (网络编程的接口)、是一种特殊的文件描述符 (read/write)&#xff0c;不局限于TCP/IP 。socket是独立于具体协议的网络编程接口这个接口是位于 应用层和传输层之间 。 类型&#xff1a; (1)流式套接字 SOCK_ST…...

C# Deconstruct详解

总目录 前言 该文来源于探索弃元的使用&#xff0c;由弃元了解到元组&#xff0c;由元组又了解到解构方法Deconstruct。 另外本文中 解构和析构一个意思&#xff0c;不要在意&#xff01; 一、Deconstruct是什么&#xff1f; 1. 关于元组 如果我们想了解Deconstruct 的使用&…...

Java 面试常见问题之——为什么重写equals时必须重写hashCode方法

Java 面试常见问题之——为什么重写equals时必须重写hashCode方法 当重写 equals 方法时&#xff0c;通常也应该重写 hashCode 方法&#xff0c;原因主要有以下几点&#xff1a; 一致性原则&#xff1a;根据 Java 的约定&#xff0c;如果两个对象通过 equals 方法比较返回 tr…...

后端给的树形结构 递归 改造成阶联选择器所需要的lable、value结构

赋值&#xff1a;this.newTreeData this.renameFields(this.treeData) 递归方法&#xff1a;renameFields (tree) {return tree.map(node > {// 创建一个新对象来存放修改后的字段名const newNode {value: node.id,label: node.title,// 如果有子节点&#xff0c;则递归处理…...

文献阅读:基于拓扑结构模型构建ICI收益诊断模型

介绍 Custom scoring based on ecological topology of gut microbiota associated with cancer immunotherapy outcome是来自法国Gustave Roussy Cancer Campus的Laurence Zitvogel实验室最近发表在cell的关于使用肠道微生物拓扑结构预测免疫治疗疗效的文章。 该研究提供基于…...

Python文献调研(四)QtDesigner的布局

一、新建项目&#xff1a; 1.打开pycharm&#xff0c;新建一个Python项目 &#xff08;1&#xff09;右键项目列表区&#xff0c;找到我们之前配置好的外部工具&#xff0c;点击Pyside6 QtDesigner 打开Qt Designer后会是这个界面&#xff1a; &#xff08;2&#xff09;此时…...

CentOS Linux release 7.9.2009 中sudo命令未找到

先在 Windows 环境中下载 sudo 的安装包 下载安装包&#xff1a;https://www.sudo.ws/releases/stable/ 然后把安装包拷贝的 Centos 中&#xff0c;cd 进入安装包所在的目录执行下面的命令&#xff1a; 格式&#xff1a;rpm -Uhv xxxxx.rpm rpm -Uhv sudo-logsrvd-1.9.15-6.…...

生产计划问题的不同最优化工具软件求解

一、优化求解软件简介 众所周知&#xff0c;常用的优化工具软件有Lingo、Mathcad和MATLAB。 1. LINGO是Linear Interactive and General Optimizer的缩写&#xff0c;即“交互式的线性和通用优化求解器”&#xff0c;由美国LINDO系统公司&#xff08;Lindo System Inc.&…...

Java关键字及保留字总结

文章目录 Java关键字及保留字总结&#xff08;按首字母字母顺序所排列&#xff09;1.abstract2.boolean3.break4.byte5.case6.catch7.char8.class9.continue10.default11.do12.double13.else14.enum15.extends16.final17.finally18.float19.for20.if21.implements22.import23.i…...

【PGCCC】PostgreSQL 14 小版本分析,有那个版本不建议使用#PG中级

以下是对 PostgreSQL 14 各个小版本的详细分析&#xff0c;包括每个版本的主要变化、修复的 bug 和潜在的问题&#xff1a; PostgreSQL 14.0 发布日期&#xff1a;2021 年 9 月 30 日 主要变化&#xff1a; 增加了并行查询的改进&#xff0c;提升了性能。增强了 JSON 数据类…...

B树在数据库中的应用:理论与实践

B树在数据库中的应用&#xff1a;理论与实践 B树&#xff08;B-tree&#xff09;是一种自平衡的树数据结构&#xff0c;广泛应用于数据库系统中&#xff0c;特别是用于实现索引和文件系统中的关键字查找。B树的设计目标是保持数据有序并允许高效的查找、插入和删除操作。本文将…...

网络编程 -------- 3、TCP_UDP_UNIX

1、基于TCP的套接字编程流程 Server.c socket bind &#xff08;服务器的ip端口&#xff09; listen accept recv / send close Client.c socket connect &#xff08;服务器的ip端口&#xff09; …...

口袋奇兵:游戏辅助教程!陆军搭配阵容推荐,平民必备!

《口袋奇兵》是一款策略类手游&#xff0c;玩家需要在游戏中组建和指挥自己的军队&#xff0c;进行各种战斗和任务。为了在游戏中取得更好的成绩&#xff0c;合理搭配英雄和使用辅助工具是非常重要的。本攻略将为大家介绍一种强力的陆军搭配阵容&#xff0c;以及如何利用VMOS云…...

Spring Boot 集成参数效验 Validator

为什么需要参数效验? 在业务开发中,为了防止非法参数对业务造成影响,所以需要对用户输入的正确性、数据完整性、安全性、业务规则的执行做效验,靠代码对接口参数做if判断的话就太繁琐了,代码冗余且可读性差(主要是不够优雅)。 Validator效验框架遵循了JSR-303验证规范…...

63、ELK安装和部署

一、ELK日志系统 1.1、ELK平台的定义 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch、Logstash和Kiabana 三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求 E:elasticsearch ES分布式索引型非关系数据库&#xff0c;存…...

【Dash】简单的直方图

一、Visualizing Data The Plotly graphing library has more than 50 chart types to choose from. In this example, we will make use of the histogram chart. # Import packages from dash import Dash, html, dash_table, dcc import pandas as pd import plotly.expre…...

【CTF-Crypto】格密码基础(例题较多,非常适合入门!)

格密码相关 文章目录 格密码相关格密码基本概念&#xff08;属于后量子密码&#xff09;基础的格运算&#xff08;行列式运算&#xff09;SVP&#xff08;shortest Vector Problem&#xff09;最短向量问题CVP&#xff08;Closet Vector Problem&#xff09;最近向量问题 做题要…...

Java对象流

对象流 对象输入流 java.io.ObjectInputStream使用对象流可以进行对象反序列化 构造器 ObjectInputStream(InputStream in) 将当前创建的对象输入流链接在指定的输入流上 方法 Object readObject() 进行对象反序列化并返回。该方法会从当前对象输入流链接的流中读取若干…...

问界M7是不是换壳东风ix7? 这下有答案了

文 | AUTO芯 作者 | 谦行 终于真相大白了 黑子们出来挨打啊 问界M7是换壳的东风ix7&#xff1f; 你们没想到&#xff0c;余大嘴会亲自出来正面回应吧 瞧瞧黑子当时乐的 问界你可以啊&#xff01;靠改名字造车呢&#xff1f; 还有更过分的&#xff0c;说M7是东风小康ix7…...

mybatis多条件in查询拓展

背景 最近碰上有个业务&#xff0c;查询的sql如下&#xff1a; select * from table where (sku_id,batch_no) in ((#{skuId},#{batchNo}),...); 本来也没什么&#xff0c;很简单常见的一种sql。问题是我们使用的是mybatis-plus&#xff0c;然后写的时候又没有考虑到后面的查…...

<Rust><iced>基于rust使用iced构建GUI实例:一个CRC16校验码生成工具

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第五篇实例,是一个CRC16校验码转换程序。 本篇内容: 1、CRC16校验码生成 代码介绍 本文的crc16校验码生成工具,主要设计两个方面,一个是crc16 modbus…...

动态规划与0/1背包问题:深入解析

目录 一、动态规划简介 二、0/1背包问题概述 三、动态规划解决0/1背包问题 1. 定义子问题 2. 确定状态 3. 初始条件和边界情况 4. 计算最终结果 5. 代码实现 6. 空间优化 四、例题讲解 例题1&#xff1a;基础例题 例题2&#xff1a;路径恢复 例题3&#xff1a;扩展…...

Python爬虫:下载人生格言

Python爬虫:下载人生格言 爬取网页 将这些格言下载存储到本地 代码: import requests #导入requests库&#xff0c;用于提取网页 from lxml import etree#导入lxml库&#xff0c;用于Xpath数据解析#请求头 header{ user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) A…...

使用注意力机制的seq2seq

一、背景 1、机器翻译中&#xff0c;每个生成的词可能相关于源句子中不同的词&#xff0c;但是之前用的是最后一个RNN层出来的context。 2、加入注意力 &#xff08;1&#xff09;假设输入序列中有&#x1d447;个词元&#xff0c; 解码时间步&#x1d461;′的上下文变量是…...

wordpress post id/深圳网站建设推广

>0️⃣python数据结构与算法学习路线 >学习内容&#xff1a; >- 基本算法&#xff1a;枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等... >- 数据结构&#xff1a;字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组…...

帮诈骗公司做网站/拓客软件哪个好用

T3用友通销售发货单审核时提示“xx单据审核失败&#xff0c;保存失败”T3用友通销售发货单审核时提示“xx单据审核失败&#xff0c;保存失败”在销售发货单审核时&#xff0c;系统提示“xx单据审核失败&#xff0c;单据体保存失败。vouchtype表有问题。vouchtype表有问题&#…...

怎样做恶搞网站/上海推广外包

1. collections模块collections模块主要封装了⼀些关于集合类的相关操作. 比如, 我们学过的Iterable,Iterator等等. 除了这些以外, collections还提供了⼀些除了基本数据类型以外的数据集合类型. Counter, deque, OrderedDict, defaultdict以及namedtuple class Animal:passfr…...

怎么在服务器中安装WordPress/南京seo优化推广

我们在做接口测试时&#xff0c;除了常见的http接口&#xff0c;还有一种比较多见&#xff0c;就是socket接口&#xff0c;今天讲解下怎么用Python进行websocket接口测试。现在大多数用的都是websocket&#xff0c;那我们就先来安装一下websocket的安装包。pip install websock…...

做网站的服务器哪个系统好/泾县网站seo优化排名

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//将整个棋盘算出并储存到缓冲器&#xff0c;然后调用Display函数显示出来{int i,j;//循环变量wl0;wp0;for(j0;j<MAXIMUS;j)//写入出交点左上角的字符&#xff0c;因为需要打印棋盘右下角&#xff0c;所以很以横纵各多一次循环{…...

it培训机构怎么样/东莞seo推广机构帖子

MTK_4G平台MT6169射频开关RF_Switch对照表...