3. Argo CD 安装与配置:在 Kubernetes 集群中安装 Argo CD、配置 Ingress、获取初始密码
本章是 Argo CD 落地实践的第一步。我们将在一个标准的 Kubernetes 集群中完成 Argo CD 的安装、对外暴露访问入口(Ingress),并获取管理员初始密码。整个过程遵循“最小权限 + 生产就绪”原则,为后续的标准模板变更风险评估任务编排奠定基础设施基础。
3.1 安装前提与版本选择
在开始安装前,请确认以下环境条件已满足:
| 检查项 | 要求 | 说明 |
|---|---|---|
| Kubernetes 集群 | v1.25+ | 建议使用 v1.27+ 以获得最佳兼容性 |
| kubectl 版本 | 与集群版本偏差 ≤ 1 个小版本 | 确保 API 兼容 |
| 集群资源 | ≥ 2 核 CPU / 4 GB 内存 | Argo CD 控制平面组件开销 |
| Ingress Controller | 已部署(如 nginx-ingress) | 用于外部访问 Argo CD UI |
| 存储类 | 支持 ReadWriteOnce | Argo CD 使用 StatefulSet 存储状态 |
版本锁定建议: 生产环境请固定 Argo CD 大版本(如 v2.12.x),避免自动拉取 latest 导致意外变更。本课程使用
v2.12.6 作为演示版本。
3.2 安装 Argo CD 控制平面
Argo CD 官方提供两种安装方式:快速安装(非高可用) 和 高可用安装。对于标准模板变更风险评估场景,我们推荐使用高可用模式,确保任务编排的连续性。
3.2.1 创建命名空间与安装清单
# 创建专用命名空间
kubectl create namespace argocd
# 安装 Argo CD 高可用版本
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml
3.2.2 验证 Pod 状态
安装完成后,检查所有 Pod 是否进入 Running 状态:
kubectl get pods -n argocd
# 预期输出(部分示例)
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 2m
argocd-applicationset-controller-6b9b8f8d7c-abc12 1/1 Running 0 2m
argocd-dex-server-7f8c9d9b7d-def34 1/1 Running 0 2m
argocd-notifications-controller-5d6c7b8f9-ghi56 1/1 Running 0 2m
argocd-redis-ha-haproxy-7c8d9e0f1-jkl78 1/1 Running 0 2m
argocd-redis-ha-server-0 1/1 Running 0 2m
argocd-repo-server-6c7d8e9f0-mno90 1/1 Running 0 2m
argocd-server-7d8e9f0a1-pqr12 1/1 Running 0 2m
常见问题: 如果
argocd-application-controller-0 长时间处于 Pending 状态,请检查集群是否有足够的持久卷(PV)资源。高可用模式依赖 Redis 集群,需要至少 3 个 PV。
3.3 配置 Ingress 对外暴露 Argo CD UI
Argo CD 默认不对外暴露服务。我们需要通过 Ingress 将 argocd-server 服务映射到集群外部域名。以下配置基于 nginx-ingress controller,并启用 TLS 终止。
3.3.1 创建 TLS 证书 Secret
使用自签名证书或已有证书:
# 生成自签名证书(仅用于演示)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout argocd-tls.key -out argocd-tls.crt \
-subj "/CN=argocd.example.com" -addext "subjectAltName=DNS:argocd.example.com"
# 创建 Secret
kubectl create secret tls argocd-server-tls \
--cert=argocd-tls.crt --key=argocd-tls.key \
-n argocd
3.3.2 编写 Ingress 资源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server-ingress
namespace: argocd
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- argocd.example.com
secretName: argocd-server-tls
rules:
- host: argocd.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443
关键注解说明:
ssl-passthrough: "true"— 让 Ingress 将 TLS 流量直接透传到 Argo CD 服务,避免二次解密。backend-protocol: "HTTPS"— 指定后端服务使用 HTTPS 协议。ssl-redirect: "true"— 强制 HTTP 请求重定向到 HTTPS。
3.3.3 应用 Ingress 并验证
kubectl apply -f argocd-ingress.yaml
# 验证 Ingress 是否分配了地址
kubectl get ingress -n argocd
# 在本地 hosts 文件中添加域名解析(测试环境)
echo "<INGRESS_EXTERNAL_IP> argocd.example.com" >> /etc/hosts
# 访问 https://argocd.example.com 确认 UI 可打开
3.4 获取初始管理员密码
Argo CD 安装后会自动生成一个随机密码,存储在名为 argocd-initial-admin-secret 的 Secret 中。获取方式如下:
# 方法一:直接解码 Secret
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# 方法二:使用 Argo CD CLI 获取(需先安装 CLI)
argocd admin initial-password -n argocd
安全建议: 首次登录后请立即修改密码。使用
argocd account update-password 命令或通过 UI 的“用户信息”页面修改。生产环境建议集成 OIDC/LDAP 认证,禁用本地 admin 账号。
3.5 安装架构总览
下图展示了 Argo CD 安装完成后的核心组件及其交互关系:
3.6 安装后快速验证清单
完成上述步骤后,请按以下清单逐项确认:
- Pod 健康检查: 所有 Pod 均为
Running状态,无 CrashLoopBackOff。 - Ingress 连通性: 浏览器访问
https://argocd.example.com可显示 Argo CD 登录页面。 - 密码获取: 成功解码
argocd-initial-admin-secret并记录密码。 - CLI 登录测试: 使用
argocd login argocd.example.com --username admin --password <密码>验证 CLI 可连接。 - 证书信任: 自签名证书环境下,确认浏览器或 CLI 已添加例外或信任 CA。
生产环境额外检查项:
- 确认 Ingress 的
ssl-passthrough注解生效,避免 gRPC 连接失败。 - 检查 Redis 集群的持久化配置,确保重启后数据不丢失。
- 为
argocd-server配置资源限制(requests/limits),防止资源争抢。
3.7 本章小结
至此,我们完成了 Argo CD 在 Kubernetes 集群中的完整安装与配置。核心成果包括:
- 高可用 Argo CD 控制平面已就绪,包含 Application Controller、Repo Server、Redis HA 等关键组件。
- 通过 Ingress 对外暴露了 Argo CD UI,并配置了 TLS 终止与 SSL 透传。
- 成功获取了初始管理员密码,并验证了 CLI 与 UI 的连通性。