【笔记】Helm-2 如何使用-1 chart开发提示和技巧

chart开发提示和技巧

本指南涵盖了Helm chart的开发人员在构建生产环境质量的chart时学到的一些提示和技巧。

了解你的模板功能

Helm使用了 Go模板 将你的自由文件构建成模板。Go塑造了一些内置方法,我们增加了一些其他的。

template package - text/template - Go Packages

首先,我们添加了 Sprig库 中所有的方法,处于安全原因,“env”和“expandenv”除外。

Sprig Function Documentation | sprig

我们也添加了两个特殊的模板方法:include和required。

include方法允许你引入另一个模板,并将结果传递给其他模板方法。

比如,这个模板片段包含了一个叫mytpl的模板,然后将其转成小写,并使用双引号括起来。

value: {{ include "mytpl" . | lower | quote }}

value: {{ include "mytpl" . | lower | quote }}

required方法可以让你生命模板渲染所需的特定值。如果这个值是空的,模板渲染会出错并打印用户提交的错误信息。

下面这个required方法的例子声明了一个 .Values.who 需要的条目,并且当这个条目不存在时会打印错误信息:

value: {{ required "A valid .Values.who entry required!" .Values.who }}

value: {{ required "A valid .Values.who entry required!" .Values.who }}

// 建议这些代码最好自己照着手敲一遍or n遍,因为有些真的不自己敲不晓得一些小细节哒。通常如果可以的话,我是手敲然后复制,如果要参照以第二份版本为准哈~

字符串引号括起来,但整型不用

使用字符串数据时,你总是更安全地将字符串括起来而不是露在外面:

name: {{ .Values.MyName | quote }}

name: {{ .Values.MyName | quote }}

但是使用整型时不要把值括起来。在很多场景中那样会导致Kubernetes内解析失败。

port: {{ .Values.Port }}

port: {{ .Values.Port }}

这个说明不适用于环境变量是字符串的情况,即使表现为整型:

env:

  - name: HOST

    value: "http://host"

  - name: PORT

    value: "1234"

env:- name: HOSTvalue: "http://host"- name: PORTvalue: "1234"

使用'include'方法

Go提供了一种使用内置模板将一个模板包含在另一个模板中的方法。然而内置方法不适用于Go模板流水线。

为使包含模板成为可能,然后对该模板的输出执行操作,Helm有一个特殊的include方法:

{{ include "toYaml" $value | indent 2 }}

{{ include "toYaml" $value | indent 2 }}

上面这个包含的模板成为toYaml,传值给$value,然后将这个模板的输出传给indent方法。

由于YAML将重要性归因于缩进级别和空白,使其在包含代码片段时变成了一种好方法。但是在相关的上下文中要处理缩进。

使用'required'方法

Go提供了一种设置模板选项的方法去控制不在映射中的key来索引映射的行为。通常设置为

template.Options("missingkey=option"),option是default,zero或error。将此项设置为error时会停止执行并出现错误,这会应用到map中的每一个缺失的key中。某些情况下chart的开发人员希望在values.yaml中选择值强制执行此操作。

required方法允许开发者声明一个模板渲染需要的值。如果在values.yaml中这个值是空的,模板就不会渲染并返回开发者提供的错误信息。

例如:

{{ required "A valid foo is required!" .Values.foo }}

{{ required "A valid foo is required!" .Values.foo }}

上述示例表示当.Values.foo被定义时模板会被渲染,但是未定义时渲染会失败并退出。

使用'tpl'方法

tpl方法允许开发者在模板中使用字符串作为模板。将模板字符串作为值传给chart或渲染额外的配置文件时会很有用。语法:{{ tpl TEMPLATE_STRING VALUES }}

示例:

# values

template: "{{ .Values.name }}"

name: "Tom"

# template

{{ tpl .Values.template . }}

# output

Tom

# values
template: "{{ .Values.name }}"
name: "Tom"# template
{{ tpl .Values.template . }}# output
Tom

渲染额外的配置文件
# external configuration file conf/app.conf

firstName={{ .Values.firstName }}

lastName={{ .Values.lastName }}

# values

firstName: Peter

lastName: Parker

# template

