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

如何配置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点,以及周末零点执行):
    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: OnFailure
    
    周末全天暂停的CronJob:
    apiVersion: 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触发同步。

具体操作:

  1. 写个简单的服务(比如用Python Flask),逻辑很简单:接收Git的Webhook请求,判断当前时间是否在允许时段(比如非周末、晚8点后),符合条件就调用ArgoCD的同步API。
  2. 把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:21:28