17、简化K8s应用部署工具HelmV3入门到企业实战

目录

一、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 介绍

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博客