目录
文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘
链接:https://pan.baidu.com/s/1YFf-vPYuwRQiL9HR6gcP7Q
提取码:qj3o
1、Helm介绍
官网:Helm | Docs
helm 官方的chart站点:
Helm是kubernetes的包管理工具,相当于linux环境下的yum/apt-get命令。
Helm的首要目标一直是让“从零到Kubernetes”变得轻松。无论是运维、开发人员、经验丰富的DevOps工程师,还是刚刚入门的学生,Helm的目标是让大家在两分钟内就可以在Kubernetes上安装应用程序。
Helm可以解决的问题:运维人员写好资源文件模板
交给开发人员填写参数即可
(1)helm:命令行客户端工具,主要用于Kubernetes应用中的chart的创建、打包、发布和管理。
(2)Chart:helm程序包,一系列用于描述k8s资源相关文件的集合,比方说我们部署nginx,需要deployment的yaml,需要service的yaml,这两个清单文件就是一个helm程序包,在k8s中把这些yaml清单文件叫做chart图表。
2、Helm v3版本变化
2019年11月13日,Helm团队发布Helmv3的第一个稳定版本。
该版本主要变化如下:
架构变化:
1、Helm服务端Tiller被删除
该版本主要变化如下:
架构变化:
1、Helm服务端Tiller被删除
3、安装Helm v3
下载地址:
https://github.com/helm/helm/releases
K8s版本支持的各个helm版本对照表:
Helm | Helm版本支持策略Helm | Helm版本支持策略描述Helm的补丁发布策略,以及Helm和Kubernetes之间支持的最大版本偏差https://helm.sh/zh/docs/topics/version_skew/
[root@xianchaomaster1~]# tar zxvf helm-v3.12.3-linux-amd64.tar.gz
[root@xianchaomaster1 ~]# mv linux-amd64/helm /bin/
[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文件解释说明:
- {{- if not .Values.autoscaling.enabled }}: 这是一个 Helm 模板的条件语句。它会检查 .Values.autoscaling.enabled 参数是否为假(即未启用自动扩展),如果条件为真,则执行下面的代码块。not 关键字用于取反,所以 not .Values.autoscaling.enabled 表示如果自动扩展没有启用。
- replicas: {{ .Values.replicaCount }}: 这行代码位于条件语句的代码块内。它设置 Deployment 的副本数。.Values.replicaCount 是从 Helm 的 values 文件中获取的副本数配置参数的值。这个值会被插入到模板中,作为 Deployment 的副本数。
所以,如果 autoscaling.enabled 参数没有启用(即为假),那么 Deployment 的副本数将会使用配置文件中定义的 .Values.replicaCount 参数的值来设置。如果启用了自动扩展,则不会应用这个副本数设置,而是由自动扩展机制根据负载动态调整副本数。
- {{- with .Values.podAnnotations }}: 这是一个 Helm 模板的条件语句。它检查 .Values.podAnnotations 参数是否存在(非空),如果条件为真,则执行下面的代码块。这意味着只有当有 Pod 注解需要添加时,才会执行这段代码。
- annotations:: 这行代码表示在 Pod 模板的元数据部分中定义注解。
- {{- 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 }}
- {{/* ... */}}: 这是 Helm 模板中的注释标记,用于添加注释,其中 /* ... */ 之间的内容会被视为注释,不会对模板执行产生影响。
- {{- define "myapp.name" -}}: 这里使用 define 定义了一个名为 "myapp.name" 的模板函数。它意味着我们正在创建一个可以在其他模板中调用的函数,并且函数名是 "myapp.name"。
- {{- 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 "-": 如果名称末尾有 - 符号,则会将其删除。
- {{- 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 }}
- 备注:{{/* ... */}}: 这是 Helm 模板中的注释标记,用于添加注释,其中 /* ... */ 之间的内容会被视为注释,不会对模板执行产生影响。
- {{- define "myapp.fullname" -}}: 这里使用 define 定义了一个名为 "myapp.fullname" 的模板函数,它将用于生成完整的应用名称。
- {{- if .Values.fullnameOverride }}: 这里使用 if 语句检查是否在 Helm 部署时提供了 .Values.fullnameOverride。如果提供了,将会使用这个值来覆盖生成的应用名称。
- {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}: 如果提供了 .Values.fullnameOverride,那么它将作为应用名称。但是,会通过 trunc 将名称截断为不超过 63 个字符,并使用 trimSuffix "-" 删除末尾的 - 符号。
- {{- $name := default .Chart.Name .Values.nameOverride }}: 如果没有提供 .Values.fullnameOverride,那么将使用 .Chart.Name 作为默认的名称。
- {{- if contains $name .Release.Name }}: 这一部分检查 .Release.Name 是否包含在名称中,如果包含,说明 .Release.Name 已经在名称中,不需要重复添加。
- {{- .Release.Name | trunc 63 | trimSuffix "-" }}: 如果 .Release.Name 已经在名称中,就直接使用 .Release.Name 作为完整名称。同样,会通过 trunc 和 trimSuffix "-" 对名称进行处理。
- {{- else }}: 如果 .Release.Name 不包含在名称中,就使用 .Release.Name 和 $name 的组合来生成一个完整的名称,确保不超过 63 个字符。
- {{- 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 }}
备注:
- {{/* ... */}}: 这是 Helm 模板中的注释标记,用于添加注释,其中 /* ... */ 之间的内容会被视为注释,不会对模板执行产生影响。
- {{- define "myapp.chart" -}}: 这里使用 define 定义了一个名为 "myapp.chart" 的模板函数,它用于生成 Chart 的名称和版本的组合,作为一个通用的标签。
- {{- 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 }}
备注:
- {{/* Common labels */}}: 这是一个注释,指明下面的代码段用于生成通用标签。
- {{- define "myapp.labels" -}}: 这里使用 define 定义了一个名为 "myapp.labels" 的模板函数,用于生成一些通用的标签。
- helm.sh/chart: {{ include "myapp.chart" . }}: 这一行生成一个标签,将之前定义的 "myapp.chart" 模板函数的结果作为 helm.sh/chart 标签的值。这个标签用于标识所使用的 Helm Chart 的名称和版本。
- {{ include "myapp.selectorLabels" . }}: 这里通过 include 调用了名为 "myapp.selectorLabels" 的另一个模板函数,用于生成一些用于选择器标签(Selector Labels)的标签,包括应用名称和实例名称。这些标签有助于将资源归类并在 Kubernetes 中进行查询。
- {{- if .Chart.AppVersion }}: 这一行检查 .Chart.AppVersion 是否存在,如果存在则表示在 Chart 的 Chart.yaml 文件中定义了应用版本。
- app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}: 如果应用版本存在,这一行生成一个标签,将应用版本作为 app.kubernetes.io/version 标签的值,并使用 quote 函数将值引用起来。这个标签用于表示应用程序的版本。
- 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 }}
备注:
- {{/* Create the name of the service account to use */}}: 这是一个注释,用于说明下面的代码块是用来创建服务账户名称的。
- {{- define "myapp.serviceAccountName" -}}: 这行定义了一个名为 "myapp.serviceAccountName" 的模板函数,它将用于生成服务账户的名称。
- {{- if .Values.serviceAccount.create }}: 这行代码使用条件语句来检查是否应该创建服务账户。这里是根据用户在 Helm 部署过程中是否设置了 .Values.serviceAccount.create 来判断是否需要创建。
- {{- default (include "myapp.fullname" .) .Values.serviceAccount.name }}: 如果需要创建服务账户(即用户在 .Values.serviceAccount.create 中设置为 true),则生成的服务账户名称将是 myapp.fullname(应用的完整名称)作为一部分,然后根据用户提供的 .Values.serviceAccount.name 覆盖这一部分。如果用户没有提供 .Values.serviceAccount.name,则使用 myapp.fullname 作为服务账户名称的一部分。
- {{- else }}: 如果不需要创建服务账户,就会执行这部分。
- {{- default "default" .Values.serviceAccount.name }}: 这行代码将 .Values.serviceAccount.name 作为服务账户的名称。如果没有提供这个值,将使用默认值 "default"。
- {{- 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