一、前言¶
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

点击【系统钩子】,填写下面信息
-
URL:https://argocd.example.com/api/webhook
-
Secret令牌:<gitlab-webhook-secret>
-
触发器勾选内容:仓库更新事件
-
SSL认证勾选内容:启用SSL验证
添加完上面信息后,点击【添加系统钩子】

如果遇到下面问题
# gitlab 10.6版本以后为了安全,默认不允许向本地网络发送webhook请求
Url is blocked: Requests to the local network are not allowed
需要在【设置】-【网络】-【出站请求】,勾选"允许来自 webhooks 和集成对本地网络的请求"和"允许系统钩子向本地网络发送请求"

英文版

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

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

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 可以正常工作。

中文版

结果:
Hook executed successfully: HTTP 200

三、测试验证¶
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 观察实时应用动态

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


四、遇到的问题¶
4.1 问题1¶
问题1报错:
Url is blocked: Requests to the local network are not allowed
问题1处理方法:
依次点击【设置】-【网络】,勾选【允许来自webhooks和集成对本地网络的请求】

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 可以正常工作。