3. Argo CD 安装与配置:Helm 安装、Ingress、TLS 与管理员密码获取

本章将使用 Helm Chart 在 Kubernetes 集群中部署 Argo CD,并完成生产环境所需的 Ingress 配置、TLS 证书挂载以及初始管理员密码的获取。这是搭建 GitOps 压测沙盘的基础步骤,所有后续的配额压测与容量预测实验都依赖此环境的正确性。

3.1 环境准备与 Helm 仓库添加

在安装之前,请确保集群已就绪,并且 kubectl 上下文指向目标集群。Argo CD 官方推荐使用 argoproj/argo-cd Helm Chart 进行部署。

前置检查清单:
  • Kubernetes 集群版本 ≥ 1.23
  • Helm 版本 ≥ 3.8.0
  • 集群已配置 StorageClass(用于持久化 Argo CD 数据)
  • DNS 解析或本地 hosts 文件已准备(用于 Ingress 域名)

执行以下命令添加官方 Helm 仓库并更新索引:

helm repo add argo-cd https://argoproj.github.io/argo-helm
helm repo update

3.2 使用 Helm 安装 Argo CD

创建一个命名空间 argocd,然后使用 Helm 安装。以下命令包含了生产环境常用的配置参数:

kubectl create namespace argocd

helm install argocd argo-cd/argo-cd \
  --namespace argocd \
  --set server.service.type=ClusterIP \
  --set server.ingress.enabled=true \
  --set server.ingress.hosts[0]=argocd.example.com \
  --set server.ingress.tls[0].hosts[0]=argocd.example.com \
  --set server.ingress.tls[0].secretName=argocd-tls \
  --set configs.params."server\.insecure"=true \
  --set controller.replicas=1 \
  --set server.replicas=1 \
  --set repoServer.replicas=1 \
  --set applicationSet.replicas=1
参数说明: server.insecure=true 允许 Argo CD Server 在内部以 HTTP 模式运行,由 Ingress 层统一处理 TLS 终止。这是生产环境的标准做法,避免在 Pod 内部重复管理证书。

安装完成后,检查 Pod 状态:

kubectl get pods -n argocd

预期输出应包含以下核心组件:

组件名称 默认副本数 功能说明
argocd-application-controller 1 负责 Application 状态循环与同步
argocd-server 1 提供 API 与 Web UI 服务
argocd-repo-server 1 拉取 Git 仓库并生成 Kubernetes 清单
argocd-redis 1 缓存与状态存储
argocd-applicationset-controller 1 管理 ApplicationSet 资源

3.3 Ingress 配置与 TLS 证书挂载

Argo CD 的 Ingress 配置支持多种 Ingress Controller(如 Nginx、Traefik、AWS ALB)。以下以 Nginx Ingress Controller 为例,展示完整的 YAML 配置。

首先,创建 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"

kubectl create secret tls argocd-tls \
  --cert=argocd-tls.crt \
  --key=argocd-tls.key \
  -n argocd

然后,通过 Helm values 文件或直接编辑 Ingress 对象来配置。以下是完整的 Ingress 资源定义:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
    nginx.ingress.kubernetes.io/ssl-passthrough: "false"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - argocd.example.com
    secretName: argocd-tls
  rules:
  - host: argocd.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 80
关键注解: nginx.ingress.kubernetes.io/backend-protocol: "HTTP" 必须设置,因为 Argo CD Server 内部监听 8080(HTTP)端口。如果误设为 HTTPS,会导致 Ingress 与后端之间的通信失败。

验证 Ingress 是否生效:

kubectl get ingress -n argocd
# 预期输出显示 ADDRESS 已分配,且 TLS 状态正常

3.4 初始管理员密码获取

Argo CD 安装完成后,初始管理员密码由系统自动生成并存储在 Secret 中。获取密码的官方方法如下:

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

如果 Secret 不存在(常见于某些 Helm 版本或自定义配置),可以通过以下方式重置密码:

# 方法一:直接修改 admin 用户的密码哈希
kubectl exec -n argocd deploy/argocd-server -- \
  argocd account update-password \
  --current-password <old-password> \
  --new-password <new-password>

# 方法二:通过 argocd CLI 重置(需要先登录)
argocd account update-password
安全建议: 在压测沙盘环境中,建议将初始密码记录在安全位置,并在首次登录后立即修改。对于自动化流水线,可以使用 argocd account generate- 生成 API 替代密码认证。

3.5 安装验证与访问测试

完成上述步骤后,通过浏览器访问 https://argocd.example.com,使用 admin 和获取到的密码登录。验证以下关键功能:

  • UI 加载: 页面正常渲染,无证书告警(自签名证书除外)
  • CLI 连接: argocd login argocd.example.com --username admin --password <password> --insecure 成功
  • 集群状态: argocd cluster list 显示当前集群为 in-cluster
  • 组件健康: 所有 Pod 处于 Running 状态,且 Readiness 探测通过
Argo CD 安装与配置架构图 用户/浏览器 Ingress (Nginx) TLS Secret argocd-server application-controller repo-server redis 关键流程说明: 1. 用户通过 HTTPS 访问 Ingress,Ingress 使用 TLS Secret 终止 SSL。 2. Ingress 将请求转发至 argocd-server(HTTP 协议)。 3. argocd-server 与 controller、repo-server、redis 协作完成应用同步。

3.6 常见问题与排错

问题现象 可能原因 解决方案
Ingress 返回 502 后端协议配置错误 检查 annotation backend-protocol: HTTP
证书告警 自签名证书不被信任 添加 --insecure 标志或导入 CA 证书
密码获取为空 Secret 名称或命名空间错误 确认 Secret 名为 argocd-initial-admin-secret
Pod CrashLoopBackOff 资源限制不足或配置错误 检查 kubectl describe pod 事件日志
压测沙盘提示: 在后续的配额压测实验中,Argo CD 的 argocd-server 和 application-controller 将成为主要负载点。建议在安装阶段就为这两个组件配置资源请求与限制(requests/limits),避免压测时因资源不足导致 Pod 被 OOM Kill。