目录
一、Helm 介绍
1、 1Helm是什么;
1、 2Helm解决了什么痛点;
1、 3Helm相关组件及概念;
1、 4Helmv3版本变化;
1、 5总结;
二、安装 Helm
2、 1下载Helm;
2、 2安装Helm;
2、 3配置国内存放chart仓库的地址;
三、Helm 基本使用
3、 1搜索和下载Chart;
3、 2部署chart;
3、 3release相关操作;
四、自定义 Chart 模板
4、 1自定义一个Chart;
4、 2Chart.yaml编写规则;
4、 3go模板文件渲染;
4、 4values.yaml文件编写;
4、 5部署release;
五、Helm 语法
5、 1_helpers.tpl;
5、 2内置对象;
5、 3变量;
5、 4include;
5、 5with;
5、 6toYaml转yaml;
5、 7Values对象;
5、 8管道;
六、Helm 常用命令演示
6、 1检查values语法格式;
6、 2upgrade升级release;
6、 3回滚release;
6、 4打包Chart;
一、Helm 介绍
- Helm 官网:Helm | Docs
- helm 官方的 chart 站点:Kubeapps | Home
1.1 Helm 是什么
Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使⽤的 apt、Centos 中使⽤的 yum 或者 Python 中的 pip ⼀样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成,能够将⼀组 K8S 资源打包统⼀管理,是查找、共享和使⽤为Kubernetes 构建的软件的最佳⽅式。
1.2 Helm 解决了什么痛点
在Kubernetes中部署⼀个可以使⽤的应⽤,需要涉及到很多的 Kubernetes 资源的共同协作。⽐如你安装⼀个 WordPress 博客,⽤到了⼀些 Kubernetes (下⾯全部简称 k8s)的⼀些资源对象,包括 Deployment ⽤于部署应⽤、Service 提供服务发现、Secret 配置 WordPress 的⽤户名和密码,可能还需要 pv 和 pvc 来提供持久化服务。并且 WordPress 数据是存储在 mariadb ⾥⾯的,所以需要 mariadb 启动就绪后才能启动 WordPress。这些 k8s 资源过于分散,不⽅便进⾏管理,直接通过 kubectl 来管理⼀个应⽤,你会发现这⼗分蛋疼。
所以总结以上,我们在 k8s 中部署⼀个应⽤,通常⾯临以下⼏个问题:
- 如何统⼀管理、配置和更新这些分散的 k8s 的应⽤资源⽂件;
- 如何分发和复⽤⼀套应⽤模板;
- 如何将应⽤的⼀系列资源当做⼀个软件包管理。
Helm 的首要目标一直是让“从零到 Kubernetes”变得轻松。无论是运维、开发人员、经验丰富的 DevOps工程师,还是刚刚入门的学生,Helm的目标是让大家在两分钟内就可以在 Kubernetes 上安装应用程序。
Helm 可以解决的问题:运维人员写好资源文件模板,交给开发人员填写参数即可!
1.3 Helm 相关组件及概念
注意:Helm V3 已废弃 Tiller组件!了解即可!
Helm(Helm V2)包含两个组件,分别是 helm 客户端 和 Tiller 服务器:
- Helm:命令行客户端工具,主要用于 Kubernetes 应用中的 chart 的创建、打包、发布和管理。
- Tiller(v3 已废除):Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来⽣成⼀个release 并管理 release
- Chart:helm 程序包,即 Helm 的打包格式叫做 chart。一系列用于描述 k8s 资源相关文件的集合,比方说我们部署 nginx,需要 deployment 的 yaml,需要 service 的yaml,这两个清单文件就是一个 helm 程序包,在k8s 中把这些 yaml 清单文件叫做 chart 图表。所谓 chart 就是⼀系列⽂件, 它描述了⼀组相关的 k8s 集群资源。
- Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在 k8s 中创建出真实运行的资源对象。即使⽤ helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。
- Repoistory:Helm chart 的仓库,提供部署 k8s 应用程序需要的那些 yaml 清单文件,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引⽂件和压缩包。
- vlues.yaml 文件:为模板中的文件赋值,可以实现我们自定义安装。如果是 chart 开发者需要自定义模板,如果是 chart 使用者只需要修改 values.yaml 即可。
- chart ---> 通过 values.yaml 这个文件赋值 --> 生成 release 实例
1.4 Helm v3 版本变化
2019 年 11 月 13 日,Helm 团队发布 Helm v3 的第一个稳定版本。
该版本主要变化如下:
1、 Helm服务端Tiller被删除;
2、 Release名称可以在不同命名空间重用;
3、 支持将Chart推送至Docker镜像仓库中;
4、 使用JSONSchema验证chartvalues;
1.5 总结
helm 把 kubernetes 资源打包到一个 chart 中,制作并完成各个 chart 和 chart 本身依赖关系并利用 chart 仓库实现对外分发,而 helm 还可通过 values.yaml 文件完成可配置的发布,如果chart 版本更新了,helm 自动支持滚更更新机制,还可以一键回滚,但是不是适合在生产环境使用,除非具有定义自制 chart 的能力。
二、安装 Helm
K8s版本支持的各个 helm 版本对照表:Helm | Helm版本支持策略
Helm 安装官方文档:Helm | 安装Helm
2.1 下载 Helm
Helm 下载地址:Releases * helm/helm * GitHub
因为我们这次的 k8s 版本为 1.23.x,所以此次下载 Helm v3.10.3 版本即可!
2.2 安装 Helm
[root@k8s-master1 ~]# ls
anaconda-ks.cfg helm-v3.10.3-linux-amd64.tar.gz
[root@k8s-master1 ~]# tar -zxvf helm-v3.10.3-linux-amd64.tar.gz
[root@k8s-master1 ~]# mv linux-amd64/helm /usr/local/bin/
[root@k8s-master1 ~]# helm version
version.BuildInfo{Version:"v3.10.3", GitCommit:"835b7334cfe2e5e27870ab3ed4135f136eecc704", GitTreeState:"clean", GoVersion:"go1.18.9"}
# 设置 helm 自动补全命令
[root@k8s-master1 ~]# helm completion bash > /etc/bash_completion.d/helm
[root@k8s-master1 ~]# bash
2.3 配置国内存放 chart 仓库的地址
官方Chart GitHub 地址:GitHub - bitnami/charts: Bitnami Helm Charts
# 添加官方的 chart 仓库:
[root@k8s-master1 ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
# 添加阿里云的 chart 仓库:
[root@k8s-master1 ~]# helm repo add ali-stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"ali-stable" has been added to your repositories
# 查看 repo 列表
[root@k8s-master1 ~]# helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
ali-stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新 chart 仓库
[root@k8s-master1 ~]# helm repo update
# 删除 chart 仓库地址(不用操作,了解即可)
helm repo remove ali-stable
三、Helm 基本使用
3.1 搜索和下载 Chart
# 搜索 nginx 的 chart 包
[root@k8s-master1 ~]# helm search repo nginx
NAME CHART VERSION APP VERSION DESCRIPTION
ali-stable/nginx-ingress 0.9.5 0.10.2 An nginx Ingress controller that uses ConfigMap...
ali-stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
bitnami/nginx 13.2.27 1.23.3 NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller 9.3.30 1.6.4 NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel 2.1.15 0.4.9 DEPRECATED NGINX Open Source for Intel is a lig...
ali-stable/gcloud-endpoints 0.1.0 Develop, deploy, protect and monitor your APIs ...
# 搜索指定阿里云 chart 仓库中的 memcached
[root@k8s-master1 ~]# helm search repo ali-stable | grep memcached
ali-stable/mcrouter 0.1.0 0.36.0 Mcrouter is a memcached protocol router for sca...
ali-stable/memcached 2.0.1 Free & open source, high-performance, distribut...
# 查看 chart 信息
[root@k8s-master1 ~]# helm show chart ali-stable/memcached
# 下载 chart 包到本地
[root@k8s-master1 ~]# helm pull ali-stable/memcached
[root@k8s-master1 ~]# ls
anaconda-ks.cfg helm-v3.10.3-linux-amd64.tar.gz linux-amd64 memcached-2.0.1.tgz
[root@k8s-master1 ~]# tar -zxvf memcached-2.0.1.tgz
[root@k8s-master1 ~]# tree memcached
memcached
*** Chart.yaml # chart 的基本信息,包括版本名字之类
*** README.md
*** templates # 存放 k8s 的部署资源模板,通过渲染变量得到部署文件
*** *** _helpers.tpl # 存放能够复用的模板(也叫自定义模板)
*** *** NOTES.txt # 为用户提供一个关于 chart 部署后使用说明的文件
*** *** pdb.yaml
*** *** statefulset.yaml
*** *** svc.yaml
*** values.yaml # 配置全局变量或参数,templates 下的文件可以调用
3.2 部署 chart
安装memcached 的 Chart:
[root@k8s-master1 ~]# cd memcached/
# 修改 yaml 文件(因为这个 mecached 版本比较老,需要做些修改才能运行)
[root@k8s-master1 ~/memcached]# vim templates/statefulset.yaml
apiVersion: apps/v1 # 修改 apiVersion 后面的 value 值变成 apps/v1
kind: StatefulSet
metadata:
name: {
{ template "memcached.fullname" . }}
labels:
app: {
{ template "memcached.fullname" . }}
chart: "{
{ .Chart.Name }}-{
{ .Chart.Version }}"
release: "{
{ .Release.Name }}"
heritage: "{
{ .Release.Service }}"
spec: # spec 下添加 selector 字段
selector:
matchLabels:
app: {
{ template "memcached.fullname" . }}
chart: "{
{ .Chart.Name }}-{
{ .Chart.Version }}"
release: "{
{ .Release.Name }}"
heritage: "{
{ .Release.Service }}"
serviceName: {
{ template "memcached.fullname" . }}
replicas: {
{ .Values.replicaCount }}
*****
删除affinity 亲和性配置:
# 当前目录安装
[root@k8s-master1 ~/memcached]# helm install memcached .
# 指定 chart 安装
helm install memcached ali-stable/memcached
[root@k8s-master1 ~/memcached]# kubectl get pods
NAME READY STATUS RESTARTS AGE
memcached-memcached-0 1/1 Running 0 119s
memcached-memcached-1 1/1 Running 0 69s
memcached-memcached-2 1/1 Running 0 19s
# 测试 memecached 服务是否正常:
[root@k8s-master1 ~/memcached]# yum install -y nc
[root@k8s-master1 ~/memcached]# export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached-memcached" -o jsonpath="{.items[0].metadata.name}")
[root@k8s-master1 ~/memcached]# kubectl port-forward $POD_NAME 11211
# 新开另一个终端
[root@k8s-master1 ~/memcached]# echo -e 'set mykey 0 60 5\r\nhello\r' | nc localhost 11211
STORED
release 服务正常!!!
3.3 release 相关操作
# 查看 release 发布状态
[root@k8s-master1 ~/memcached]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
memcached default 1 2023-02-20 21:17:48.767757778 +0800 CST deployed memcached-2.0.1
# 删除 release
[root@k8s-master1 ~/memcached]# helm delete memcached
# 删除 release 会把 release 下对应的资源也删除
[root@k8s-master1 ~/memcached]# kubectl get pods
No resources found in default namespace.
memecached 的 pod 也被删除了!
四、自定义 Chart 模板
Chart 模板指南:Helm | 从这里开始吧
4.1 自定义一个 Chart
当我们安装好 helm 之后我们可以开始自定义 chart,那么我们需要先创建出一个模板如下:
[root@k8s-master1 ~]# helm create myapp
[root@k8s-master1 ~]# tree myapp
myapp
*** 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 模板生成部署文件
4.2 Chart.yaml 编写规则
[root@k8s-master1 ~]# cd myapp/
[root@k8s-master1 ~/myapp]# vim Chart.yaml
apiVersion: v2
name: myapp
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
解释说明:
Chart.yaml 文件主要用来描述对应 chart 的相关属性信息,其中 apiVersion 字段用于描述对应 chart 使用的 api 版本,默认是 v2 版本;name 字段用于描述对应 chart 的名称;description 字段用于描述对应 chart 的说明简介;type 字段用户描述对应 chart 是应用程序还是库文件,应用程序类型的 chart,它可以运行为一个 release,但库类型的 chart 不能运行为 release,它只能作为依赖被 application 类型的 chart 所使用;version 字段用于描述对应 chart 版本;appVersion 字段用于描述对应 chart 内部程序的版本信息。
4.3 go 模板文件渲染
[root@k8s-master1 ~/myapp]# vim 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: {
{ .Values.service.port }}
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 }}
解释:
该部署清单模板文件,主要用 go 模板语言来写的,其中 { { include "myapp.fullname" . }} 就表示取 myapp 的全名;{ { .Values.image.repository }} 这段代码表示读取当前目录下的 values 文件中的 image.repository 字段的值;{ { .Values.image.tag | default .Chart.AppVersion }} 表示对于 values 文件中 image.tag 的值或者读取 default.chart 文件中的 AppVersion 字段的值;nindent 4:表示首行缩进 4 个字母;TRUNC(NUMBER)表示截断数字。
简单讲go模板就是应用对应 go 模板语法来定义关属性的的值,一般都是从 values.yaml 文件中加载对应字段的值作为模板文件相关属性的值。
4.4 values.yaml 文件编写
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
tag: ""
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
create: true
annotations: {}
name: ""
podAnnotations: {}
podSecurityContext: {}
securityContext: {}
service:
type: ClusterIP
port: 80
ingress:
enabled: false
className: ""
annotations: {}
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
resources: {}
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
解释:
比如我们要引用 values.yaml 文件中的 image 字段下的 tag 字段的值,我们可以在模板文件中写成 { { .Values.image.tag }};如果在命令行使用 --set 选项来应用我们可以写成 image.tag;修改对应的值可以直接编辑对应 values.yaml 文件中对应字段的值,也可以直接使用 --set 指定对应字段的对应值即可;默认情况在命令行使用 --set 选项给出的值,都会直接被替换,没有给定的值,默认还是使用 values.yaml 文件中给定的默认值。
4.5 部署 release
[root@k8s-master1 ~/myapp]# helm install myapp .
[root@k8s-master1 ~/myapp]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-7d7647cfcc-pkbsw 1/1 Running 0 52s
[root@k8s-master1 ~/myapp]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myapp default 1 2023-02-21 10:58:43.315274539 +0800 CST deployed myapp-0.1.0 1.16.0
五、Helm 语法
Helm templates 中的语法官方文档:Helm | 模板函数列表
5.1 _helpers.tpl
在chart 中以 “下划线” 开头的文件,称为”子模版”。例如在 _helper.tpl 中定义子模块,格式:{ {- define "模版名字" -}} 模版内容 { {- end -}}
{
{- define "nginx.name" -}}
{
{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{
{- end -}}
# 若 .Values.nameOverride 为空,则默认值为 .Chart.Name
引用模板,格式:{ { include "模版名字" 作用域}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {
{ include "nginx.fullname" . }}
5.2 内置对象
Build-in Objects: Helm | Built-in Objects
Chart 预定义对象可直接在各模板中使用。
Release: # 代表 Release 对象,属性包含:Release.Name、Release.Namespace、Release.Revision等
Values: # 表示 values.yaml 文件数据
Chart: # 表示 Chart.yaml 数据
Files: # 用于访问 chart 中非标准文件
Capabilities: # 用于获取 k8s 集群的一些信息
- Capabilities.KubeVersion.Major:K8s的主版本
Template: # 表示当前被执行的模板
- Name: # 表示模板名,如:myapp/templates/deployment.yaml
- BasePath:# 表示路径,如:myapp/templates
5.3 变量
默认情况点( . ), 代表全局作用域,用于引用全局对象。
helm 全局作用域中有两个重要的全局对象:Values 和 Release
# Values
# 这里引用了全局作用域下的 Values 对象中的 key 属性。
{
{ .Values.key }}
# Values 代表的就是 values.yaml 定义的参数,通过 .Values 可以引用任意参数。
# 例子:
{
{ .Values.replicaCount }}
# 引用嵌套对象例子,跟引用 json 嵌套对象类似
{
{ .Values.image.repository }}
# Release
# 其代表一次应用发布,下面是 Release 对象包含的属性字段:
Release.Name - release 的名字,一般通过 Chart.yaml 定义,或者通过 helm 命令在安装应用的时候指定。
Release.Time - release 安装时间
Release.Namespace - k8s 名字空间
Release.Revision - release 版本号,是一个递增值,每次更新都会加一
Release.IsUpgrade - true 代表当前 release 是一次更新.
Release.IsInstall - true 代表当前 release 是一次安装
Release.Service: - The service that is rendering the present template. On Helm, this is always Helm.
自定义模版变量。
# 变量名以 $ 开始命名, 赋值运算符是 := (冒号+等号)
{
{- $relname := .Release.Name -}}
# 引用自定义变量:
# 不需要 . 引用
{
{ $relname }}
5.4 include
# include 是一个函数,所以他的输出结果是可以传给其他函数的
# 例子 1:
env:
{
{- include "xiaomage" . }}
# 结果:
env:
- name: name
value: xiaomage
- name: age
value: secret
- name: favourite
value: "Cloud Native DevSecOps"
- name: wechat
value: majinghe11
# 例子 2:
env:
{
{- include "xiaomage" . | indent 8}}
# 结果:
env:
- name: name
value: xiaomage
- name: age
value: secret
- name: favourite
value: "Cloud Native DevSecOps"
- name: wechat
value: majinghe11
5.5 with
with 关键字可以控制变量的作用域,主要就是用来修改 . 作用域的,默认 . 代表全局作用域,with 语句可以修改 . 的含义
# 例子:
# .Values.favorite 是一个 object 类型
{
{- with .Values.favorite }}
drink: {
{ .drink | default "tea" | quote }} # 相当于.Values.favorite.drink
food: {
{ .food | upper | quote }}
{
{- end }}
5.6 toYaml 转 yaml
将数据转为 yaml 格式。
spec:
strategy:
{
{ toYaml .Values.strategy | indent 4 }}
------------------------------------------------------------------
values.yaml 数据:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
------------------------------------------------------------------
渲染效果:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
5.7 Values 对象
values 对象的值有四个来源:
1、 chart包中的values.yaml文件;
2、 父chart包的values.yaml文件;
3、 使用helminstall或者helmupgrade的-f或者--values参数传入的自定义的yaml文件;
4、 通过--set参数传入的值;
cat global.yaml
course: k8s
cat mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
course: {
{ .Values.course }}
helm install --name mychart --dry-run --debug -f global.yaml ./mychart/
helm install --name mychart --dry-run --debug --set course="k8s" ./mychart/
# 运行部分结果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
course: k8s
# 编辑 mychart/values.yaml,在最后加入
course:
k8s: klvchen
python: lily
cat mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
k8s: {
{ quote .Values.course.k8s }} # quote 叫双引号
python: {
{ .Values.course.python }}
helm install --name mychart --dry-run --debug ./mychart/
# 运行结果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
k8s: "klvchen"
python: lily
5.8 管道
k8s: {
{ quote .Values.course.k8s }} # 加双引号
k8s: {
{ .Values.course.k8s | upper | quote }} # 大写字符串加双引号
k8s: {
{ .Values.course.k8s | repeat 3 | quote }} # 加双引号和重复 3 次字符串
六、Helm 常用命令演示
Helm 命令大全:Helm | Helm
6.1 检查 values 语法格式
helm lint
验证chart 是否存在问题
简介
该命令使用一个 chart 路径并运行一系列的测试来验证 chart 的格式是否正确。
如果遇到引起 chart 安装失败的情况,会触发 [ERROR] 信息,如果遇到违反惯例或建议的问题,会触发 [WARNING]。
helm lint PATH [flags]
实践:
[root@k8s-master1 ~/myapp]# helm lint /root/myapp/
==> Linting /root/myapp/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
6.2 upgrade 升级 release
helm upgrade
升级版本
简介
该命令将发布升级到新版的 chart。
升级参数必须是发布和 chart。chart 参数可以是:chart 引用('example/mariadb'),chart 目录路径,打包的 chart 或者完整 URL。 对于 chart 引用,除非使用'--version'参数指定,否则会使用最新版本。
要在chart 中重写 value,需要使用'--values'参数并传一个文件或者从命令行使用'--set'参数传个配置, 要强制字符串值,使用'--set-string'。当值本身对于命令行太长或者是动态生成的时候,可以使用 '--set-file' 设置独立的值。 也可以在命令行使用'--set-json'参数设置 json 值(scalars/objects/arrays)。
可以多次指定'--values'/'-f'参数,最后(最右边)指定的文件优先级最高。比如如果myvalues.yaml 和 override.yaml 同时包含了名为 'Test'的 key,override.yaml 中的设置会优先使用:
helm upgrade -f myvalues.yaml -f override.yaml redis ./redis
可以多次指定'--set'参数,最后(最右边)指定的优先级最高。比如'bar' 和 'newbar'都设置了一个名为'foo'的可以, 'newbar'的值会优先使用:
helm upgrade --set foo=bar --set foo=newbar redis ./redis
实践:
[root@k8s-master1 ~/myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42d
myapp ClusterIP 10.98.112.104 <none> 80/TCP 156m
[root@k8s-master1 ~/myapp]# helm upgrade --set service.type="NodePort" myapp .
[root@k8s-master1 ~/myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42d
myapp NodePort 10.98.112.104 <none> 80:30575/TCP 3h20m
6.3 回滚 release
helm rollback
回滚发布到上一个版本
简介
该命令回滚发布到上一个版本
回滚命令的第一个参数是发布的名称,第二是修订(版本)号,如果省略此参数,会回滚到上一个版本。
要查看修订号,执行 'helm history RELEASE'。
helm rollback <RELEASE> [REVISION] [flags]
实践:
# 查看历史版本
[root@k8s-master1 ~/myapp]# helm history myapp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Tue Feb 21 10:58:43 2023 superseded myapp-0.1.0 1.16.0 Install complete
2 Tue Feb 21 14:18:59 2023 deployed myapp-0.1.0 1.16.0 Upgrade complete
# 把 myapp 回滚到版本 1
[root@k8s-master1 ~/myapp]# helm rollback myapp 1
Rollback was a success! Happy Helming!
# 可以看到 service 已经完成回滚了
[root@k8s-master1 ~/myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 42d
myapp ClusterIP 10.98.112.104 <none> 80/TCP 3h23m
6.4 打包 Chart
helm package
将chart 目录打包到 chart 归档中
简介
该命令将 chart 打包成一个 chart 版本包文件。如果给定路径,就会在该路径中查找 chart(必须包含 Chart.yaml 文件)然后将目录打包。
chart 版本包会用于 Helm 包仓库。
要签名一个 chart,使用'--sign'参数,在大多数场景中,也要提供'--keyring path/to/secret/keys'和'--key keyname'。
$helm package --sign ./mychart --key mykey --keyring ~/.gnupg/secring.gpg
如果'--keyring'未指定,除非配置了其他方式,不然 Helm 通常会指定公共秘钥环。
helm package [CHART_PATH] [...] [flags]
实践:
[root@k8s-master1 ~/myapp]# helm package /root/myapp/
Successfully packaged chart and saved it to: /root/myapp/myapp-0.1.0.tgz
[root@k8s-master1 ~/myapp]# ls
charts Chart.yaml myapp-0.1.0.tgz templates values.yaml
上一篇文章:【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(下)_Stars.Sky的博客-CSDN博客
下一篇文章:【Kubernetes 企业项目实战】09、Rancher 2.6 管理 k8s-v1.23 及以上版本高可用集群_Stars.Sky的博客-CSDN博客