在我们的CI管道中,我们已切换为使用基于约定的主机名(主要用于基于PR的动态开发环境)。这项新功能要求我们尊重Helm Charts中设置的旧主机名,因为其他服务指向这些旧主机名。
我们希望将基于约定的主机名追加或添加到现有主机名列表中,而不覆盖任何值。
目前,我们已经找到一种解决方法;但是,希望找到更清洁的解决方案。解决方法是让我们进入--set service.hostnames[10]="k8s-myapp-prod.website.com"
,其中索引10足够高,不会与图表中的主机名发生冲突。
我们只希望在这里有2或3个主机名,因此该解决方案有效,它忽略了一个或多个其他主机名。我更关心将来的更新,该更新将检查列表中是否只有一个主机名并抛出索引超出范围的错误。
我们的命令如下:
helm upgrade --install \
--namespace "myapp" \
--values "./values-prod.yaml" \
--set service.hostnames[10]="k8s-myapp-prod.website.com" \
"myapp-prod" ./
是否有任何想法要使这种清洁剂更清洁,或者我们可以使用其他某种魔术?
这是我们的values.yaml文件的副本:
image:
repository: dockerhub.com/myorg
stack:
environment: prod
service:
ingress:
class: nginx
hostnames:
- legacy-url-myapp-prod.website.com
port: 80
healthcheck: /heartbeat
resources:
memory:
request: "512Mi"
limit: "512Mi"
cpu:
request: "500m"
limit: "500m"
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 6
cpu: 50
environment:
DEPLOY_ENV: prod
spec:
strategy:
type: RollingUpdate
答案 0 :(得分:1)
如果要使用值文件中的数组添加入口主机名,并在helm模板中使用range
遍历它们,则可以动态找到要在命令行上使用的下一个数组索引。您可以使用jq和yq来计数值文件中的现有主机名。注意:以下脚本没有错误检查。
hostcount=$(yq r -j values-prod.yaml service | jq -r '.hostnames | length')
# ((hostcount++)) # edit: length is 1-based, array index is 0-based; hostcount should be the next index as is
helm upgrade --install \
--namespace "myapp" \
--values "./values-prod.yaml" \
--set service.hostnames[$hostcount]="k8s-myapp-prod.website.com" \
"myapp-prod" ./