目录
通过define和template实现批量管理initContainers的配置
目前管理的系统平台包含了50多个应用服务,我们希望统一调整50多个应用服务的deployment配置,给应用服务添加统一的初始化容器策略和健康检查策略,增加这些策略后还要考虑能够满足后续的维护变更需求,如果每次都逐一调整配置,既费时也容易出错,我们选择了使用helm统一管理配置模板,方便统一更新配置策略。以下为实践内容。
通过define和template实现批量管理initContainers的配置
在_helpers.tpl文件中添加initContainers的配置信息
{{- define "x.INITCONTAINER"}}
initContainers:
- name: check-nacos
image: busybox:1.34
command: ['sh', '-c', 'echo -e "Checking for the availability of nacos deployment"; while ! nc -z nacos-svc 8848; do sleep 1; printf "-"; done; echo -e " >> nacos has started";']
{{- end}}
在各个应用中的deployment配置章节中引用模板,后续只需要在模板中更新"x.INITCONTAINER" 中定义的内容,就可以批量修改所有应用中的配置,实现批量管理的效果。
spec: {{- template "x.INITCONTAINER" -}} containers: ...
_文件说明
在chart中,命名以下划线'_'开始得文件作为模板文件,通过自定义的函数渲染模板,用于做局部配置的复用,且在渲染时不会被渲染为Kubernetes对象文件。
define操作允许我们在模板文件中创建一个命名模板,语法如下:
{{- define "mychart.labels" }} labels: generator: helm date: {{ now | htmlDate }} {{- end }}
通过template操作,在ConfigMap的配置中获取模板内容,达到复用配置的效果,语法如下:
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap {{- template "mychart.labels" }}
设置资源管控
为了批量、统一配置资源限制,同时后续可以根据自己的需要随时进行调整,我将resources的配置作为变量定义在Values.yaml文件中。
在Values.yaml文件中定义三档资源配置,也可以按需自定义
resources: high: limits: {} requests: cpu: 100m memory: 256Mi mid: limits: cpu: 2 memory: 4 requests: cpu: 100m memory: 256Mi low: limits: cpu: 1 memory: 1 requests: cpu: 25m memory: 256Mi
在Deployment中,containers配置中定义资源配置,即可引用相应资源,后续可以统一相应档的资源配置。
resources: {{- toYaml .Values.resources.mid | nindent 12 }}
Pod资源分配
request表示期望资源容量。
limits表示限制资源容量。
- cpu单位:通常来说1个cpu代表在本地虚拟机、公有云虚拟主机上代表1核心;在intel cpu物理机上代表开启超线程能力后的 1 个核心。CPU 请求只能使用绝对数量,可以配置小数,如果配置requests 0.5 cpu 的容器,会确保获得请求 1 个 cpu 核心的一半;也可以使用m 作为单位,1000m cpu 代表1核心cpu,1m是可分配CPU资源的最小粒度。
- 内存单位:内存资源的基本单位是字节(byte)。也可以使用这些后缀之一:E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki
- 如果request中定义的cpu资源超除了所有node上面的资源容量,pod会处于pending状态。
- 如果limits不定义,则表示不限制资源使用。如果设置limits而不设置request,则kubernetes会自动配置request和limits相同的资源容量。
批量获取镜像版本
在小规模的环境下,通常研发同事会直接开发和测试环境中自行更换镜像,进行测试验证,用以下命令便于在打包的时候整体列出该环境下,指定namespace的所有镜像列表。
kubectl get pods -n dev-dex --field-selector status.phase=Running -o jsonpath='{range .items[*]}{.spec.containers[*].name}{" : "}{.spec.containers[*].image}{"\n"}{end}'
我们的环境中大概有50多个镜像,大部分都是跟业务相关就不一一列出了,根据输出内容可以将镜像列表在values.yaml文件中定义镜像。
--field-selector
通过field-selector参数,可以根据一个或多个资源字段的值筛选kubernetes资源。
- 不同的 Kubernetes 资源类型支持不同的字段选择器。 所有资源类型都支持 metadata.name 和 metadata.namespace 字段。
- 你可在字段选择器中使用 =、== 和 != (= 和 == 的意义是相同的)操作符。
- 字段选择器可以通过使用逗号分隔的列表组成一个选择链。
jsonpath
JSONPath 模板由 {} 包起来的 JSONPath 表达式组成。Kubectl 使用 JSONPath 表达式来过滤 JSON 对象中的特定字段并格式化输出。除了原始的 JSONPath 模板语法,以下函数和语法也是有效的:
- 使用双引号将 JSONPath 表达式内的文本引起来。
- 使用 range,end 运算符来迭代列表。
- 使用负片索引后退列表。负索引不会“环绕”列表,并且只要 -index + listLength> = 0 就有效。
函数 | 描述 | 示例 | 结果 |
text | 纯文本 | kind is {.kind} | kind is List |
@ | 当前对象 | {@} | 与输入相同 |
. or [] | 子运算符 | {.kind}, {['kind']} or {['name\.type']} | List |
.. | 递归下降 | {..name} | 127.0.0.1 127.0.0.2 myself e2e |
* | 通配符。获取所有对象 | {.items[*].metadata.name} | [127.0.0.1 127.0.0.2] |
[start:end :step] | 下标运算符 | {.users[0].name} | myself |
[,] | 并集运算符 | {.items[*]['metadata.name', 'status.capacity']} | 127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8] |
?() | 过滤 | {.users[?(@.name=="e2e")].user.password} | secret |
range, end | 迭代列表 | {range .items[*]}[{.metadata.name}, {.status.capacity}] {end} | [127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] |
'' | 引用解释执行字符串 | {range .items[*]}{.metadata.name}{'\t'}{end} | 127.0.0.1 127.0.0.2 |
参考: