GitOps 与 Argo CD
GitOps 是一种基于 Git 的集群声明式管理和持续交付方法。Argo CD 是一个开源的 GitOps 工具,提供声明式、自动化、GitOps 驱动的 Kubernetes 应用程序部署和生命周期管理。
GitOps 与 Argo CD 架构
graph TB
subgraph "Git 仓库"
REPO[Git Repository]
BRANCH[分支: main
分支: dev]
end
subgraph "Argo CD"
ARGO[Argo CD Server]
API[Argo CD API]
RECONCILER[应用同步器]
end
subgraph "Kubernetes 集群"
K8S[K8s 集群]
DEPLOY[部署资源]
SVC[服务资源]
end
REPO --> ARGO
ARGO --> RECONCILER
RECONCILER --> K8S
K8S --> API
API --> REPO
BRANCH --> REPO
DEPLOY --> K8S
SVC --> K8S
GitOps 与传统 CI/CD 对比
| 对比项 | 传统 CI/CD | GitOps |
|---|---|---|
| 部署触发 | CI/CD 管道触发部署 | Git 仓库状态变化触发同步 |
| 配置管理 | 配置可能散落在不同系统 | 所有配置存储在 Git 仓库 |
| 状态一致性 | 难以保证状态一致性 | 持续监控,自动同步至期望状态 |
| 审计追踪 | 分散在多个系统 | Git 提供完整审计追踪 |
| 回滚机制 | 需要专门的回滚流程 | Git commit 回退即回滚 |
Argo CD 安装与配置
Argo CD 由几个核心组件构成,包括 API 服务器、数据库、应用控制器和仓库服务器。
1. Argo CD 部署清单
# Argo CD 基础部署
apiVersion: v1
kind: Namespace
metadata:
name: argocd
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-server
namespace: argocd
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: argocd-server
template:
metadata:
labels:
app.kubernetes.io/name: argocd-server
spec:
containers:
- name: argocd-server
image: quay.io/argoproj/argocd:v2.7.10
command:
- argocd-server
- --staticassets
- /shared/app
- --insecure
ports:
- name: http
protocol: TCP
containerPort: 8080
- name: https
protocol: TCP
containerPort: 8080
2. Argo CD Service 与 Ingress
# Argo CD 服务配置
apiVersion: v1
kind: Service
metadata:
name: argocd-server
namespace: argocd
spec:
type: ClusterIP
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
- name: https
protocol: TCP
port: 443
targetPort: 8080
selector:
app.kubernetes.io/name: argocd-server
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-ingress
namespace: argocd
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
rules:
- host: argocd.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443
Argo CD Application 配置
Argo CD Application 定义了从 Git 仓库同步到 Kubernetes 集群的应用部署。
1. Application CRD 配置示例
# Argo CD Application 配置
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/username/myapp.git
targetRevision: HEAD
path: k8s/overlays/prod
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
2. Argo CD Project 配置
# Argo CD Project 定义
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: default
namespace: argocd
spec:
description: Default Argo CD Project
destinations:
- namespace: '*'
server: https://kubernetes.default.svc
sourceRepos:
- '*'
clusterResourceWhitelist:
- group: '*'
kind: '*'
namespaceResourceWhitelist:
- group: '*'
kind: '*'
GitOps 工作流程
GitOps 的核心是将系统声明状态存储在 Git 仓库中,Argo CD 持续监控集群状态并自动同步到期望状态。
sequenceDiagram
participant Dev as 开发者
participant Git as Git 仓库
participant ArgoCD as Argo CD
participant K8s as Kubernetes 集群
Dev->>Git: 提交配置更改
Git-->>ArgoCD: 变更通知
ArgoCD->>Git: 拉取最新配置
ArgoCD->>K8s: 部署/更新资源
K8s-->>ArgoCD: 当前状态
ArgoCD->>ArgoCD: 比较期望状态与实际状态
Note over ArgoCD,K8s: 持续监控和同步
Argo CD 同步策略
Argo CD 提供多种同步策略,以满足不同的部署需求。
自动同步 (Automated Sync)
- 当 Git 仓库中的配置发生变化时自动同步
- 需要配置 selfHeal 以自动修复偏移
- 适合生产环境的声明式管理
手动同步 (Manual Sync)
- 通过 UI 或 CLI 手动触发同步
- 提供更精细的控制
- 适合需要人工审批的场景
自动同步配置示例
# 自动同步配置
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-autosync
namespace: argocd
spec:
source:
repoURL: https://github.com/username/myapp.git
targetRevision: HEAD
path: k8s
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
- Validate=false
- SkipDryRunOnMissingResource=true
Argo CD 与 Helm 集成
Argo CD 可以直接管理 Helm charts,提供对 Helm 应用的声明式管理和同步。
Helm Chart 作为 Argo CD 应用
# 使用 Helm Chart 的 Argo CD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-helm
namespace: argocd
spec:
source:
repoURL: https://charts.helm.sh/stable
chart: nginx-ingress
targetRevision: 1.41.3
helm:
releaseName: my-nginx-ingress
valueFiles:
- values.yaml
parameters:
- name: controller.service.type
value: LoadBalancer
- name: controller.service.loadBalancerIP
value: 10.10.10.10
destination:
server: https://kubernetes.default.svc
namespace: nginx-ingress
syncPolicy:
automated:
prune: true
selfHeal: true
Argo CD 与 Kustomize 集成
Argo CD 内置支持 Kustomize,可以直接使用 Kustomize 的基础和覆盖层功能。
Kustomize 作为 Argo CD 应用源
# 使用 Kustomize 的 Argo CD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-kustomize
namespace: argocd
spec:
source:
repoURL: https://github.com/username/myapp.git
targetRevision: HEAD
path: k8s/base
kustomize:
namePrefix: prod-
nameSuffix: -v1
images:
- myapp:1.2.3
replicas:
- name: myapp
count: 3
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
automated:
prune: true
selfHeal: true
GitOps 最佳实践
安全最佳实践
- 使用 RBAC 限制对 Argo CD 的访问
- 通过项目 (Project) 限制可部署的资源类型
- 使用安全的 Git 仓库访问方式
- 启用审计日志记录所有操作
操作最佳实践
- 使用自动同步与自愈功能
- 定期备份 Argo CD 配置
- 实施适当的健康检查
- 配置通知和告警
GitOps 故障排除
| 常见问题 | 可能原因 | 解决方案 |
|---|---|---|
| 应用无法同步 | Git 仓库访问问题 | 验证仓库 URL、认证凭据和网络连接 | 同步冲突 | 手动修改了集群资源 | 使用 'replace' 或 'force' 选项同步 |
| 健康检查失败 | 资源定义不正确 | 检查资源定义和健康检查配置 |
| 权限不足 | RBAC 配置不当 | 配置正确的 RBAC 角色和绑定 |
| 性能问题 | 同步频率过高 | 调整同步间隔和资源限制 |
常用命令
# 安装 Argo CD CLI
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
# 登录 Argo CD 服务器
argocd login argocd-server.example.com --username admin --password $(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2)
# 创建应用
argocd app create myapp --repo https://github.com/username/myapp.git --path k8s --dest-server https://kubernetes.default.svc --dest-namespace myapp
# 同步应用
argocd app sync myapp
# 查看应用状态
argocd app get myapp
# 启用自动同步
argocd app set myapp --sync-policy automated