如何用Helm模板将50个城市按10个一组分配至5个Pod?
问题描述
我有一个包含50个城市的列表,目前用Helm模板实现了每个城市对应创建一个Pod(共50个),但现在需要调整为:复用同一模板创建5个Pod,每个Pod里包含10个对应城市的容器。原实现代码如下:
{{ if .Values.enabled }} {{- range $i, $value := .Values.cities }} kind: Pod apiVersion: v1 metadata: name: "nginx-blob-{{ . }}" spec: nodeSelector: "kubernetes.io/os": linux containers: - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine name: "nginx-blob-{{ $value }}" --- {{- end }} {{ end }}
实现方案
核心思路是先将城市列表按每组10个拆分,再遍历每组生成对应的Pod,每个Pod内循环当前组的城市生成容器。修改后的Helm模板代码如下:
{{ if .Values.enabled }} {{- /* 定义每组包含的城市数量 */}} {{- $groupSize := 10 }} {{- /* 计算总组数,用ceil确保不满一组的也生成一个Pod */}} {{- $totalGroups := ceil (div (len .Values.cities) $groupSize) }} {{- /* 遍历每一组 */}} {{- range $groupIdx := until $totalGroups }} {{- /* 计算当前组的起始和结束索引 */}} {{- $start := mul $groupIdx $groupSize }} {{- $end := add $start $groupSize }} {{- /* 截取当前组的城市列表 */}} {{- $citiesInGroup := slice $.Values.cities $start $end }} kind: Pod apiVersion: v1 metadata: {{- /* 用组索引命名Pod,避免重复 */}} name: "nginx-blob-group-{{ $groupIdx }}" spec: nodeSelector: "kubernetes.io/os": linux containers: {{- /* 遍历当前组的城市,生成对应容器 */}} {{- range $city := $citiesInGroup }} - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine name: "nginx-blob-{{ $city }}" {{- end }} --- {{- end }} {{ end }}
关键说明
$groupSize:自定义每组包含的城市数量,这里设为10$totalGroups:通过ceil(总城市数/每组大小)计算总组数,确保最后不满10个城市的组也能生成一个Podslice函数:从原城市列表中截取当前组的子列表,语法为slice 列表 起始索引 结束索引- Pod命名:用组索引(如
nginx-blob-group-0、nginx-blob-group-1)命名,保证唯一性 - 容器部分:在每个Pod内循环当前组的城市,生成对应名称的容器
内容的提问来源于stack exchange,提问作者userahd
相关产品推荐
相关产品推荐

