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 部署流程
-
开发者首先创建并编辑chart的配置;
-
接着打包并发布至Helm的仓库(Repository);
-
当管理员使用helm命令安装时,相关的依赖会从仓库下载;
-
接着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.Name | release名称 |
Release.Namespace | release命名空间 |
Release.Revision | release版本号。起始是1,每次升级或回滚都会自增1 |
Release.Service | release 服务的名称 |
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描述的主文件 |
templates | Kubernetes 资源定义为模板的目录 |
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
-
修改配置文件
-
编辑自描述文件 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" # 修改 镜像版本
-
编辑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
更新
-
编辑自描述文件 Chart.yaml , 修改version和appVersion信息
-
重新打包
-
检查语法
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 返回 题目 要解决这个问题,可以使用双指针方法进行原地修改,以确保每个元素最多出现两次。 一、python代码 1.1…...

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

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

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

《电视技术》是什么级别的期刊?是正规期刊吗?能评职称吗?
问题解答 问:《电视技术》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《电视技术》级别? 答:国家级。主管单位:中国电子科技集团公司 主办单位ÿ…...
网络编程 --------- 2、socket网络编程接口
1、什么是socket 套接字 socke套接字是一个编程的接口 (网络编程的接口)、是一种特殊的文件描述符 (read/write),不局限于TCP/IP 。socket是独立于具体协议的网络编程接口这个接口是位于 应用层和传输层之间 。 类型: (1)流式套接字 SOCK_ST…...
C# Deconstruct详解
总目录 前言 该文来源于探索弃元的使用,由弃元了解到元组,由元组又了解到解构方法Deconstruct。 另外本文中 解构和析构一个意思,不要在意! 一、Deconstruct是什么? 1. 关于元组 如果我们想了解Deconstruct 的使用&…...
Java 面试常见问题之——为什么重写equals时必须重写hashCode方法
Java 面试常见问题之——为什么重写equals时必须重写hashCode方法 当重写 equals 方法时,通常也应该重写 hashCode 方法,原因主要有以下几点: 一致性原则:根据 Java 的约定,如果两个对象通过 equals 方法比较返回 tr…...
后端给的树形结构 递归 改造成阶联选择器所需要的lable、value结构
赋值:this.newTreeData this.renameFields(this.treeData) 递归方法:renameFields (tree) {return tree.map(node > {// 创建一个新对象来存放修改后的字段名const newNode {value: node.id,label: node.title,// 如果有子节点,则递归处理…...

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

Python文献调研(四)QtDesigner的布局
一、新建项目: 1.打开pycharm,新建一个Python项目 (1)右键项目列表区,找到我们之前配置好的外部工具,点击Pyside6 QtDesigner 打开Qt Designer后会是这个界面: (2)此时…...

CentOS Linux release 7.9.2009 中sudo命令未找到
先在 Windows 环境中下载 sudo 的安装包 下载安装包:https://www.sudo.ws/releases/stable/ 然后把安装包拷贝的 Centos 中,cd 进入安装包所在的目录执行下面的命令: 格式:rpm -Uhv xxxxx.rpm rpm -Uhv sudo-logsrvd-1.9.15-6.…...

生产计划问题的不同最优化工具软件求解
一、优化求解软件简介 众所周知,常用的优化工具软件有Lingo、Mathcad和MATLAB。 1. LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.&…...

Java关键字及保留字总结
文章目录 Java关键字及保留字总结(按首字母字母顺序所排列)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 各个小版本的详细分析,包括每个版本的主要变化、修复的 bug 和潜在的问题: PostgreSQL 14.0 发布日期:2021 年 9 月 30 日 主要变化: 增加了并行查询的改进,提升了性能。增强了 JSON 数据类…...
B树在数据库中的应用:理论与实践
B树在数据库中的应用:理论与实践 B树(B-tree)是一种自平衡的树数据结构,广泛应用于数据库系统中,特别是用于实现索引和文件系统中的关键字查找。B树的设计目标是保持数据有序并允许高效的查找、插入和删除操作。本文将…...
网络编程 -------- 3、TCP_UDP_UNIX
1、基于TCP的套接字编程流程 Server.c socket bind (服务器的ip端口) listen accept recv / send close Client.c socket connect (服务器的ip端口) …...

口袋奇兵:游戏辅助教程!陆军搭配阵容推荐,平民必备!
《口袋奇兵》是一款策略类手游,玩家需要在游戏中组建和指挥自己的军队,进行各种战斗和任务。为了在游戏中取得更好的成绩,合理搭配英雄和使用辅助工具是非常重要的。本攻略将为大家介绍一种强力的陆军搭配阵容,以及如何利用VMOS云…...
Spring Boot 集成参数效验 Validator
为什么需要参数效验? 在业务开发中,为了防止非法参数对业务造成影响,所以需要对用户输入的正确性、数据完整性、安全性、业务规则的执行做效验,靠代码对接口参数做if判断的话就太繁琐了,代码冗余且可读性差(主要是不够优雅)。 Validator效验框架遵循了JSR-303验证规范…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...

数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...