Kubernetes GitOps实践指南
Kubernetes GitOps实践指南
引言
GitOps 是一种将基础设施和应用部署视为代码的运维方法。本文将深入探讨 GitOps 的核心概念、工具链和最佳实践。
一、GitOps 架构
1.1 GitOps 工作流程
┌─────────────────────────────────────────────────────────────┐ │ GitOps 架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Git 仓库 │ │ │ │ - 基础设施即代码 │ │ │ │ - 应用配置 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ CI/CD 流水线 │ │ │ │ - 代码验证 │ │ │ │ - 镜像构建 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ GitOps 控制器 │ │ │ │ - Argo CD / Flux │ │ │ │ - 同步应用 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Kubernetes 集群 │ │ │ │ - 应用部署 │ │ │ │ - 资源配置 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘1.2 GitOps 核心原则
| 原则 | 描述 | 作用 |
|---|---|---|
| 声明式配置 | 使用声明式定义期望状态 | 简化配置管理 |
| 版本控制 | 所有配置存储在 Git | 可追溯、可审计 |
| 自动化同步 | 自动将配置应用到集群 | 减少人工干预 |
| 回滚机制 | 基于 Git 历史回滚 | 快速恢复 |
二、Argo CD 部署与配置
2.1 Argo CD 安装
# 安装 Argo CD kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # 暴露 Argo CD UI kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}' # 获取初始密码 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d2.2 Argo CD 应用配置
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app namespace: argocd spec: project: default source: repoURL: https://github.com/my-org/my-app.git targetRevision: HEAD path: k8s/manifests helm: values: replicaCount: 3 image: tag: latest destination: server: https://kubernetes.default.svc namespace: default syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true2.3 Argo CD 项目配置
apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: name: my-project namespace: argocd spec: description: "My project" sourceRepos: - https://github.com/my-org/* destinations: - namespace: "*" server: https://kubernetes.default.svc clusterResourceWhitelist: - group: "*" kind: "*" roles: - name: developer description: "Developer role" policies: - p, proj:my-project:developer, applications, get, my-project/*, allow - p, proj:my-project:developer, applications, sync, my-project/*, allow三、Flux CD 部署与配置
3.1 Flux CD 安装
# 安装 Flux CLI curl -s https://fluxcd.io/install.sh | sudo bash # 检查 Flux 安装需求 flux check --pre # 初始化 Flux flux bootstrap github \ --owner=my-org \ --repository=my-flux-config \ --branch=main \ --path=./clusters/my-cluster \ --personal3.2 Flux CD 配置
apiVersion: source.toolkit.fluxcd.io/v1beta2 kind: GitRepository metadata: name: my-app namespace: flux-system spec: interval: 1m0s url: https://github.com/my-org/my-app.git ref: branch: main --- apiVersion: kustomize.toolkit.fluxcd.io/v1beta2 kind: Kustomization metadata: name: my-app namespace: flux-system spec: interval: 10m0s path: ./k8s prune: true sourceRef: kind: GitRepository name: my-app validation: client四、GitOps 工作流程
4.1 配置仓库结构
my-app/ ├── k8s/ │ ├── base/ │ │ ├── deployment.yaml │ │ ├── service.yaml │ │ └── kustomization.yaml │ └── overlays/ │ ├── dev/ │ │ ├── deployment-patch.yaml │ │ └── kustomization.yaml │ ├── staging/ │ │ ├── deployment-patch.yaml │ │ └── kustomization.yaml │ └── prod/ │ ├── deployment-patch.yaml │ └── kustomization.yaml └── helm/ ├── Chart.yaml ├── values.yaml └── templates/4.2 CI/CD 流水线配置
name: CI/CD on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build and push Docker image uses: docker/build-push-action@v2 with: context: . push: true tags: my-registry/my-app:${{ github.sha }} - name: Update deployment manifest run: | sed -i "s|image: my-app:.*|image: my-registry/my-app:${{ github.sha }}|" k8s/base/deployment.yaml - name: Commit changes run: | git config user.name "GitHub Actions" git config user.email "actions@github.com" git add k8s/base/deployment.yaml git commit -m "Update image tag to ${{ github.sha }}" git push五、GitOps 最佳实践
5.1 分支策略
main # 生产环境配置 ├── staging # 预发环境配置 └── dev # 开发环境配置5.2 配置验证
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: syncPolicy: syncOptions: - Validate=true - SkipDryRunOnMissingResource=true5.3 自动化同步
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: syncPolicy: automated: prune: true selfHeal: true allowEmpty: false六、GitOps 监控与审计
6.1 Argo CD 监控
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: argocd-metrics namespace: argocd spec: selector: matchLabels: app.kubernetes.io/name: argocd-metrics endpoints: - port: metrics interval: 30s6.2 审计日志
# 查看同步历史 argocd app history my-app # 查看同步日志 argocd app logs my-app # 查看应用状态 argocd app get my-app6.3 告警配置
apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: argocd-alerts spec: groups: - name: argocd_rules rules: - alert: ApplicationOutOfSync expr: argocd_app_sync_status{sync_status!="Synced"} > 0 for: 5m labels: severity: warning annotations: summary: "应用 {{ $labels.name }} 未同步" description: "应用 {{ $labels.name }} 当前状态: {{ $labels.sync_status }}"七、GitOps 安全实践
7.1 访问控制
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: argo-cd-user namespace: argocd rules: - apiGroups: ["argoproj.io"] resources: ["applications"] verbs: ["get", "list", "watch"]7.2 密钥管理
apiVersion: v1 kind: Secret metadata: name: my-app-secrets annotations: argocd.argoproj.io/sync-wave: "0" type: Opaque data: DATABASE_PASSWORD: <base64-encoded-password>7.3 签名验证
# 使用 Cosign 验证镜像 cosign verify my-registry/my-app:latest # 配置 Argo CD 验证 apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: source: helm: verify: true八、常见问题与解决方案
8.1 同步失败
问题分析:
- 配置语法错误
- 资源冲突
- 权限不足
解决方案:
# 查看应用状态 argocd app get my-app # 查看同步日志 argocd app logs my-app # 手动同步 argocd app sync my-app8.2 回滚失败
问题分析:
- Git 历史问题
- 资源状态不一致
- 依赖缺失
解决方案:
# 查看历史版本 argocd app history my-app # 回滚到特定版本 argocd app rollback my-app --revision <revision>8.3 配置漂移
问题分析:
- 手动修改集群资源
- 外部因素导致配置变化
- 同步策略未启用
解决方案:
syncPolicy: automated: selfHeal: true结论
GitOps 是一种现代化的运维方法,通过将基础设施和应用配置纳入版本控制,实现自动化部署和管理。Argo CD 和 Flux CD 是实现 GitOps 的主流工具,通过合理配置可以构建可靠、可追溯的部署流程。遵循最佳实践能够确保 GitOps 工作流的稳定性和安全性。
