如何在Helm中执行Bash脚本校验镜像存在性并选择合适镜像
解决方案
Helm 原生配合脚本实现(推荐)
Helm本身是客户端模板渲染工具,没有内置镜像仓库访问能力,你可以通过渲染前校验+参数注入的方式实现需求:
- 首先在
values.yaml中新增主备镜像配置:
images: primary: "你的主镜像地址" fallback: "你的备选镜像地址"
- 编写Bash部署脚本,用
skopeo轻量工具(无需拉取完整镜像即可校验仓库镜像存在性)完成检查,再把最终使用的镜像传入Helm执行部署:
#!/bin/bash # 校验主镜像是否存在 if skopeo inspect docker://{{ .Values.images.primary }} > /dev/null 2>&1; then USE_IMAGE={{ .Values.images.primary }} else USE_IMAGE={{ .Values.images.fallback }} fi # 执行部署,注入最终镜像参数 helm upgrade --install 你的release名 你的chart路径 --set image.name=${USE_IMAGE}
- 原有Deployment模板无需修改,直接沿用
image: {{ .Values.image.name }}的配置即可。
Kubernetes 运行时实现(无侵入部署流程)
如果不想改动现有部署流程,可以通过Init Container的方式在集群内完成镜像校验和自动替换:
- 先创建一个拥有Deployment修改权限的ServiceAccount,再调整Deployment配置新增镜像检查Init Container:
spec: template: spec: serviceAccountName: 你创建的SA名 initContainers: - name: image-check image: 内置skopeo和kubectl的工具镜像 env: - name: PRIMARY_IMG value: {{ .Values.images.primary }} - name: FALLBACK_IMG value: {{ .Values.images.fallback }} - name: DEPLOY_NAME value: {{ .Release.Name }} - name: NAMESPACE value: {{ .Release.Namespace }} command: ["/bin/bash", "-c"] args: - | if skopeo inspect docker://${PRIMARY_IMG} > /dev/null 2>&1; then USE_IMG=${PRIMARY_IMG} else USE_IMG=${FALLBACK_IMG} fi kubectl patch deployment ${DEPLOY_NAME} -n ${NAMESPACE} -p '{"spec":{"template":{"spec":{"containers":[{"name":"{{ .Values.app.name }}","image":"'"${USE_IMG}"'"}]}}}}' containers: - name: {{ .Values.app.name }} image: {{ .Values.image.name }} imagePullPolicy: Always ports: - containerPort: 8081 env: - name: BACKEND_HOST value: {{ .Values.backend.host }}
其他可行方案
- 部署集群内镜像代理服务,收到镜像拉取请求时如果主镜像不存在,自动重定向到备选镜像地址,业务和部署流程无需任何改动
- 如果你用GitOps工具(Argo CD/FluxCD),可以配置同步前校验钩子,自动完成镜像检查和替换后再同步资源到集群
内容的提问来源于stack exchange,提问作者Fagam32
相关产品推荐
相关产品推荐

