zoukankan      html  css  js  c++  java
  • helm3自定义chart编写

    当我们安装好helm之后我们可以开始自定义chart,那么我们需要先创建出一个模板如下:

    helm create myapp

    之后我们可以一下目录结构,目录的作用我简要介绍一下:

    templates/ 目录包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/目录中。 然后收集模板的结果并发送给Kubernetes。

    • _helpers.tpl里面的内容是定义模板用的,所有模板都可以再这里定义,然后再任何yaml文件当中都可以调用这个文件下的模板
    • NOTES.txt: chart的"帮助文本"。这会在你的用户执行helm install时展示给他们。
    • deployment.yaml: 创建Kubernetes 工作负载的基本清单
    • service.yaml: 为你的工作负载创建一个 service终端基本清单。
    • _helpers.tpl: 放置可以通过chart复用的模板辅助对象

    values.yaml 文件也导入到了模板。这个文件包含了chart的 默认值 。这些值会在用户执行helm install 或 helm upgrade时被覆盖。

    Chart.yaml 文件包含了该chart的描述。你可以从模板中访问它。charts/目录 可以 包含其他的chart(称之为 子chart)。 指南稍后我们会看到当涉及模板渲染时这些是如何工作的。

    $tree myapp/
    myapp/
    ├── charts
    ├── Chart.yaml
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   ├── serviceaccount.yaml
    │   ├── service.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml
    
    3 directories, 10 files

    现在展示一下我所创建的chart为例

    $tree myapp/
    myapp/
    ├── charts
    ├── Chart.yaml
    ├── templates
    │   ├── configmap.yaml
    │   └── _helpers.tpl
    ├── test.yaml
    ├── values.yaml
    └── values.yaml.bak
    
    2 directories, 7 files

    其中我修改过的内容如下:

    $cat values.yaml
    favorite:
      drink: coffee
      food: pizza
    pizzaToppings:
    - mushrooms
    - cheese
    - peppers
    - onions
    $cat templates/configmap.yaml
    {{ $release := "ok" }}
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: {{ .Release.Name }}-configmap
        labels:
        {{- include "mychart.labels" . | indent 8 }}
    data:
        myvalue: "Hello World"
        {{- with .Values.favorite }}
        drink: {{ .drink }}
        food: {{ .food }}
        release: {{ $release }}
        {{- end }}
        {{- if eq .Values.favorite.drink "coffee" }}
        mug: true
        {{- end }}
        toppings: |-
            {{- range $.Values.pizzaToppings }}
            -{{ . | title | quote }}
            {{- end }}
        size: |-
            {{- range $index,$name := tuple "small" "medium" "large" }}
            {{ $index }}: {{ $name }}
            {{- end }}
    $cat templates/_helpers.tpl
    {{/* Generate basic labels */}}
    {{- define "mychart.labels" }}
    generator: helm
    date: {{ now | htmlDate }}
    chart: {{ .Chart.Name }}
    version: {{ .Chart.Version }}
    {{- end }}

     上述所需要的技术点:

    设置自定义变量

    {{ $release := "ok" }}

    引用内部变量,其中.就是当前作用域的变量,Release.Name为helm install的名字

    name: {{ .Release.Name }}-configmap

    引用模板,其中{{-代表去除前面的空格-}}代表去除后面的空格,include代表引用模板,mychart.labels为引用模板的内容(内容再_helpers.tpl中),后面的.代表全局作用域,否则_helpers中的有些内容将获取不到,管道符|代表把前面的内容赋予给管道符,然后缩进8个空格

    {{- include "mychart.labels" . | indent 8 }}

    with代表循环,循环的只为values.yam文件中的内容,注意,必须为大写Values,{{.drink}}为所循环出来的下一级,也就是values.yaml下的favorite下的drink字段,其实也可以循环tuple等类型

    {{- with .Values.favorite }}
        drink: {{ .drink }}
        food: {{ .food }}
        release: {{ $release }}
    {{- end }}

    if判断语句,eq代表等于(还有ge,lt,ne等),那么下面的意思是如果values.yaml文件中favorite下的drink内容为coffee,那么就添加一个mug:true字段

    {{- if eq .Values.favorite.drink "coffee" }}
    mug: true
    {{- end }}

    range也代表循环,$代表顶级作用域,意思是说不管再那个作用域,只要出现$都可以调用顶级的变量,那么循环的内容也再_helpers.tpl文件中,.代表循环出来的单个内容然后给title处理变成抬头,再给quote函数处理,quote代表字符串化

    toppings: |-
            {{- range $.Values.pizzaToppings }}
            -{{ . | title | quote }}
            {{- end }}

    对于range也可以循环tuple等类型,如下,其中$index代表索引,$name代表循环tuple的具体内容

    size: |-
            {{- range $index,$name := tuple "small" "medium" "large" }}
            {{ $index }}: {{ $name }}
            {{- end }}

    对于_helpers.tpl内容解释如下,{{/* */}}代表注释,{{- define代表定义一个模板,后面跟着模板名字,其中.Chart代表调用Chart.yaml文件的内容

    {{/* Generate basic labels */}}
    {{- define "mychart.labels" }}
    generator: helm
    date: {{ now | htmlDate }}
    chart: {{ .Chart.Name }}
    version: {{ .Chart.Version }}
    {{- end }}

    以上内容执行后如下:可以跟着文件对照一下结果

    $helm install mytest ../myapp/ --dry-run --debug
    install.go:173: [debug] Original chart version: ""
    install.go:190: [debug] CHART PATH: /home/admin/myapp
    
    NAME: mytest
    LAST DEPLOYED: Thu Jun 10 19:08:17 2021
    NAMESPACE: default
    STATUS: pending-install
    REVISION: 1
    TEST SUITE: None
    USER-SUPPLIED VALUES:
    {}
    
    COMPUTED VALUES:
    favorite:
      drink: coffee
      food: pizza
    pizzaToppings:
    - mushrooms
    - cheese
    - peppers
    - onions
    
    HOOKS:
    MANIFEST:
    ---
    # Source: myapp/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: mytest-configmap
        labels:
            generator: helm
            date: 2021-06-10
            chart: myapp
            version: 0.1.0
    data:
        myvalue: "Hello World"
        drink: coffee
        food: pizza
        release: ok
        mug: true
        toppings: |-
            -"Mushrooms"
            -"Cheese"
            -"Peppers"
            -"Onions"
        size: |-
            0: small
            1: medium
            2: large

    未完待续...................

  • 相关阅读:
    我的第二个裸板程序之链接地址与存储地址
    ARM你必须知道的事儿——为啥“PC = PC + 8”?
    typedef你真的理解么?
    centos使用--vsftpd配置
    centos使用--zsh
    laravel5.2总结--序列化
    laravel5.2总结--csrf保护
    laravel5.2总结--任务调度
    laravel5.2总结--本地化以及常量的使用
    laravel5.2总结--文件上传
  • 原文地址:https://www.cnblogs.com/fengzi7314/p/14872326.html
Copyright © 2011-2022 走看看