通过helm批量统一管理应用配置实践

目录

通过define和template实现批量管理initContainers的配置

_文件

设置资源管控

Pod资源分配

批量获取镜像版本

--field-selector

jsonpath


目前管理的系统平台包含了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资源。

  1. 不同的 Kubernetes 资源类型支持不同的字段选择器。 所有资源类型都支持 metadata.name 和 metadata.namespace 字段。
  2. 你可在字段选择器中使用 =、== 和 != (= 和 == 的意义是相同的)操作符。
  3. 字段选择器可以通过使用逗号分隔的列表组成一个选择链。

jsonpath

JSONPath 模板由 {} 包起来的 JSONPath 表达式组成。Kubectl 使用 JSONPath 表达式来过滤 JSON 对象中的特定字段并格式化输出。除了原始的 JSONPath 模板语法,以下函数和语法也是有效的:

  1. 使用双引号将 JSONPath 表达式内的文本引起来。
  2. 使用 range,end 运算符来迭代列表。
  3. 使用负片索引后退列表。负索引不会“环绕”列表,并且只要 -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

参考:

Helm | 命名模板

JSONPath 支持 | Kubernetes

字段选择器 | Kubernetes

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Helm 是一个用于管理 Kubernetes 应用程序的工具,通过打包应用程序及其依赖为一个单独的可部署的 Helm Chart,简化了应用程序的部署和管理Helm 打包应用的步骤如下: 1. 创建 Helm Chart:首先需要创建一个 Helm Chart,它包含了应用程序的所有定义和配置信息。可以使用 Helm 的命令行工具 `helm create` 或者手动创建一个 Chart 目录。 2. 配置 Chart:在 Chart 根目录中,`values.yaml` 文件用于配置应用程序。通过修改这个文件,可以设置应用程序的参数和属性,如端口号、镜像版本等。 3. 添加依赖:如果应用程序有依赖,如数据库或其他服务,可以在 Chart 的 `requirements.yaml` 文件中定义它们。Helm 会自动下载和安装这些依赖。 4. 打包 Chart:使用 `helm package` 命令将 Chart 打包成一个 `.tgz` 文件。这个文件包含了应用程序的所有资源文件和配置。 5. 部署 Chart:通过使用 `helm install` 命令,将 Chart 部署到 Kubernetes 集群中。可以指定 Chart 的名称、命名空间和其他配置。 6. 更新应用:当应用程序需要更新时,可以通过修改 Chart 的配置文件或者 Chart 本身,然后使用 `helm upgrade` 命令更新应用程序。 总结起来,Helm 打包应用的过程包括创建 Chart、配置 Chart、添加依赖、打包 Chart 和部署 Chart。通过使用 Helm,可以快速、可重复和可管理地部署和更新应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值