用乐高与Crickit自制谐波绘图机:从利萨如图形到创意艺术
2026/5/16 2:50:02
GitOps 是一种将基础设施和应用部署视为代码的运维方法。本文将深入探讨 GitOps 的核心概念、工具链和最佳实践。
┌─────────────────────────────────────────────────────────────┐ │ GitOps 架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Git 仓库 │ │ │ │ - 基础设施即代码 │ │ │ │ - 应用配置 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ CI/CD 流水线 │ │ │ │ - 代码验证 │ │ │ │ - 镜像构建 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ GitOps 控制器 │ │ │ │ - Argo CD / Flux │ │ │ │ - 同步应用 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Kubernetes 集群 │ │ │ │ - 应用部署 │ │ │ │ - 资源配置 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘| 原则 | 描述 | 作用 |
|---|---|---|
| 声明式配置 | 使用声明式定义期望状态 | 简化配置管理 |
| 版本控制 | 所有配置存储在 Git | 可追溯、可审计 |
| 自动化同步 | 自动将配置应用到集群 | 减少人工干预 |
| 回滚机制 | 基于 Git 历史回滚 | 快速恢复 |
# 安装 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 -dapiVersion: 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=trueapiVersion: 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 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 \ --personalapiVersion: 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: clientmy-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/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 pushmain # 生产环境配置 ├── staging # 预发环境配置 └── dev # 开发环境配置apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: syncPolicy: syncOptions: - Validate=true - SkipDryRunOnMissingResource=trueapiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: syncPolicy: automated: prune: true selfHeal: true allowEmpty: falseapiVersion: 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: 30s# 查看同步历史 argocd app history my-app # 查看同步日志 argocd app logs my-app # 查看应用状态 argocd app get my-appapiVersion: 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 }}"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"]apiVersion: v1 kind: Secret metadata: name: my-app-secrets annotations: argocd.argoproj.io/sync-wave: "0" type: Opaque data: DATABASE_PASSWORD: <base64-encoded-password># 使用 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问题分析:
解决方案:
# 查看应用状态 argocd app get my-app # 查看同步日志 argocd app logs my-app # 手动同步 argocd app sync my-app问题分析:
解决方案:
# 查看历史版本 argocd app history my-app # 回滚到特定版本 argocd app rollback my-app --revision <revision>问题分析:
解决方案:
syncPolicy: automated: selfHeal: trueGitOps 是一种现代化的运维方法,通过将基础设施和应用配置纳入版本控制,实现自动化部署和管理。Argo CD 和 Flux CD 是实现 GitOps 的主流工具,通过合理配置可以构建可靠、可追溯的部署流程。遵循最佳实践能够确保 GitOps 工作流的稳定性和安全性。