如何配置ArgoCD仅在特定时段(如晚8点后)更新应用?
如何用ArgoCD实现特定时段部署应用?
可以实现,ArgoCD本身没有原生的时段调度功能,但通过结合外部工具或自定义逻辑能达成需求,下面是几种实用方案:
方案1:用CronJob定时控制Application的同步开关
ArgoCD允许通过spec.syncPolicy.paused字段暂停/恢复应用的自动同步。我们可以借助Kubernetes的CronJob,定时执行命令来切换这个状态——在允许部署的时段打开同步,其他时段关闭,这样Git仓库有变更也不会自动发布。
具体操作:
- 创建恢复同步的CronJob(比如周一到周五晚8点执行):
apiVersion: batch/v1 kind: CronJob metadata: name: argocd-resume-sync namespace: argocd spec: schedule: "0 20 * * 1-5" # K8s Cron格式:分 时 日 月 周(0=周日,6=周六) jobTemplate: spec: template: spec: containers: - name: kubectl image: bitnami/kubectl:latest command: ["kubectl", "patch", "app", "<你的应用名>", "-n", "argocd", "-p", '{"spec":{"syncPolicy":{"paused":false}}}', "--type", "merge"] restartPolicy: OnFailure - 创建暂停同步的CronJob(比如周一到周五早7点,以及周末零点执行):
周末全天暂停的CronJob:apiVersion: batch/v1 kind: CronJob metadata: name: argocd-pause-sync-workday namespace: argocd spec: schedule: "0 7 * * 1-5" jobTemplate: spec: template: spec: containers: - name: kubectl image: bitnami/kubectl:latest command: ["kubectl", "patch", "app", "<你的应用名>", "-n", "argocd", "-p", '{"spec":{"syncPolicy":{"paused":true}}}', "--type", "merge"] restartPolicy: OnFailureapiVersion: batch/v1 kind: CronJob metadata: name: argocd-pause-sync-weekend namespace: argocd spec: schedule: "0 0 * * 0,6" # 周日和周六零点执行 jobTemplate: spec: template: spec: containers: - name: kubectl image: bitnami/kubectl:latest command: ["kubectl", "patch", "app", "<你的应用名>", "-n", "argocd", "-p", '{"spec":{"syncPolicy":{"paused":true}}}', "--type", "merge"] restartPolicy: OnFailure
优缺点:操作简单,不用额外复杂服务;但只能控制同步开关,允许时段内Git有多次变更的话,ArgoCD会自动同步所有变更,没法只触发一次最新版本的部署。
方案2:通过中间Webhook服务过滤时段后触发同步
如果想更精准控制——只有在允许时段内,Git有变更才触发一次同步,可以加个中间Webhook服务:把Git仓库的变更通知先发到这个服务,它检查当前时间是否符合要求,符合的话再调用ArgoCD的API触发同步。
具体操作:
- 写个简单的服务(比如用Python Flask),逻辑很简单:接收Git的Webhook请求,判断当前时间是否在允许时段(比如非周末、晚8点后),符合条件就调用ArgoCD的同步API。
- 把Git仓库的Webhook地址指向这个中间服务。
示例Python代码片段:
from flask import Flask, request import requests from datetime import datetime app = Flask(__name__) # 替换成你的ArgoCD API地址和服务账号Token ARGOCD_API = "https://argocd-server.argocd.svc.cluster.local/api/v1/applications/<你的应用名>/sync" ARGOCD_TOKEN = "<你的ArgoCD服务账号Token>" def is_allowed_time(): now = datetime.now() # 非周末(周一到周五,weekday()返回0=周一,4=周五)且时间>=20点 return now.weekday() <= 4 and now.hour >= 20 @app.route('/git-webhook', methods=['POST']) def handle_webhook(): if is_allowed_time(): headers = {"Authorization": f"Bearer {ARGOCD_TOKEN}"} # 调用ArgoCD同步API requests.post(ARGOCD_API, headers=headers, json={"syncPolicy": {"prune": True, "selfHeal": True}}) return "Sync triggered", 200 else: return "Skipped: not in deployment window", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
优缺点:灵活度高,能精准控制触发时机;但需要额外部署和维护中间服务,增加了一点架构复杂度。
方案3:ArgoCD Enterprise版的Sync Windows(原生支持)
如果你用的是ArgoCD Enterprise版本,它自带Sync Windows功能,可以直接定义允许同步的时间窗口,只有在窗口内才允许应用同步。
配置示例:
apiVersion: argoproj.io/v1alpha1 kind: SyncWindow metadata: name: production-deployment-window namespace: argocd spec: applications: - <你的应用名> # 支持通配符,比如prod-* schedule: "0 20 * * 1-5" # 周一到周五晚8点开始 duration: "4h" # 窗口持续4小时 kind: allow # 允许在窗口内同步 syncPolicy: automated: {} # 匹配自动同步策略
优缺点:原生支持,不用额外工具;但仅适用于付费的Enterprise版本,开源社区版用不了。
内容的提问来源于stack exchange,提问作者user5580578
相关产品推荐
相关产品推荐

