一、前言

ArgoCD 每三分钟会拉取一次 git 仓库的内容以检测 manifests 的变化。 为了消除这种轮询延迟,可以将 API 服务器配置为接收 webhook 事件的方式,这样就能实时获取到 Git 存储库中的变化了。

ArgoCD 支持来自 GitHub、GitLab、Bitbucket、Bitbucket Server 和 Gogs 的 Git webhook 通知。

GitLab Webhooks 的工作原理:

1)配置 Webhook;

2)Gitlab 通过 POST 发送请求;

3)ArgoCD 解析数据,同步最新配置。

自动同步参数:

ArgoCD 资源检测周期默认时间为 180s,如果要修改此配置,可以在 argocd-configmap 中新增配置:

timeout.reconciliation: 180s

二、Gitlab 配置 webhooks

官方数据: GitWebhook Configuration

依次点击【设置】-【网络】,勾选【允许来自webhooks和集成对本地网络的请求】,这一步如果不操作,可能会出现如下报错信息

# gitlab 10.6版本以后为了安全,默认不允许向本地网络发送webhook请求

Url is blocked: Requests to the local network are not allowed

image-20250424153535360

点击【系统钩子】,填写下面信息

  • URL:https://argocd.example.com/api/webhook

  • Secret令牌:<gitlab-webhook-secret>

  • 触发器勾选内容:仓库更新事件

  • SSL认证勾选内容:启用SSL验证

添加完上面信息后,点击【添加系统钩子】

image-20250422075202735

如果遇到下面问题

# gitlab 10.6版本以后为了安全,默认不允许向本地网络发送webhook请求

Url is blocked: Requests to the local network are not allowed

需要在【设置】-【网络】-【出站请求】,勾选"允许来自 webhooks 和集成对本地网络的请求"和"允许系统钩子向本地网络发送请求"

image-20250422075901934

英文版

Day17-ArgoCD-图18

SSL认证这里建议默认勾选,argocd 默认都是走https请求的。

Aspose.Words.cba18014-50b9-454d-ad05-ad5cb8373834.005

添加完成之后可以看到这个project里面就新增了一个 Project Hooks ,这时候还不能正常调用,我们还需要到 argocd 里面配置前面提到的 Secret token 。

Day17-ArgoCD-图20

argocd使用的 secret 都以 secrets 的形式存储在K8S中,我们这里主要用到的是 argocd-secret 。

[root@master01 myapp]# kubectl edit secrets -n argocd argocd-secret

我们在里面手动添加一个 stringData ,然后把前面的 Secret token 贴进去,格式类似下面的示范即可。

[root@master01 myapp]# kubectl edit secrets -n argocd argocd-secret

apiVersion: v1

kind: Secret

metadata:

  labels:

    app.kubernetes.io/name: argocd-secret

    app.kubernetes.io/part-of: argocd

  name: argocd-secret

type: Opaque

# 添加内容

stringData:

  webhook.gitlab.secret: <gitlab-webhook-secret>

配置完成后,一定需要先重启下 argocd-server ,不然就会遇到偶发 Webhook processing failed:X-Gitlab-Token validation failed

[root@master01 myapp]# kubectl rollout restart deploy argocd-server -nargocd

# 验证

[root@master01 myapp]# kgp -n argocd | grep argocd-server

argocd-server-7888cd489d-78w4q                     1/1     Running   0             107s

完成之后我们再回到 gitlab上面,点击 Test,选择 Push events ,如果这时候有下图所示的返回信息则说明已经配置成功且 webhook 可以正常工作。

Day17-ArgoCD-图21

中文版

image-20250421212522146

结果:

Hook executed successfully: HTTP 200

Day17-ArgoCD-图22

三、测试验证

1)代码更新

  • 新增 replicas:4 --> 2
[root@master01 ~]# cd /root/17/myapp/dev/

[root@master01 dev]# vim deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: myapp

  namespace: demo

spec:

  selector:

    matchLabels:

      app: myapp

  replicas: 2

  template:

    metadata:

      labels:

        app: myapp

    spec:

      containers:

      - name: myapp

        image: registry.cn-hangzhou.aliyuncs.com/abroad_images/nginx:1.15.12

        ports:

        - containerPort: 80

2)代码提交

[root@master01 ~]# cd /root/17/myapp/

[root@master01 myapp]# git commit -am "update myapp"

[root@master01 myapp]# git push

...

Username for 'http://gitlab.example.com': root

