You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动化修补指向外部源的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资源:

  1. 在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
  1. 修改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仓库,添加端口配置参数:

  1. Fork官方emissary-ingress的Helm仓库到自己的Git账户。
  2. 进入templates目录,修改Service模板文件,添加可配置的端口:
spec:
  ports:
  - name: name
    port: 8080
  {{- if .Values.additionalPorts }}
  {{- toYaml .Values.additionalPorts | nindent 2 }}
  {{- end }}
  1. 在values.yaml中添加默认配置:
additionalPorts: []
# 示例配置:
# additionalPorts:
# - name: new-port
#   port: 9090
#   targetPort: 9090
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:24:52