
最近在搞一个多租户的 Kubernetes 平台,ArgoCD 负责 GitOps 的落地。说实话,之前一直觉得自己对这玩意儿挺熟的,但真正到了生产级的多团队、多集群场景,各种坑就开始冒出来了。
最近正好在 油管 上看了很多 GitOps/ArgoCD 的技术分享,又翻到了 Red Hat/ArgoCD 官方博客上关于 GitOps 的推荐实践,手痒的不行,结合这段时间的经历,把几个关键点沉淀下来,希望能给正在或即将上 GitOps 的兄弟们一些参考。
之前的文章介绍了 ArgoCD 的基本用法,但生产环境,光会配还不够,还得配得好。这次我们不讲概念,直接上实战要点,看看怎么让 ArgoCD 这个“GitOps 内核”跑得更稳。
ArgoCD 本身也是个 Pod,会消耗集群的 CPU 和内存。如果不设资源限制,它可能会吃掉一个节点的所有资源,影响集群上其他的业务 Pod。特别是在大规模集群或多集群模式下,ArgoCD 的 application-controller 和 repo-server 的负载会比较高(我的 application-controller 一个 pod 16G 内存),资源限制和请求一定要配。
我自己的经验是:
# argocd-cm.yaml 或者 Operator 的 spec
server:
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
controller:
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "1"
memory: "2Gi"
repoServer:
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"这个配置要根据你的集群规模和应用数量来调整,但记住一个原则:请求给足,限制给够。
ArgoCD 本身不强制你用 Helm 还是 Kustomize,但强烈建议不要直接管理原始的 YAML。
我个人更倾向于 Helm,因为它的模板化能力更强,而且生态更丰富(比如 ArtifactHub 上有一堆现成的 Chart)。但如果你做的是平台层面的配置(如 CRD、Operator),Kustomize 会更合适一些。
这是一个很容易被忽略的点。很多人直接把应用代码和 ArgoCD 的 Application 清单放在同一个 Git 仓库里。
这样做有什么问题?
Application 资源的权限(这可能会导致他们跳过审批直接上线)。最佳实践:
Application、AppProject、以及 Helm Chart 或 Kustomize 的 overlay 文件。由平台/SRE 团队维护,严格控制写权限。这是 Red Hat 官方推荐的一个实践,我认为是多租户场景下的核心要点。
想象一下:一个团队的应用 Application 资源被误删了,导致整个 ArgoCD 的 application-controller 需要重新同步,这个过程可能会影响到其他所有团队的应用部署。
解决方案:为不同的团队创建独立的 ArgoCD 实例。(当然, 也可以根据实际情况, 一个共享 ArgoCD 实例, 但是进行严格的 RBAC 权限限制.)
apiVersion: v1
kind: Namespace
metadata:
name: team-a-gitops
---
apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
name: team-a
namespace: team-a-gitops
spec:
# 为 team-a 配置独立的 repo server, controller, dex server 等
server:
route:
enabled: true
hostname: argocd-team-a.example.com
repo:
# 限制 team-a 只能访问哪些仓库
...上面是 openshift 下基于 argocd operator 的yaml. 通常我们要创建多个实例, 直接使用 helm chart 来部署多个实例即可.
注意:这听起来有些重,但在企业级场景下非常值得。每个实例都是自治的,一个团队的“瞎搞”不会影响集群的配置或别人的应用。
ArgoCD 靠声明式配置(Application、AppProject CRD)来管理。但这里有个坑:期望状态 ≠ 实际状态。
比如,你配了一个 Application,希望它创建三个 Deployment。但如果你在 Git 仓库里删了一个 Deployment 的 YAML 段,ArgoCD 会把它删掉。但如果有人在集群里手动 kubectl edit 改了某个字段,ArgoCD 会把它拉回 Git 里的状态。
那问题在哪?
syncPolicy,而忘记提交 Git,那这个期望状态和 Git 仓库就不一致了。Application 本身也会漂移:想象一下,你通过 Web UI 修改了 Application 的某个参数(比如 targetRevision 指向不同的分支),这个修改是不会自动同步回 Git 的。我的建议:
argocd app diff 检查:在 CI/CD 流程中,可以加一步脚本来运行 argocd app diff,跟 Git 仓库对比,确保没有意外的配置漂移。argocd_app_info,如果某个 Application 的状态变成了 OutOfSync,就触发告警。或者用 ArgoCD 的 notifications-controller 来发送告警通知。权限管理,在多团队场景下是必选项。AppProject 就是干这个的。
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-b-project
namespace: argocd
spec:
sourceRepos:
- 'https://gitlab.example.com/team-b/*' # 只能从 team-b 的仓库拉
destinations:
- namespace: 'team-b-*' # 只能部署到 team-b 相关的命名空间
server: 'https://kubernetes.default.svc'
clusterResourceWhitelist:
- group: '*'
kind: '*'
namespaceResourceWhitelist:
- group: '*'
kind: '*'AppProject 可以严格控制:
sourceRepos)能拉什么代码?destinations)能部署?clusterResourceWhitelist / namespaceResourceWhitelist)?说实话,这是 GitOps 多租户的基石,少了它,后面的隔离全是空谈。
最后想吐槽一句。网上有很多现成的“ArgoCD 最佳实践”模板,但这玩意儿不能直接套用。
Red Hat 的专家也说了:要根据你的组织结构和 YAML 管理工具来调整。
声明:本文所有实践建议,都来自我个人的生产实践和 Red Hat 官方推荐,不要无脑抄,要理解背后的原理。
ArgoCD 是一个很牛的工具,但用好它不光是要会配,更是要对 GitOps 的设计原则有深入理解。
知行合一。知道怎么配置只是第一步,动手去实践、去踩坑、去复盘,才能真的把 GitOps 变成你团队的基础设施。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。