文章目录

  • 一、Chart 文件结构
  • 二、Chart 模版赋值
    • 2.1 通过values.yaml文件取值
    • 2.2 手动使用 --set 指定
    • 2.3 通过 -f 指定文件
  • 三、Chart 模版语法
    • 3.1 quote 函数
    • 3.2 管道
    • 3.3 default 函数
    • 3.4 indent 函数
    • 3.5 with
    • 3.6 变量
    • 3.7 if-else
  • 四、命名模板
  • 五、参考链接

一、Chart 文件结构

[root@harbor ~]# tree mychart/
mychart/                             # Chart 目录
├── charts                           # 这个 charts 依赖的其他 charts,始终被安装
├── Chart.yaml                       # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates                        # 模板目录
│   ├── deployment.yaml              # deployment 控制器的 Go 模板文件
│   ├── _helpers.tpl                 # 以 _ 开头的文件不会部署到 k8s 上,可用于定制通用信息
│   ├── hpa.yaml                     # hpa 的模板文件
│   ├── ingress.yaml                 # ingress 的模板文件
│   ├── NOTES.txt                    # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值
│   ├── serviceaccount.yaml          # serviceaccount 的 Go 模板文件
│   ├── service.yaml                 # service 的 Go 模板文件
│   └── tests                        # 测试pod目录
│       └── test-connection.yaml     # 测试pod的deployment文件
└── values.yaml                      # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件

二、Chart 模版赋值