{{ tpl (.Files.Get "conf/app.conf") . }}

# output

firstName=Peter

lastName=Parker

# external configuration file conf/app.conf
firstName={{ .Values.firstName }}
lastName={{ .Values.lastName }}# values
firstName: Peter
lastName: Parker# template
{{ tpl (.Files.Get "conf/app.conf") . }}# output
firstName=Peter
lastName=Parker

创建镜像拉取秘钥

镜像拉取密钥本质上是注册表,用户名和密码的组合。在正在部署的应用程序中您可能需要它,但创建时需要用base64跑一会儿。我么可以写一个辅助模板来写Docker的配置文件,用来承载密钥。示例如下:

首先,假定values.yaml文件中定义了证书如下:

imageCredentials:

  registry: quay.io

  username: someone

  password: sillyness

  email: someone@host.com

imageCredentials:registry: quay.iousername: someonepassword: sillynessemail: someone@host.com

然后定义下面的辅助模板:

{{- define "imagePullSecret" }}
{{- with .Values.imageCredentials }}
{{- printf "{\"auths\":{\"%s\":{\"username\":\"%s\",\"password\":\"%s\",\"email\":\"%s\",\"auth\":\"%s\"}}}" .registry .username .password .email (printf "%s:%s" .username .password | b64enc) | b64enc }}
{{- end }}
{{- end }}

最终,我们使用辅助模板在更大的模板中创建了密钥清单:

apiVersion: v1

kind: Secret

metadate:

  name: myregistrykey

type: kubernetes.io/dockerconfigjson

data:

  - dockerconfigjson: {{ template "imagePullSecret" . }}

apiVersion: v1
kind: Secret
metadata:name: myregistrykey
type: kubernetes.io/dockerconfigjson
data:.dockerconfigjson: {{ template "imagePullSecret" . }}

自动滚动部署

由于配置映射或密钥作为配置文件注入容器以及其他外部依赖更新导致经常需要滚动部署pod。随后的helm upgrade 更新基于这个应用可能需要重新启动,但如果负载本身没有更改并使用原有配置保持运行,会导致部署不一致。

sha256sum方法保证在另一个文件发生更改时更新负载说明:

kind: Deployment

spec:

  template:

    metadata:

      annotations:

        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml" .| sha256sum }}

[...]

kind: Deployment
spec:template:metadata:annotations:checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
[...]

注意:如果要将这些添加到库chart中,就无法使用$.Template.BasePath访问您的文件。相反您可以使用{{ include ("mylibchart.configmap") . | sha256sum }}引用您的定义。

这个场景下您通常想滚动更新您的负载,可以使用类似的说明步骤,而不是使用随机字符串替换,因而经常更改并导致负载滚动更新:

kind: Deployment

spec:

  template:

    metadata:

      annotations:

        rollme: {{ randAlphaNum 5 | quote }}

[...]

kind: Deployment
spec:template:metadata:annotations:rollme: {{ randAlphaNum 5 | quote }}
[...]

每次调用模板方法会生成一个唯一的随机字符串。这意味着如果需要同步多种资源使用的随机字符串,所有的相对资源都要在同一个模板文件中。

这两种方法都允许您的部署利用内置的更新策略逻辑来避免停机。

注意:过去我们推荐使用--recreate-pods参数作为另一个选项。这个参数在Helm 3中不推荐使用,而支持上面更具声明性的方法。

告诉Helm不要卸载资源

有时在执行helm uninstall时有些资源不应该被卸载。Chart的开发者可以在资源中添加额外的说明避免被卸载。

kind: Secret

metadata:

  annotations:

    "helm.sh/resource-policy": keep

[...]

kind: Secret
metadata:annotations:"helm.sh/resource-policy": keep
[...]

(需要引号)

这个说明"helm.sh/resource-policy": keep只是Helm操作(比如helm uninstall,helm upgrade或helm rollback)要删除时跳过删除这个资源,然而,这个资源会变成孤立的。Helm不再以任何方式管理它。如果在已经卸载的但保留资源的版本上使用helm install --replace会出问题。

使用"Partials"和模板引用

有时您想在chart中创建可以重复利用的部分,不管时快还是局部模板。通常将这些文件保存在自己的文件中会更干净。

