如何自动化修补指向外部源的ArgoCD Application
问题:自动化为ArgoCD部署的Service添加端口
现有配置
ArgoCD Application 清单
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: emissary namespace: argocd spec: destination: namespace: emissary server: https://kubernetes.default.svc project: admin sources: - repoURL: 'ambassador' # 实际使用正确源,此处为示例 targetRevision: 8.9.1 chart: emissary-ingress
Helm Chart 中的 Service 资源片段
spec: ports: - name: name port: 8080 ...
当前手动流程
部署完成后手动执行以下命令:
kubectl patch svc svc-name --patch-file patch.yaml kubectl rollout restart deployment deployment-name
需求
希望将上述手动操作自动化,但该Service的端口参数无法通过Helm values配置,需要可行的自动化方案。
可行解决方案
方案1:使用ArgoCD集成Kustomize(推荐)
利用ArgoCD对Kustomize的原生支持,通过Kustomize的patch功能修改Service资源:
- 在Git仓库中创建一个kustomization目录(比如
emissary-kustomize),添加kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - <对应版本Helm chart的资源包地址> # 从官方release页面获取对应版本的chart包URL patches: - target: kind: Service name: svc-name # 替换为实际Service名称 patch: |- - op: add path: /spec/ports/- value: name: new-port port: 9090 targetPort: 9090
- 修改ArgoCD Application的
sources,将Kustomize作为主源:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: emissary namespace: argocd spec: destination: namespace: emissary server: https://kubernetes.default.svc project: admin sources: - repoURL: '你的Git仓库地址' # 存放kustomization.yaml的仓库地址 targetRevision: main path: emissary-kustomize
ArgoCD会自动应用Kustomize的patch,无需手动操作。
方案2:使用ArgoCD Sync Hooks
通过ArgoCD的PostSync钩子,在应用同步完成后自动执行patch和重启命令:
修改ArgoCD Application配置,添加syncPolicy:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: emissary namespace: argocd spec: destination: namespace: emissary server: https://kubernetes.default.svc project: admin sources: - repoURL: 'ambassador' # 实际使用正确源,此处为示例 targetRevision: 8.9.1 chart: emissary-ingress syncPolicy: hooks: - name: patch-service-and-restart kind: Job sync: hook: PostSync deletionPolicy: HookSucceeded job: backoffLimit: 2 template: spec: containers: - name: kubectl image: bitnami/kubectl:latest command: - /bin/sh - -c - | kubectl patch svc svc-name -n emissary --patch '{"spec":{"ports":[{"name":"new-port","port":9090,"targetPort":9090}]}}' kubectl rollout restart deployment deployment-name -n emissary restartPolicy: OnFailure
方案3:Fork并自定义Helm Chart
如果允许修改Chart源,可以fork原Helm仓库,添加端口配置参数:
- Fork官方emissary-ingress的Helm仓库到自己的Git账户。
- 进入
templates目录,修改Service模板文件,添加可配置的端口:
spec: ports: - name: name port: 8080 {{- if .Values.additionalPorts }} {{- toYaml .Values.additionalPorts | nindent 2 }} {{- end }}
- 在
values.yaml中添加默认配置:
additionalPorts: [] # 示例配置: # additionalPorts: # - name: new-port # port: 9090 # targetPort: 9090
- 修改ArgoCD Application的
repoURL为你fork后的仓库地址,在values中配置additionalPorts:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: emissary namespace: argocd spec: destination: namespace: emissary server: https://kubernetes.default.svc project: admin sources: - repoURL: '你的fork仓库地址' targetRevision: main chart: emissary-ingress helm: values: | additionalPorts: - name: new-port port: 9090 targetPort: 9090
内容的提问来源于stack exchange,提问作者Francesco Biancucci
相关产品推荐
相关产品推荐

