GitOps 流程初探:利用 ArgoCD 打造自动化部署闭环
GitOps 是一种现代的持续交付(CD)实践,它将 Git 仓库作为唯一的“事实来源”(Single Source of Truth)。所有的系统状态,包括应用、基础设施和服务配置,都以声明式文件(通常是 YAML)的形式存储在 Git 中。ArgoCD 是 Kubernetes 生态中一个流行的声明式持续交付工具,它持续监控 Git 仓库的状态,并确保 Kubernetes 集群的实际状态与 Git 中定义的状态保持一致。
本文将聚焦于如何利用 ArgoCD,配置一个简单的应用,实现配置提交到 Git 仓库后,自动同步部署到 Kubernetes 集群的自动化流程。
前置条件
- 一个可用的 Kubernetes 集群(例如 Minikube 或云服务商提供的 K8s)。
- kubectl 命令行工具。
- 一个 Git 仓库(用于存放 K8s 配置文件)。
步骤一:安装 ArgoCD
首先,我们需要在 Kubernetes 集群中安装 ArgoCD。最常用的方式是使用其官方 YAML 文件进行安装。
# 1. 创建命名空间
kubectl create namespace argocd
# 2. 安装 ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 3. 暴露 ArgoCD API Server (示例:使用 LoadBalancer 或 NodePort)
# 如果使用本地环境,可能需要使用 port-forward
# kubectl port-forward svc/argocd-server -n argocd 8080:443
# 4. 获取初始管理员密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
步骤二:准备 Git 配置文件仓库
GitOps 的核心在于将 Kubernetes 资源配置文件存储在 Git 仓库中。我们创建一个名为 manifests 的目录,并在其中定义一个简单的 Nginx Deployment。
假设您的配置仓库地址是 https://github.com/your-user/gitops-config-repo.git,并且包含以下文件:
****manifests/deployment.yaml****
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitops-demo-app
labels:
app: gitops-demo
spec:
selector:
matchLabels:
app: gitops-demo
replicas: 1
template:
metadata:
labels:
app: gitops-demo
spec:
containers:
- name: web-container
# 初始版本 1.25.1
image: nginx:1.25.1
ports:
- containerPort: 80
将此文件提交并推送到您的 Git 仓库。
步骤三:定义 ArgoCD Application 资源
现在,我们告诉 ArgoCD 应该监控哪个 Git 仓库、哪个路径,以及将配置部署到哪个目标集群(本例中是 ArgoCD 自身所在的集群)。
创建一个 ArgoCD Application 定义文件 (argocd-app.yaml):
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-first-gitops-app
namespace: argocd
spec:
# 使用默认项目
project: default
# 定义应用来源
source:
repoURL: https://github.com/your-user/gitops-config-repo.git # 替换为您的仓库地址
targetRevision: HEAD # 监控最新提交
path: manifests # 配置文件在仓库中的路径
# 定义部署目标
destination:
server: https://kubernetes.default.svc # 部署到 ArgoCD 所在的集群
namespace: default # 部署到 default 命名空间
# 同步策略:关键的自动化配置
syncPolicy:
automated: # 启用自动化同步
prune: true # 允许删除集群中不再存在于 Git 中的资源
selfHeal: true # 如果集群资源被手动修改,ArgoCD 会自动修复,使其与 Git 状态保持一致
syncOptions:
- CreateNamespace=true # 如果目标命名空间不存在则创建
将此 argocd-app.yaml 文件应用到 Kubernetes 集群中(注意:这不需要提交到配置仓库,它属于 ArgoCD 的控制面配置)。
kubectl apply -f argocd-app.yaml -n argocd
步骤四:验证 GitOps 自动化闭环
一旦 Application 资源创建完成,ArgoCD 将自动执行以下操作:
- 连接到指定的 Git 仓库。
- 发现 manifests 路径下的 deployment.yaml。
- 将该 Deployment 资源同步到 default 命名空间。
您可以通过 ArgoCD UI 或命令行确认应用状态变为 Synced 和 Healthy。
触发自动化部署(代码提交即部署):
现在,我们模拟一次代码变更。我们将应用的版本从 nginx:1.25.1 升级到 nginx:1.26.0。
修改 ****manifests/deployment.yaml**** 文件:
# ... (省略上文)
containers:
- name: web-container
image: nginx:1.26.0 # <--- 版本升级!
ports:
# ... (省略下文)
提交并推送此变更到 Git 仓库:
git add manifests/deployment.yaml
git commit -m "Upgrade nginx to 1.26.0"
git push origin main
由于我们在 Application 中配置了 syncPolicy.automated,ArgoCD 会在默认的同步间隔(通常是 3 分钟)内检测到 Git 仓库的变更。
观察结果:
- 在 ArgoCD UI 中,您会看到 my-first-gitops-app 的状态从 Synced 暂时变为 OutOfSync。
- 紧接着,ArgoCD 会自动开始同步操作。
- gitops-demo-app Deployment 将执行滚动更新,将旧的 nginx:1.25.1 Pods 替换为新的 nginx:1.26.0 Pods。
- 同步完成后,状态再次回到 Synced 和 Healthy。
至此,我们成功地利用 ArgoCD 建立了 GitOps 自动化闭环:所有的部署操作都通过提交代码到 Git 仓库来驱动,无需手动操作 Kubernetes 集群,实现了基础设施和应用状态的声明式管理。
汤不热吧