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>。