3. 环境搭建:安装 Argo CD(Kubernetes 方式)、配置 Ingress 与 TLS、初始登录与密码管理

本章是课程实验环境的基石。我们将使用 Kubernetes 原生方式部署 Argo CD,配置安全的 Ingress 入口与 TLS 证书,并完成初始登录与密码管理。完成本步骤后,你将拥有一个可用于后续“存储版本漂移校准”实验的完整 Argo CD 实例。

3.1 部署架构概览

下图展示了本次环境搭建的核心组件与流量路径:用户通过 HTTPS 访问 Ingress Controller,Ingress 将 TLS 终止后的请求转发至 Argo CD Server 的 443 端口;Argo CD Server 再与 Kubernetes API Server、Redis 及 Repo Server 交互。

Argo CD 环境搭建架构图 Argo CD 环境搭建架构图 用户 Ingress + TLS Argo CD Server (argocd-server) gRPC / REST K8s API Server Redis Repo Server 说明: • 用户通过 HTTPS 访问 Ingress,TLS 在此终止。 • Argo CD Server 是核心组件,负责 API、UI 和 CLI 请求。 • Redis 用于缓存和会话管理,Repo Server 负责拉取 Git 仓库。

3.2 安装 Argo CD(Kubernetes 方式)

官方推荐使用 high availability 或 core 安装清单。本课程采用标准 install.yaml,包含所有核心组件。执行以下命令创建 argocd 命名空间并部署 Argo CD:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

部署完成后,检查 Pod 状态:

kubectl get pods -n argocd

预期输出应包含以下运行中的 Pod:

组件 Pod 名称前缀 副本数 功能说明
API Server argocd-server-* 1 提供 UI、CLI 和 API 接口
Repo Server argocd-repo-server-* 1 克隆 Git 仓库并生成 manifests
Application Controller argocd-application-controller-* 1 监控应用状态并执行同步
Redis argocd-redis-* 1 缓存与临时会话存储
Dex (可选) argocd-dex-server-* 1 SSO 身份认证(本课程未启用)
提示:如果 Pod 长时间处于 Pending 状态,请检查集群是否有足够的资源(建议至少 2 核 CPU、4 GB 内存)。可以使用 kubectl describe pod -n argocd <pod-name> 查看具体原因。

3.3 配置 Ingress 与 TLS

为了通过 HTTPS 安全访问 Argo CD UI,我们需要创建 Ingress 资源并配置 TLS 证书。本课程使用自签名证书进行演示,生产环境应使用 Let's Encrypt 或企业 CA 签发的证书。

3.3.1 创建 TLS 证书 Secret

生成自签名证书并创建 Kubernetes Secret:

# 生成自签名证书(有效期 365 天)
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"

# 创建 TLS Secret
kubectl create secret tls argocd-server-tls \
  --cert=argocd-tls.crt --key=argocd-tls.key \
  -n argocd

3.3.2 创建 Ingress 资源

以下 Ingress 配置将 argocd.example.com 的 HTTPS 流量路由至 Argo CD Server 的 443 端口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/ssl-passthrough: "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 Controller 支持 SSL Passthrough(如 nginx-ingress)。如果使用 AWS ALB Ingress Controller 或其他不支持 passthrough 的控制器,需要改用 backend-protocol: "HTTPS" 并在 Argo CD Server 侧配置证书。

应用 Ingress 配置:

kubectl apply -f argocd-ingress.yaml

验证 Ingress 是否生效:

kubectl get ingress -n argocd

输出应显示 argocd.example.com 的地址已分配。在本地 /etc/hosts 文件中添加映射(如果使用 Minikube 或 kind),然后通过浏览器访问 https://argocd.example.com。

3.4 初始登录与密码管理

Argo CD 安装完成后,默认会创建一个 admin 用户。初始密码存储在名为 argocd-initial-admin-secret 的 Secret 中。

3.4.1 获取初始密码

kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d

复制输出的密码,使用 admin 用户名登录:

argocd login argocd.example.com --username admin --password <初始密码> --insecure

3.4.2 修改密码

首次登录后,应立即修改密码:

argocd account update-password

系统会依次提示输入当前密码、新密码和确认新密码。修改成功后,后续登录均使用新密码。

3.4.3 密码管理最佳实践

实践项 建议 说明
初始密码轮换 立即修改 安装后 5 分钟内完成修改,避免 Secret 泄露风险
密码复杂度 ≥16 位,含大小写字母、数字、特殊字符 Argo CD 默认无复杂度校验,需人工保证
Secret 清理 删除初始 Secret kubectl delete secret argocd-initial-admin-secret -n argocd
SSO 集成 推荐使用 OIDC/LDAP 避免本地密码管理,降低凭据泄露面
审计日志 启用 API 审计 记录所有登录和操作行为,便于溯源
关键操作:完成密码修改后,务必执行 kubectl delete secret argocd-initial-admin-secret -n argocd 删除初始密码 Secret。这是安全审计的基线要求,也是后续“存储版本漂移校准”实验的前提条件。

3.5 验证环境可用性

执行以下命令确认 Argo CD 核心组件正常运行:

# 检查所有 Pod 状态
kubectl get pods -n argocd

# 检查 Service 端点
kubectl get svc -n argocd

# 通过 CLI 查看当前版本
argocd version --client

# 通过 CLI 查看服务端版本(需先登录)
argocd version --server

预期输出示例:

argocd: v2.12.0+xxx
  BuildDate: 2025-01-15T10:00:00Z
  GitCommit: abcdef123456
  GoVersion: go1.22.0
  Compiler: gc
  Platform: linux/amd64