2. 部署第一个应用", "title": "部署第一个应用

任务目标

本案例将使用 Argo CD 以 GitOps 方式部署一个 nginx 应用。你将创建一个包含 Kubernetes 资源配置的 Git 仓库,配置 Argo CD 应用程序(Application)指向该仓库,并验证 Argo CD 能够自动将应用同步到集群中。

前置条件

  • 一个可用的 Kubernetes 集群(如 kind、minikube 或云厂商集群)
  • 集群中已安装 Argo CD(安装命令参考:kubectl create namespace argocd && kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml)
  • 一个 Git 仓库(GitHub、GitLab 或本地 Git 服务器均可)

实现步骤

1. 准备 Git 仓库中的 Kubernetes 清单

在 Git 仓库中创建以下目录结构,用于存放 nginx 应用的部署清单。这里使用 Kustomize 来组织资源,这是 Argo CD 最常用的方式之一。

nginx-app/
├── deployment.yaml
├── service.yaml
└── kustomization.yaml

deployment.yaml 内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80

service.yaml 内容如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

kustomization.yaml 内容如下:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml

将这些文件推送到你的 Git 仓库中,记录下仓库的 URL 和包含这些文件的路径(例如 nginx-app 目录)。

2. 通过 Argo CD CLI 创建 Application

首先,使用 Argo CD CLI 登录服务器(默认密码为 admin 服务初始密码,可通过 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d 获取):

argocd login <ARGOCD_SERVER> --username admin

然后创建 Application,将 <YOUR_REPO_URL> 替换为你的 Git 仓库地址:

argocd app create nginx-app \
  --repo <YOUR_REPO_URL> \
  --path nginx-app \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default \
  --sync-policy automated

参数说明:--repo 指定 Git 仓库地址;--path 指定仓库中清单文件所在目录;--dest-server 指定目标集群(此处为 Argo CD 所在集群);--dest-namespace 指定资源部署的命名空间;--sync-policy automated 启用自动同步策略。

3. 验证部署结果

创建完成后,Argo CD 会自动将应用同步到集群。执行以下命令查看应用同步状态:

argocd app get nginx-app

当 SYNC STATUS 显示为 Synced,HEALTH STATUS 显示为 Healthy 时,表示部署成功。也可以通过 Kubernetes 命令直接验证资源是否已创建:

kubectl get deployment nginx-deployment
kubectl get service nginx-service

预期输出为 deployment 有 2 个可用副本,service 已创建并分配了 ClusterIP。

验证方法与判定标准

  • 同步状态:argocd app get nginx-app 输出中 SYNC STATUS 为 Synced,HEALTH STATUS 为 Healthy。
  • 资源存在:kubectl get deployment nginx-deployment 显示 READY 列为 2/2;kubectl get svc nginx-service 显示服务已创建。
  • GitOps 闭环验证:修改 Git 仓库中 deployment.yaml 的副本数(例如从 2 改为 3),提交并推送。等待约 30-60 秒后,执行 kubectl get deployment nginx-deployment,观察到副本数自动变为 3,证明 Argo CD 自动同步生效。

常见问题

  • 同步失败:执行 argocd app get nginx-app 查看 CONDITION 列的错误信息,通常是仓库地址错误、路径不存在或 YAML 格式错误。
  • 仓库未授权:如果使用私有仓库,需要在 Argo CD 中添加仓库凭证:argocd repo add <YOUR_REPO_URL> --username <USER> --password <>。
  • 命名空间不存在:确保 --dest-namespace 指定的命名空间已存在,否则需先创建:kubectl create namespace <NAMESPACE>。