Argo CD 企业 GitOps 与租户隔离
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| CD | Continuous Delivery / Continuous Deployment | 持续交付/持续部署;是否自动上线取决于流程 |
| ESO | External Secrets Operator | 将外部秘密系统中的值同步到 Kubernetes 的控制器 |
| HA | High Availability | 高可用 |
| HPA | Horizontal Pod Autoscaler | Pod 水平自动扩缩容器 |
| OIDC | OpenID Connect | 基于 OAuth 2.0 的身份认证协议 |
| PDB | Pod Disruption Budget | Pod 中断预算,约束自愿驱逐 |
| RBAC | Role-Based Access Control | 基于角色的访问控制 |
| SA | Service Account | 服务账号,供程序或工作负载使用的身份 |
| SHA | Secure Hash Algorithm | 安全散列算法 |
| SSO | Single Sign-On | 单点登录 |
| TLS | Transport Layer Security | 传输层安全协议 |
场景:平台维护集群级组件,commerce 团队只能发布 orders。前置:基线、受保护的私有 Git、企业 OIDC、至少三台可调度节点;与 Flux 二选一管理同一批资源。
安装与权限边界#
固定已验证的 Argo CD release,下载该 tag 的 HA 安装清单,审查镜像/RBAC/资源、反亲和性和 Redis 配置后纳入平台 Git。HA 不等于数据库式的数据持久化,Git 和密钥/SSO 配置仍需可恢复。
export ARGO_VERSION='vREPLACE_VERSION'
curl -fsSL "https://raw.githubusercontent.com/argoproj/argo-cd/$ARGO_VERSION/manifests/ha/install.yaml" -o argocd-ha.yaml
kubectl create namespace argocd --dry-run=client -o yaml | kubectl apply -f -
kubectl apply --server-side -n argocd -f argocd-ha.yaml
kubectl -n argocd get deploy,statefulsets,pods安装清单只是基底:通过 overlay 加资源上限、跨节点/区分散、PDB、NetworkPolicy;仅私网 TLS 入口或受控 port-forward 访问管理 API。先验证 OIDC/应急身份,再禁用本地 admin。OIDC client secret 通过企业密钥系统注入,不写 ConfigMap/Git。安装与 HA
平台创建 AppProject,保存 orders-project.yaml:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata: {name: commerce, namespace: argocd}
spec:
sourceRepos: [https://git.example.com/commerce/orders-deploy.git]
destinations:
- namespace: orders
server: https://kubernetes.default.svc
clusterResourceWhitelist: []
namespaceResourceWhitelist:
- {group: apps, kind: Deployment}
- {group: "", kind: Service}
- {group: "", kind: ConfigMap}
- {group: policy, kind: PodDisruptionBudget}
- {group: autoscaling, kind: HorizontalPodAutoscaler}
roles:
- name: deployer
groups: [commerce-deployers]
policies:
- p, proj:commerce:deployer, applications, get, commerce/*, allow
- p, proj:commerce:deployer, applications, sync, commerce/*, allowNamespace、SA、ExternalSecret、网络策略、HTTPRoute 由平台 repo 管理,避免业务通过修改身份/入口扩大权限。按需求显式扩展白名单,不开 */*。AppProject 是 Argo 授权边界,还要限制 Argo 的目标集群凭据、Kubernetes RBAC,以及谁能修改 Project/Application;不得允许租户部署到 argocd namespace。Project 限制
Git 仓库用只读 deploy key 或受限 GitHub App;通过 Secret 声明 repository,凭据引用 ESO,禁止命令行打印 token。全局 RBAC 的默认角色不得授予写权限,显式将企业组绑定到 Project 角色。
Hands-on:受控发布订单服务#
保存 orders-application.yaml;targetRevision 替换为审核过的 commit SHA,路径包含已适配的真实业务清单。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata: {name: orders-staging, namespace: argocd}
spec:
project: commerce
source:
repoURL: https://git.example.com/commerce/orders-deploy.git
targetRevision: REPLACE_COMMIT_SHA
path: environments/staging
destination:
server: https://kubernetes.default.svc
namespace: orders
syncPolicy:
syncOptions: [PruneLast=true]kubectl apply -f orders-project.yaml -f orders-application.yaml
# 已完成 argocd CLI 的企业 SSO 登录。
argocd app diff orders-staging
argocd app sync orders-staging
argocd app wait orders-staging --health --sync --timeout 600首次不自动 prune。演练通过后,按环境启用自动 sync/selfHeal,并给生产设置发布窗口;删除资源先审查 diff。启用 HPA 后配置 replicas 的差异忽略和相应 sync 行为,不能与 HPA 抢副本数。
企业验收与恢复#
| 演练 | 必须看到 |
|---|---|
| 非 commerce 组登录 | 无发布权限;只读范围符合租户策略 |
| 提交 ClusterRole / 其他 namespace 资源 | Project/RBAC 拒绝,现有业务保持正常 |
| 修改预生产 Service 的受控字段 | OutOfSync 可见;selfHeal 开启时恢复 Git 状态 |
| 滚动重建一个 Argo 控制器 Pod | 业务继续服务,协调恢复;队列和告警可观测 |
| 发布不兼容镜像 | 业务验收失败,Git revert/固定旧 SHA 后重新 sync;数据库兼容性另验 |
Application 删除可能级联删除业务,finalizer/prune 需平台控制。Argo 故障通常不停止已运行业务,但新发布/自愈受影响;恢复 Git、仓库凭据、OIDC 和集群凭据后验证 diff,再开启自动化。
升级按 tag 在 staging 重放;记录同步延迟、错误、repo-server 性能和 HA 故障证据。参考 声明式配置。
完整部署参数#
锁定版本与完整生产配置提供实际 values、资源/分散/PDB、身份与网络配置,以及负向验收和恢复步骤。