helm模板文件chart编写语法详解

https://blog.51cto.com/qujunorz/2421328

需要学习一下. 

charts编写介绍

开始

快速创建一个chart模板,helm create mychart,执行命令后本地生成一个mychart目录.

chart目录结构

  • Chart.yaml: 该chart的描述文件,包括ico地址,版本信息等
  • vakues.yaml: 给模板文件使用的变量
  • charts: 依赖其他包的charts文件
  • requirements.yaml: 依赖的charts
  • README.md: 开发人员自己阅读的文件
  • templates: 存放k8s模板文件目录
    • NOTES.txt 说明文件,helm install之后展示给用户看的内容
    • deployment.yaml 创建k8s资源的yaml文件
    • _helpers.tpl: 下划线开头的文件,可以被其他模板引用.

一个最小的chart目录,只需要包含一个Chart.yaml,和templates目录下一个k8s资源文件.如:

    # mychart/Chart.yaml
    apiVersion: v1
    appVersion: 2.9.0
    version: 1.1.1

    # mychart/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mychart-configmap
    data:
      myvalue: "Hello World"

helm的模板语法实现原理:

- go-template双
- sprig

helm模板语法

  1. 模板引用方式,{{ .Release.Name }}, 通过双括号注入,小数点开头表示从最顶层命名空间引用.

  2. helm内置对象
    # Release, release相关属性
    # Chart, Chart.yaml文件中定义的内容
    # Values, values.yaml文件中定义的内容
  3. 模板中使用管道
    apiVersion: v1
    kind: ConfigMap
    metadata:
       name: {{ .Release.Name }}-configmap
    data:
      myvalue: "Hello World"
      drink: {{ .Values.favorite.drink | repeat 5 | quote }}
      food: {{ .Values.favorite.food | upper | quote }}
  4. if语句
    {{ if PIPELINE }}
    # Do something
    {{ else if OTHER PIPELINE }}
    # Do something else
    {{ else }}
    # Default case
    {{ end }}
  5. 操作符, and/eq/or/not

    {{/* include the body of this if statement when the variable .Values.fooString exists and is set to "foo" */}}
    {{ if and .Values.fooString (eq .Values.fooString "foo") }}
        {{ ... }}
    {{ end }}
    
    {{/* do not include the body of this if statement because unset variables evaluate to false and .Values.setVariable was negated with the not function. */}}
    {{ if or .Values.anUnsetVariable (not .Values.aSetVariable) }}
       {{ ... }}
    {{ end }}
  6. 控制语句块在渲染后生成模板会多出空行,需要使用{{- if ...}}的方式消除此空行.如:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
    data:
      myvalue: "Hello World"
      {{- if eq .Values.favorite.drink "coffee"}}
      mug: true
      {{- end}}
  7. 引入相对命名空间,with命令:
    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 }}
  8. range命令实现循环,如:

    # values.yaml
    favorite:
      drink: coffee
      food: pizza
    pizzaToppings:
      - mushrooms
      - cheese
      - peppers
      - onions
    
    #configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
    data:
      myvalue: "Hello World"
      toppings: |-
        {{- range .Values.pizzaToppings }}
        - {{ . }}
        # .表示range的命令空间下的取值
        {{- end }}
        {{- range $key, $val := .Values.favorite }}
        {{ $key }}: {{ $val | quote }}
        {{- end}} 
  9. 变量赋值
    ApiVersion: v1
    Kind: ConfigMap
    Metadata:
      name: {{ .Release.Name }}-configmap
    Data:
      myvalue: "Hello World"
      # 由于下方的with语句引入相对命令空间,无法通过.Release引入,提前定义relname变量
      {{- $relname := .Release.Name -}}
      {{- with .Values.favorite }}
      food: {{ .food }}
      release: {{ $relname }}
      # 或者可以使用$符号,引入全局命名空间
      release: {{ $.Release.Name }}
      {{- end }}
  10. 公共模板,define定义,template引入,在templates目录中默认下划线_开头的文件为公共模板(_helpers.tpl)

    # _helpers.tpl文件
    {{- define "mychart.labels" }}
      labels:
        generator: helm
        date: {{ now | htmlDate }}
    {{- end }}
    
    # configmap.yaml文件
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
      {{- template "mychart.labels" }}
    data:
      myvalue: "Hello World"
  11. template语句的升级版本include,template是语句无法在后面接管道符来对引入变量做定义,
    include实现了此功能.

    # _helpers.tpl文件
    {{- define "mychart.app" -}}
    app_name: {{ .Chart.Name }}
    app_version: "{{ .Chart.Version }}+{{ .Release.Time.Seconds }}"
    {{- end -}}
    
    # configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
      labels:
        {{- include "mychart.app" . | nindent 4 }}
    data:
      myvalue: "Hello World"
      {{- range $key, $val := .Values.favorite }}
      {{ $key }}: {{ $val | quote }}
      {{- end }}
      {{- include "mychart.app" . | nindent 2 }}
    
    # 如果使用template只能手动空格,不能使用管道后的nindent函数来做缩进
  12. 一个坑helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null<br/>,livenessProbe在values.yaml中定义了httpGet,需要手动设置为null,然后设置exec的探针.

