4、环境准备:安装 Argo CD(Kubernetes 集群、Helm/Manifest 方式)、配置 Ingress 与 TLS

本章是实战课程的基石。在调用 Argo CD 接口之前,必须拥有一个可访问的 Argo CD 实例。我们将从零开始,完成 Kubernetes 集群准备、Argo CD 安装(提供 Helm 与 Manifest 两种方式),并配置 Ingress 与 TLS 证书,确保 API 端点安全可达。

4.1 前置条件与集群准备

安装 Argo CD 需要以下环境就绪:

组件 版本要求 说明
Kubernetes 集群 v1.23+ 建议使用 K3s、Minikube 或云托管集群
kubectl v1.23+ 与集群版本偏差不超过 ±1
Helm(可选) v3.8+ 仅 Helm 安装方式需要
Ingress Controller 任意 推荐 nginx-ingress 或 traefik
域名与 DNS — 用于 Ingress 访问,如 argocd.example.com
提示: 若使用 Minikube,请先执行 minikube start --cpus=4 --memory=4096 确保资源充足。K3s 用户可直接使用内置的 traefik Ingress Controller。

4.2 安装 Argo CD:两种方式对比

我们提供两种主流安装方式,生产环境推荐 Helm 方式,便于参数化管理。

对比维度 Helm 方式 Manifest 方式
安装复杂度 中等(需了解 values.yaml) 低(直接 apply)
自定义能力 高(参数化覆盖) 低(需手动修改 YAML)
升级维护 简单(helm upgrade) 需手动替换资源
适用场景 生产、多环境 快速验证、Demo

4.2.1 方式一:Helm 安装(推荐)

添加 Helm 仓库并安装至 argocd 命名空间:

# 添加 Argo CD Helm 仓库
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

# 创建命名空间
kubectl create namespace argocd

# 使用自定义 values 安装
helm install argocd argo/argo-cd \
  --namespace argocd \
  --values argocd-values.yaml

以下是一个最小化 argocd-values.yaml 示例,包含 Ingress 与 TLS 配置:

# argocd-values.yaml
global:
  domain: argocd.example.com

configs:
  params:
    server.insecure: true

server:
  ingress:
    enabled: true
    ingressClassName: nginx
    annotations:
      cert-manager.io/cluster-issuer: "letsencrypt-prod"
    hosts:
      - argocd.example.com
    tls:
      - hosts:
          - argocd.example.com
        secretName: argocd-tls

4.2.2 方式二:Manifest 安装(快速验证)

直接使用官方提供的安装清单:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
注意: Manifest 方式默认不包含 Ingress 资源。你需要手动创建 Ingress 对象,或使用 kubectl port-forward 临时暴露服务。

4.3 安装后的验证与初始密码获取

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

kubectl get pods -n argocd
# 预期输出:所有 Pod 处于 Running 状态

获取初始 admin 密码:

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d
提示: 首次登录后请立即修改密码:argocd account update-password。

4.4 配置 Ingress 与 TLS

Ingress 是外部访问 Argo CD API Server 的入口。我们使用 nginx-ingress 作为控制器,cert-manager 自动签发 Let's Encrypt 证书。

4.4.1 手动创建 Ingress 资源(适用于 Manifest 方式)

# argocd-ingress.yaml
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"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
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: 443
kubectl apply -f argocd-ingress.yaml

4.4.2 验证 TLS 证书与 Ingress 连通性

检查证书是否签发成功:

kubectl get certificate -n argocd
# 预期输出:READY=True

通过域名访问 Argo CD Web UI:

curl -k https://argocd.example.com
# 应返回 Argo CD 的登录页面 HTML
关键检查点:
  • Ingress 的 backend-protocol: HTTPS 注解必须设置,否则 Argo CD 会返回 502。
  • 若使用 ssl-passthrough,请确保 nginx-ingress 启动时启用了 --enable-ssl-passthrough 参数。
  • 证书 secret 名称必须与 Ingress 的 tls.secretName 一致。

4.5 架构总览:组件与流量路径

下图展示了安装完成后,外部请求如何通过 Ingress 到达 Argo CD 各组件:

Argo CD 安装架构与流量路径 外部用户 DNS Ingress Controller TLS 证书 argocd-server argocd-repo-server argocd-application-controller 流量说明: 1. 用户通过域名请求 → DNS 解析 → Ingress Controller 接收 2. Ingress 终止 TLS 或透传 → 转发至 argocd-server 服务(443 端口) 3. argocd-server 调用 repo-server 获取 Git 仓库清单,application-controller 负责同步状态

4.6 安装后快速检查清单

完成安装后,请逐项确认以下状态:

  1. Pod 状态: kubectl get pods -n argocd 所有 Pod 均为 Running。
  2. Service 暴露: kubectl get svc -n argocd 确认 argocd-server 类型为 ClusterIP 或 NodePort。
  3. Ingress 状态: kubectl get ingress -n argocd 显示 ADDRESS 已分配。
  4. TLS 证书: kubectl get certificate -n argocd READY 为 True。
  5. API 可达性: curl -k https://argocd.example.com/api/version 返回 JSON 版本信息。
  6. CLI 登录: argocd login argocd.example.com --username admin --password <初始密码> 成功。
常见问题:
  • Ingress 返回 502:检查 nginx.ingress.kubernetes.io/backend-protocol: HTTPS 注解是否缺失。
  • 证书签发失败:确认 cert-manager 已安装,ClusterIssuer 名称正确,DNS 记录指向 Ingress 公网 IP。
  • Helm 安装后 Pod 启动失败:检查 values.yaml 中 global.domain 是否与 Ingress 域名一致。