在templates/目录中,任何以下划线(_)开始的文件不希望输出到Kubernetes清单文件中。因此按照惯例,辅助模板和局部模板会被放在_helpers.tpl文件中。

使用很多依赖的复杂Chart

在CNCF的 Artifact Hub 中的很多chart是创建更先进应用的“组成部分”。但是chart可能被用于创建大规模应用实例。在这种场景中,一个总的chart会有很多子chart,每一个是整体功能的一部分。

Artifact Hub

当前从离散组件组成一个复杂应用的最佳实践是创建一个顶层总体chart构建全局配置,然后使用charts/子目录嵌入每个组件。

YAML是JSON的超集

根据YAML规范,YAML是JSON的超集。这意味着任意的合法JSON结构在YAML中应该是合法的。

这有个优势:有时候模板开发者会发现使用类JSON语法更容易表达数据结构而不是处理YAML的空白敏感度。

作为最佳实践,模板应遵循类YAML语法除非JSON语法大大降低了格式问题的风险。

生成随机值时留神

Helm中有的方法允许您生成随机数据,加密密钥等等。这些很好用,但是在升级,模板重新执行时要注意,当模板运行与最后一次运行不一样的生成数据时,会触发资源升级。

一条命令安装或升级版本

Helm提供了一种简单命令执行安装或升级的方法。使用helm upgrade和--install命令,这会时Helm查看是否已经安装版本,如果没有,会执行安装;如果版本存在,会进行升级

$ helm upgrade --install <release name> --values <values file> <chart directory>

$ helm upgrade --install <release name> --values <values file> <chart directory>

————————————

仅用于本人学习

来源:Helm | Docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue项目里实现json对象转formData数据

平常调用后端接口传参都是json对象&#xff0c;当提交表单遇到有附件需要传递时&#xff0c;通常是把附件上传单独做个接口&#xff0c;也有遇到后端让提交接口一并把附件传递到后端&#xff0c;这种情况需要把参数转成formData的数据&#xff0c;需要用到new FormData()。json…

【Python】科研代码学习:一

【Python】科研代码学习&#xff1a;一 前言魔方方法 __dict__, __setattr__ , __getattr__ , __getattribute__hasattr(obj, name)super()类型注解解包 unpackingzip() 函数 前言 搞科研&#xff0c;最重要的还是得看懂别人的源代码。 这就意味着python不能太差 看到比较有用…

基于SpringBoot的教学管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Go语言-无限可能的管道协程:解锁并发编程的新境界

Go语言-无限可能的管道协程&#xff1a;解锁并发编程的新境界 在Go语言中&#xff0c;协程&#xff08;Goroutine&#xff09;是一种轻量级的并发执行单位&#xff0c;它可以与其他协程并发执行&#xff0c;但不同于操作系统级别的线程。Go语言的协程由Go运行时&#xff08;Go…

​软件测试面试:关键问题解析

在软件开发领域&#xff0c;测试是确保软件质量的重要环节。面试是评估软件测试人员技能和经验的关键时刻。在一个软件测试面试中&#xff0c;面试官通常会问一系列问题来评估面试者的知识、技能和解决问题的能力。本文将介绍一些常见的软件测试面试问题&#xff0c;并给出一些…

【2024最新版】接口自动化测试基础(基础篇)

接口自动化测试基础 目录 1、什么是接口自动化测试 2、接口自动化测试要素 3、常用的落地方案 什么是接口自动化测试 PART 01 1.1什么是接口自动化测试 接口自动化测试是一种通过编写脚本或使用工具来自动化执行应用程序接口来验证接口正确性的测试方法。接口自动化测试的…

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…

APP开发——目前APP开发的几种形式

关于APP开发目前已经过了火热的阶段&#xff0c;现在学习APP开发的人越来越多&#xff0c;但在实际的业务场景中&#xff0c;APP开发还是有一部分的市场需求。 所以&#xff0c;这里简单记录一下APP开发的几种思路和方案。 APP平台 首先&#xff0c;目前APP开发主要有两大平…

【Python】使用tkinter设计开发Windows桌面程序记事本(3)