[转帖]helm模板文件chart编写语法详解的更多相关文章

  1. Python基础-week03 集合 , 文件操作 和 函数详解

    一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...

  2. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  3. Xpath语法详解

    1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...

  4. Hive笔记--sql语法详解及JavaAPI

    Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...

  5. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  6. Thymeleaf3语法详解和实战

    Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...

  7. Linux文件权限与属性详解 之 chattr & lsattr

    Linux文件权限与属性详解 之 一般权限 Linux文件权限与属性详解 之 ACL Linux文件权限与属性详解 之 SUID.SGID & SBIT Linux文件权限与属性详解 之 ch ...

  8. [持续交付实践] pipeline使用:语法详解

    一.引言 jenkins pipeline语法的发展如此之快用日新月异来形容也不为过,而目前国内对jenkins pipeline关注的人还非常少,相关的文章更是稀少,唯一看到w3c有篇相关的估计是直 ...

  9. spring AspectJ切入点语法详解 记录以便查阅

    AspectJ切入点语法详解 6.5.1  Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,,在Spring AOP中目前只有执行方法这一个连接点,Spri ...

随机推荐

  1. 更丰富的符号工具包 Font Awesome

    我时常想要在此类文档中通过一些图形符号来表达更丰富的含义或是对段落进行标注,例如使用 Emoji.然而 Emoji 在这方面仍然有存在一些不足,如: 颜色与文字风格不统一, 在不同系统的平台上显示不统 ...

  2. LOJ P10011 愤怒的牛 题解

    每日一题 day36 打卡 Analysis 非常水的二分模板,就直接二分答案,用贪心策略check就好了 #include<iostream> #include<cstdio> ...

  3. urql 高度可自定义&&多功能的react graphql client

    urql 是一个很不错的graphql client,使用简单,功能强大,通过exchanges 实现了完整的自定义特性 通过urql 的exchanges 我们可以实现灵活的cache策略 参考资料 ...

  4. element ui分页器的使用

    <el-pagination layout="total, prev, pager, next, jumper" :current-page="pageInfo.p ...

  5. 【算法编程 C++ python】单链表反序输出

    题目描述 输入一个链表,从尾到头打印链表每个节点的值.   以下方法仅仅实现了功能,未必最佳.在牛客网测试, C++:3ms 480k Python:23ms 5732k /** * struct L ...

  6. docker_概念

    为什么有docker? 1. 宿主机可以虚拟一个硬件平台:其上会有内核(在虚拟机上的操作系统),内核负责资源调度和通信:内核之上会有用户态,运行在用户态(用户空间)之上多是应用程序,也就是进程.硬件( ...

  7. vs2015 编译obs studio 遇到的几个错误

    1. >D:\project\vs\obs\ObsProject\obs-studio\plugins\win-wasapi\win-wasapi.cpp(245): error C2065: ...

  8. bat批处理 取得当前路径 %CD%

    在DOS的批处理中,有时候需要知道当前的路径.在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容一般是不同的. 1. %cd% 可以用在批 ...

  9. 清理收藏夹中的json

    1.json的字符串与对象转换 $.parseJson(str)与JSON.parse(str) 返回值是true.另:json对象和字符串的相互转换 JSON.stringify(obj) 将JSO ...

  10. sqlite3 线程模型

    官网:https://www.sqlite.org/c3ref/open.html 转载:https://blog.csdn.net/yifanernei/article/details/564212 ...