Password for 'http://root@gitlab.example.com': <gitlab-password>

...

3)查看 ArgoCD 应用日志

[root@master01 myapp]# kubectl logs -f argocd-server-7888cd489d-78w4q   -n argocd

time="2025-04-22T00:02:24Z" level=info msg="received unary call /application.ApplicationService/GetApplicationSyncWindows" grpc.method=GetApplicationSyncWindows grpc.request.claims="{\"exp\":1745365795,\"iat\":1745279395,\"iss\":\"argocd\",\"jti\":\"0bdab1da-185c-4292-8776-24b15957037a\",\"nbf\":1745279395,\"sub\":\"admin\"}" grpc.request.content="name:\"myapp\" appNamespace:\"argocd\" " grpc.service=application.ApplicationService grpc.start_time="2025-04-22T00:02:24Z" span.kind=server system=grpc

time="2025-04-22T00:02:24Z" level=info msg="received unary call /session.SessionService/GetUserInfo" grpc.method=GetUserInfo grpc.request.claims="{\"exp\":1745365795,\"iat\":1745279395,\"iss\":\"argocd\",\"jti\":\"0bdab1da-185c-4292-8776-24b15957037a\",\"nbf\":1745279395,\"sub\":\"admin\"}" grpc.request.content= grpc.service=session.SessionService grpc.start_time="2025-04-22T00:02:24Z" span.kind=server system=grpc

time="2025-04-22T00:02:24Z" level=info msg="finished unary call with code OK" grpc.code=OK grpc.method=GetUserInfo grpc.service=session.SessionService grpc.start_time="2025-04-22T00:02:24Z" grpc.time_ms=0.576 span.kind=server system=grpc

time="2025-04-22T00:02:24Z" level=info msg="finished unary call with code OK" grpc.code=OK grpc.method=GetApplicationSyncWindows grpc.service=application.ApplicationService grpc.start_time="2025-04-22T00:02:24Z" grpc.time_ms=8.505 span.kind=server system=grpc

time="2025-04-22T00:02:24Z" level=info msg="finished unary call with code OK" grpc.code=OK grpc.method=RevisionMetadata grpc.service=application.ApplicationService grpc.start_time="2025-04-22T00:02:24Z" grpc.time_ms=13.265 span.kind=server system=grpc

4)watch 观察实时应用动态

image-20250422080500531

5)如果未开启 automated sync ,通过如下命令开启:

[root@master01 ~]# argocd app set argocd/myapp --sync-policy automated

验证

[root@master01 ~]# kubectl get ingress -ndemo

NAME            CLASS   HOSTS                  ADDRESS     PORTS   AGE

nginx-ingress   nginx   nginx.example.com   <node-ip>   80      11h

image-20250422080725542

image-20250422080835572

四、遇到的问题

4.1 问题1

问题1报错:

Url is blocked: Requests to the local network are not allowed

问题1处理方法:

依次点击【设置】-【网络】,勾选【允许来自webhooks和集成对本地网络的请求】

image-20250424153535360

4.2 问题2

问题2报错:

Hook executed successfully but returned HTTP 400 Webhook processing failed: X-Gitlab-Token validation failed

问题2处理方法:

argocd使用的 secret 都以 secrets 的形式存储在K8S中,我们这里主要用到的是 argocd-secret 。

[root@master01 myapp]# kubectl edit secrets -n argocd argocd-secret

我们在里面手动添加一个 stringData ,然后把前面的 Secret token 贴进去,格式类似下面的示范即可。

[root@master01 myapp]# kubectl edit secrets -n argocd argocd-secret

apiVersion: v1

kind: Secret

metadata:

  labels:

    app.kubernetes.io/name: argocd-secret

    app.kubernetes.io/part-of: argocd

  name: argocd-secret

type: Opaque

# 添加内容

stringData:

  webhook.gitlab.secret: <gitlab-webhook-secret>

配置完成后,一定需要先重启下 argocd-server ,不然就会遇到偶发 Webhook processing failed:X-Gitlab-Token validation failed

[root@master01 myapp]# kubectl rollout restart deploy argocd-server -nargocd

# 验证

[root@master01 myapp]# kgp -n argocd | grep argocd-server

argocd-server-7888cd489d-78w4q                     1/1     Running   0             107s

完成之后我们再回到 gitlab上面,点击 Test,选择 Push events ,如果这时候有下图所示的返回信息则说明已经配置成功且 webhook 可以正常工作。