如何在ArgoCD的PreSync和PostSync阶段更新同一NetworkPolicy对象?
解决同一NetworkPolicy在ArgoCD PreSync/PostSync阶段分别更新的问题
Kustomize会合并同名同类型的资源,直接修改同一个NetworkPolicy的hook注解只会保留最后一次配置。要实现两次更新,有两种可行方案:
方案1:通过独立Hook Job执行kubectl命令
创建两个独立的Job资源,分别绑定PreSync和PostSync钩子,通过kubectl命令直接修改目标NetworkPolicy。
示例配置:
PreSync阶段的更新Job
apiVersion: batch/v1 kind: Job metadata: name: update-networkpolicy-presync annotations: argocd.argoproj.io/hook: PreSync argocd.argoproj.io/hook-delete-policy: HookSucceeded # 执行成功后自动删除Job spec: template: spec: restartPolicy: OnFailure containers: - name: kubectl image: bitnami/kubectl:latest command: - kubectl - patch - networkpolicy - <你的NetworkPolicy名称> - -n - <目标命名空间> - -p - '{"spec": {"ingress": [{"from": [{"ipBlock": {"cidr": "10.0.0.0/24"}}]}]}}' # PreSync阶段需要的配置
PostSync阶段的更新Job
apiVersion: batch/v1 kind: Job metadata: name: update-networkpolicy-postsync annotations: argocd.argoproj.io/hook: PostSync argocd.argoproj.io/hook-delete-policy: HookSucceeded spec: template: spec: restartPolicy: OnFailure containers: - name: kubectl image: bitnami/kubectl:latest command: - kubectl - patch - networkpolicy - <你的NetworkPolicy名称> - -n - <目标命名空间> - -p - '{"spec": {"ingress": [{"from": [{"ipBlock": {"cidr": "192.168.0.0/24"}}]}]}}' # PostSync阶段需要的配置
将这两个Job加入Kustomize的resources列表即可,Kustomize不会合并它们,ArgoCD会在对应阶段执行。
方案2:生成带后缀的NetworkPolicy变体 + Hook删除策略
基于基础NetworkPolicy生成两个带名称后缀的变体,分别绑定PreSync和PostSync钩子,利用Hook删除策略让PreSync版本执行后自动删除,最终保留PostSync版本。
示例配置:
基础NetworkPolicy(base/networkpolicy.yaml)
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: my-networkpolicy namespace: default spec: podSelector: matchLabels: app: my-app policyTypes: - Ingress
Kustomization.yaml配置
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - base/networkpolicy.yaml # PreSync阶段的变体 patches: - target: kind: NetworkPolicy name: my-networkpolicy patch: |- - op: add path: /metadata/name value: my-networkpolicy-presync - op: add path: /metadata/annotations/argocd.argoproj.io~1hook value: PreSync - op: add path: /metadata/annotations/argocd.argoproj.io~1hook-delete-policy value: HookSucceeded - op: replace path: /spec/ingress value: - from: - ipBlock: cidr: 10.0.0.0/24 # PostSync阶段的变体 - target: kind: NetworkPolicy name: my-networkpolicy patch: |- - op: add path: /metadata/name value: my-networkpolicy-postsync - op: add path: /metadata/annotations/argocd.argoproj.io~1hook value: PostSync - op: replace path: /spec/ingress value: - from: - ipBlock: cidr: 192.168.0.0/24
这个方案中,PreSync版本会在同步前创建并应用,执行成功后自动删除;PostSync版本会在同步完成后创建,作为最终的NetworkPolicy配置。
内容的提问来源于stack exchange,提问作者Vishwanath Joshi
相关产品推荐
相关产品推荐