上一篇&#xff1a;【Python】使用tkinter设计开发Windows桌面程序记事本&#xff08;2&#xff09;-CSDN博客 下一篇&#xff1a; 作者发炎 本文章与"记事本项目"的第一篇文章类似。这里是重新创建新的"页面设置"子窗口&#xff0c;进行开发设计。 那为…

自动化测试的三种等待方式

自动化测试的等待方式主要有三种&#xff1a;强制等待、隐式等待和显式等待。 1. 强制等待&#xff08;Sleep&#xff09; 通过在代码中使用Thread.sleep()方法来实现的&#xff0c;该方法会阻塞当前线程的执行&#xff0c;程序会暂停指定的时间。 这种方式没有条件判断&…

SpringMVC 域对象共享数据

文章目录 2、使用ModelAndView向request域对象共享数据3、使用Model向request域对象共享数据4、使用map向request域对象共享数据5、使用ModelMap向request域对象共享数据6、Model、ModelMap、Map的关系7、向session域共享数据8、向application域共享数据 1、使用ServletAPI向re…

钉钉java登录

获取token &#xff1a;API Explorer 获取部门列表&#xff1a;获取部门列表 - 钉钉开放平台

通过wireshark抓取的流量还原文件(以zip为例)

wireshark打开流量包&#xff0c;通过zip关键字查找 追踪流可查看详细信息 选中media Type右键&#xff0c; 点击导出分组字节流选项 将生成的文件进行命名&#xff0c;需要时什么格式就以什么格式后缀

ffmpeg api-alac-text.c

generate_raw_frame 这个函数接受一个 frame_data 数组作为参数&#xff0c;用于存储音频数据。i 参数表示当前帧的索引&#xff0c;sample_rate 是采样率&#xff0c;channels 是声道数&#xff0c;frame_size 是帧大小。函数使用一个简单的算法生成音频数据&#xff0c;然后…

leetcode:LCR 159. 库存管理 III(python3解法)

难度&#xff1a;简单 仓库管理员以数组 stock 形式记录商品库存表&#xff0c;其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量&#xff0c;返回 顺序不限。 示例 1&#xff1a; 输入&#xff1a;stock [2,5,7,4], cnt 1 输出&#xff1a;[2]示例…

探秘人工智能大会:揭示未来技术发展趋势与学习之道

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的方方面面。 参加人工智能大会&#xff0c;不仅能够洞察到最前沿的技术动态&#xff0c;还能与业界专家、学者交流思想&#xff0c;共同探讨AI的未来发展。本文将带您探秘人工智能大…

nuxt pm2使用、启动、问题解决方案

pm2简介 pm2是一个进程管理工具,可以用它来管理node进程&#xff0c;并查看node进程的状态&#xff0c;当然也支持性能监控&#xff0c;进程守护&#xff0c;负载均衡等功能&#xff0c;在前端和nodejs的世界中用的很多 pm2安装 安装pm2: $ npm install -g pm2查看pm2的安装…

TinyLlama-1.1B(小羊驼)模型开源-Github高星项目分享

简介 TinyLlama项目旨在在3万亿tokens上进行预训练&#xff0c;构建一个拥有11亿参数的Llama模型。经过精心优化&#xff0c;我们"仅"需16块A100-40G的GPU&#xff0c;便可在90天内完成这个任务&#x1f680;&#x1f680;。训练已于2023-09-01开始。项目地址&#…

2024在视频号开店怎么样?平台现状如下,有电商经验者优先!

我是王路飞。 现在开网店、做电商的平台有很多&#xff0c;但是有着绝对流量优势的&#xff0c;除了抖音之外就是视频号了。 但是抖音跟视频号相比&#xff0c;已经属于一个很成熟的平台了&#xff0c;商家们也开始进入到内卷阶段了。 所以&#xff0c;如果你们2024年想做电…

列表进入详情页的传参问题(vue的问题)

<router-link :to"{path: detail, query: {id: 1}}">前往detail页面</router-link> c页面的路径为http://localhost:8080/#/detail?id1&#xff0c;可以看到传了一个参数id1&#xff0c;并且就算刷新页面id也还会存在。此时在c页面可以通过id来获取对应…