该对象提供对传入 chart 的值的访问。其内容来自四个来源:

  • chart 中的 values.yaml 文件
  • 如果这是一个子 chart,来自父 chart 的 values.yaml 文件
  • value 文件通过 helm installhelm upgrade 的 - f 标志传入文件(helm install -f myvals.yaml ./mychart
  • 通过 --set(例如 helm install --set foo=bar ./mychart

上面的列表按照特定的顺序排列:values.yaml 在默认情况下,父级 chart 的可以覆盖该默认级别,而该 chart values.yaml 又可以被用户提供的 values 文件覆盖,而该文件又可以被 --set 参数覆盖。

2.1 通过values.yaml文件取值

创建 mychart

helm create mychart

编辑 values.yaml 文件。将 service.port 值改为 8888

···service:type: ClusterIPport: 8888
···

查看渲染前的 service.yaml 模版

apiVersion: v1
kind: Service
metadata:name: {{ include "mychart.fullname" . }}labels:{{- include "mychart.labels" . | nindent 4 }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpprotocol: TCPname: httpselector:{{- include "mychart.selectorLabels" . | nindent 4 }}

使用 --dry-run 命令只渲染模版,而不安装

helm install --dry-run demo mychart/

查看渲染后的 service.yaml 文件,可以看到 8888 已经被渲染进模版

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: ClusterIPports:- port: 8888targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

2.2 手动使用 --set 指定

注意--set 的值会覆盖 values.yaml 中预设的值

使用 --set 命令,将 service.port 值更改为 9999

helm install --set service.port=9999 --dry-run demo mychart/

查看渲染后的 service.yaml 文件,可以看到 9999 已经被渲染进模版

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: ClusterIPports:- port: 9999targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

2.3 通过 -f 指定文件

创建 demo.yaml 文件,内容如下

 service:type: ClusterIPport: 7777

通过指定 demo.yaml 文件渲染

···
helm install -f /root/demo.yaml --dry-run demo mychart/
···

查看渲染后的 service.yaml 文件,可以看到 7777 已经被渲染进模版,说明指定的文件会覆盖 values.yaml 中相同的参数。

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: ClusterIPports:- port: 7777targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

三、Chart 模版语法

3.1 quote 函数

当从 .Values 对象注入字符串到模板中时,我们引用这些字符串。我们可以通过调用 quote 模板指令中的函数来实现

apiVersion: v1
kind: Service
metadata:name: {{ include "mychart.fullname" . }}labels:{{- include "mychart.labels" . | nindent 4 }}
spec:type: {{ quote .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpprotocol: TCPname: httpselector:{{- include "mychart.selectorLabels" . | nindent 4 }}

渲染后的 service.yaml 文件

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: "ClusterIP"ports:- port: 8888targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

3.2 管道

模板语言的强大功能之一是其管道概念。利用 UNIX 的一个概念,管道是一个链接在一起的一系列模板命令的工具,以紧凑地表达一系列转换。换句话说,管道是按顺序完成几件事情的有效方式。

apiVersion: v1
kind: Service
metadata:name: {{ include "mychart.fullname" . }}labels:{{- include "mychart.labels" . | nindent 4 }}
spec:type: {{ .Values.service.type | upper |quote }}ports:- port: {{ .Values.service.port }}targetPort: httpprotocol: TCPname: httpselector:{{- include "mychart.selectorLabels" . | nindent 4 }}

渲染后的 service.yaml 文件

"ClusterIP" 已变成 "CLUSTERIP"

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: "CLUSTERIP"ports:- port: 8888targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

3.3 default 函数

经常使用的一个函数是 default:default DEFAULT_VALUE GIVEN_VALUE。该功能允许在模板内部指定默认值,以防该值被省略。
注释掉 values.yaml 文件中的port

···
service:type: ClusterIPport:
···

service.yaml 中的port默认值设为 9999

apiVersion: v1
kind: Service
metadata:name: {{ include "mychart.fullname" . }}labels:{{- include "mychart.labels" . | nindent 4 }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port | default 9999 }}targetPort: httpprotocol: TCPname: httpselector:{{- include "mychart.selectorLabels" . | nindent 4 }}

渲染后的 service.yaml 文件,已经设置为默认值 9999

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: ClusterIPports:- port: 9999targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

3.4 indent 函数

indent 模板函数,从左开始流出指定空格

values.yaml 文件取消注释以下内容

resources: limits:cpu: 100mmemory: 128Mirequests:cpu: 100mmemory: 128Mi

deployment.yaml 文件内容,取出 values.yamlresources 的值,并以左边添加12个空格的格式渲染

···resources:{{- toYaml .Values.resources | nindent 12 }}
···

查看渲染后的deployment.yaml 文件

···resources:limits:cpu: 100mmemory: 128Mirequests:cpu: 100mmemory: 128Mi
···

3.5 with

with 可以允许将当前范围 . 设置为特定的对象。例如,.Values.service,使用 with 可以将 .Values.service 改为 .

现在我们可以引用 .port.type 无需对其进行限定。这是因为该 with 声明设置 . 为指向 .Values.service。在 {{ end }}. 复位其先前的范围。

apiVersion: v1
kind: Service
metadata:name: {{ include "mychart.fullname" . }}labels:{{- include "mychart.labels" . | nindent 4 }}
spec:{{- with .Values.service }}type: {{ .type }}ports:- port: {{ .port }}targetPort: httpprotocol: TCPname: http{{- end }}selector:{{- include "mychart.selectorLabels" . | nindent 4 }}

查看渲染后的service.yaml 文件

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: ClusterIPports:- port: 8888targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

3.6 变量

Helm 模板中,变量是对另一个对象的命名引用。它遵循这个形式 $name。变量被赋予一个特殊的赋值操作符::=

apiVersion: v1
kind: Service
metadata:name: {{ include "mychart.fullname" . }}labels:{{- include "mychart.labels" . | nindent 4 }}
spec:{{- $portname := .Release.Name }}{{- with .Values.service }}type: {{ .type }}ports:- port: {{ .port }}targetPort: httpprotocol: TCPname: {{ $portname }}{{- end }}selector:{{- include "mychart.selectorLabels" . | nindent 4 }}

查看渲染后的service.yaml 文件

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-mychartlabels:helm.sh/chart: mychart-0.1.0app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demoapp.kubernetes.io/version: "1.16.0"app.kubernetes.io/managed-by: Helm
spec:type: ClusterIPports:- port: 8888targetPort: httpprotocol: TCPname: demoselector:app.kubernetes.io/name: mychartapp.kubernetes.io/instance: demo
---

3.7 if-else

{{if PIPELINE}}# Do something
{{else if OTHER PIPELINE}}# Do something else
{{else}}# Default case
{{end}}

如果值为如下情况,则管道评估为 false。

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

在其他情况下, 条件值为 true 此管道被执行。

values.yaml内容

favorite:drink: coffeefood: pizza

configmap.yaml内容

apiVersion: v1
kind: ConfigMap
metadata:name: {{.Release.Name }}-configmap
data:myvalue: "Hello World"drink: {{.Values.favorite.drink }}food: {{.Values.favorite.food }}{{- if eq .Values.favorite.drink "coffee" }}mug: true{{- end}}

渲染后的模版

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: clunky-cat-configmap
data:myvalue: "Hello World"drink: "coffee"food: "PIZZA"mug: true

四、命名模板

一般在 template 文件夹下的 _helpers.tpl 中定义命名模板。通过 define 函数定义命名模板,template 使用命名模板。

_helpers.tpl文件内添加一个模版

···
{{/*
Demo template
*/}}
{{- define "my_labels" }}labels:generator: helmdate: {{ now | htmlDate }}chart: {{ .Chart.Name }}version: {{ .Chart.Version }}
{{- end }}

configmap 中使用该模版

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap{{- template "my_labels" . }}

查看渲染后的 configmap.yaml

---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: demo-configmaplabels:generator: helmdate: 2020-07-17chart: mychartversion: 0.1.0
---

五、参考链接

https://whmzsu.github.io/helm-doc-zh-cn/
https://juejin.im/post/5d5b8dba6fb9a06b1b19c21b
https://www.cnblogs.com/cjwnb/p/12571199.html#_lab2_0_1

Helm Chart 使用简析相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  3. 基于libmad库的MP3解码简析

    基于libmad库的MP3解码简析  MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...

  4. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  5. Python源码学习:内建类型简析并简析int对象

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇文章中已经大致分析了下,Python的启动执行流程,现在我们分析一下Pytho ...

  6. Python源码学习:启动流程简析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> Python简介: python主要是动态语言,虽然Python语言也有编译,生成中 ...

  7. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想 http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇 ...

  8. ceph存储原理_Ceph存储引擎BlueStore简析

    前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...

  9. Android Jetpack组件App Startup简析

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

最新文章

  1. 科普丨深度学习 vs 概率图模型 vs 逻辑学
  2. Servlet多个对象共享数据
  3. 执行ssh-add时出现Could not open a connection to your authentication agent
  4. Inline Temp(内联临时变量)
  5. 只要沾上婚恋焦虑,她们就王者变青铜
  6. Power BI Desktop 10月更新
  7. 使用MySQLMTOP监控MySQL性能(二)
  8. cad放大_如何玩转CAD看图?1分钟,一款完全免费的高效软件,解决所有看图
  9. cad审图软件lisp_cad审图什么软件好 创基出图助手教程(附下载)
  10. MTK 6589 native exif generation
  11. 古体字与简体字对照表_简体字与繁体字对照表
  12. Windows 10 Office文件图标异常处理(Word | Excel | Powerpoint图标白色、右键新建找不到文件)
  13. 经济适用型北京生活经验分享,80后北漂看过来
  14. 用H5新特性canvas绘制一个钟表
  15. python 判断是否是元音字母
  16. js随机字符a-zA-Z0-9
  17. vue项目常用依赖安装②——element-ui
  18. 【来日复制粘贴】使用公式提取数据
  19. BOSSCMS V2.0 已发布,免费可商用的开源CMS系统
  20. TQ2440 学习笔记—— 1、Windows平台下开发工具安装与环境建立

热门文章

  1. 产险精算GLM-GAM案例
  2. 虚拟串口与串口服务器,串口服务器USR-DR302与虚拟串口进行一对一通信
  3. 文献:三维视觉前沿进展 大场景下的视觉定位阅读笔记
  4. JsonUtil工具类:
  5. 数据离奇丢失案件的侦破与思考
  6. 发现了在公司的电脑中影响Windows性能,造成硬盘唱狂响曲的罪魁祸首!
  7. 《语文教学通讯》栏目 收稿范围
  8. Could not find acceptable representation(已解决)
  9. 易中天品汉代风云人物01: 冤死的晁错(上)
  10. 使用HtmlParser解析HTML