4. Argo CD 安装与配置:使用 Helm 或 Operator 在 K8s 集群中安装 Argo CD、配置 Ingress 与 TLS、初始管理员密码获取

本章聚焦于在 Kubernetes 集群中部署 Argo CD 的两种主流方式:Helm Chart 与 Operator。同时涵盖生产环境必备的 Ingress 与 TLS 配置,以及首次登录时管理员密码的获取方法。正确的安装与配置是后续镜像供应链安全策略的基础。

4.1 安装方式对比:Helm vs Operator

Argo CD 官方提供两种安装途径,适用于不同的运维场景。下表从关键维度进行对比:

维度 Helm Chart Operator (Red Hat / Community)
复杂度 中等,需手动管理 values 文件 较低,Operator 自动处理配置
自定义程度 高,几乎可覆盖所有参数 中,受限于 CRD 定义
升级策略 手动 helm upgrade Operator 生命周期管理
生产推荐 ⭐ 推荐(灵活可控) 适合 OpenShift 或自动化运维
社区活跃度 官方主推,更新及时 跟随上游,略有延迟
建议: 对于标准 Kubernetes 集群,优先选择 Helm 方式。Operator 更适合已经采用 Operator 模式管理中间件的团队,或运行在 Red Hat OpenShift 上的环境。

4.2 使用 Helm 安装 Argo CD

Helm 安装是生产环境中最常用的方式。以下步骤基于 Argo CD 官方 Helm Chart 仓库。

4.2.1 添加 Helm 仓库并创建命名空间

# 添加官方 Helm 仓库
helm repo add argo https://argoproj.github.io/argo-helm

# 更新本地仓库索引
helm repo update

# 创建独立的命名空间
kubectl create namespace argocd

4.2.2 使用自定义 values 文件安装

创建一个 values-argocd.yaml 文件,包含生产环境的基础配置:

# values-argocd.yaml
global:
  # 安全上下文,非 root 运行
  securityContext:
    runAsNonRoot: true
    runAsUser: 999

server:
  # 启用 Ingress,后续配置
  ingress:
    enabled: false
  # 配置 service 类型,生产建议 ClusterIP
  service:
    type: ClusterIP

configs:
  # 关闭内置的 dex 配置,使用本地用户
  cm:
    dex.config: ""
  # 配置管理员账号(可选,后续通过密码获取)
  secret:
    argocdServerAdminPassword: ""
    argocdServerAdminPasswordMtime: ""

# 启用高可用模式(生产推荐)
controller:
  replicas: 2
repoServer:
  replicas: 2
server:
  replicas: 2
redis:
  enabled: true
  replicas: 3

执行安装命令:

helm install argocd argo/argo-cd \
  --namespace argocd \
  --values values-argocd.yaml \
  --version 7.0.0  # 指定版本,避免意外升级
版本锁定: 务必使用 --version 参数锁定 Chart 版本。Argo CD 大版本升级可能涉及 CRD 变更,未锁定的安装可能导致集群状态不一致。

4.3 使用 Operator 安装 Argo CD

Operator 方式通过自定义资源 (CRD) 声明 Argo CD 实例。以下以社区 Operator 为例。

4.3.1 安装 Operator

# 使用 OLM (Operator Lifecycle Manager) 安装
kubectl create -f https://raw.githubusercontent.com/argoproj-labs/argocd-operator/master/deploy/olm/argocd-operator.yaml

# 等待 Operator Pod 就绪
kubectl wait --for=condition=Ready pod -l control-plane=argocd-operator -n argocd --timeout=120s

4.3.2 创建 ArgoCD 实例

Operator 安装完成后,通过 ArgoCD 自定义资源创建实例:

# argocd-instance.yaml
apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
  name: example-argocd
  namespace: argocd
spec:
  # 高可用配置
  ha:
    enabled: true
    redis:
      replicas: 3
  # 服务类型
  server:
    service:
      type: ClusterIP
  # 禁用内置 Dex
  dex:
    openShiftOAuth: false
    config: ""

# 应用 CR
kubectl apply -f argocd-instance.yaml
Operator 优势: 自动处理备份、升级、健康检查等运维任务。适合需要“声明式管理 Argo CD 本身”的团队。

4.4 配置 Ingress 与 TLS

生产环境必须通过 Ingress 暴露 Argo CD Web UI 和 API,并配置 TLS 加密。以下以 nginx-ingress-controller 和 cert-manager 为例。

4.4.1 创建 TLS 证书(使用 cert-manager)

# Certificate 资源
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: argocd-tls
  namespace: argocd
spec:
  secretName: argocd-tls-secret
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: argocd.yourdomain.com
  dnsNames:
  - argocd.yourdomain.com

4.4.2 创建 Ingress 资源

# argocd-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    # 后端协议为 HTTPS(Argo CD Server 默认 443)
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    # 重写目标路径
    nginx.ingress.kubernetes.io/rewrite-target: /
    # 启用 SSL 重定向
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - argocd.yourdomain.com
    secretName: argocd-tls-secret
  rules:
  - host: argocd.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 443
关键注解: backend-protocol: "HTTPS" 是 nginx-ingress 与 Argo CD 通信的必需配置。Argo CD Server 默认监听 443 端口并启用 TLS,Ingress 必须使用 HTTPS 转发。

4.5 初始管理员密码获取

安装完成后,Argo CD 会自动生成一个随机密码。获取方式取决于安装方法。

4.5.1 Helm 安装的密码获取

Helm 安装时,密码存储在 Secret argocd-initial-admin-secret 中:

# 获取初始密码
kubectl get secret argocd-initial-admin-secret \
  -n argocd \
  -o jsonpath="{.data.password}" | base64 -d

# 输出示例(密码为随机字符串)
# xK8sP@ssw0rd!2024

4.5.2 Operator 安装的密码获取

Operator 创建的实例,密码存储在 <instance-name>-cluster 的 Secret 中:

# 获取 Operator 创建的密码
kubectl get secret example-argocd-cluster \
  -n argocd \
  -o jsonpath="{.data.admin\.password}" | base64 -d

# 输出示例
# operator-generated-password-123

4.5.3 首次登录与密码修改

使用获取的密码登录后,建议立即修改密码:

# 通过 CLI 修改密码
argocd login argocd.yourdomain.com --username admin --password <初始密码>
argocd account update-password

# 或通过 Web UI:用户信息 -> 设置 -> 更新密码
安全提醒: 初始密码仅用于首次登录。生产环境必须修改为强密码,并考虑集成 SSO(如 Dex、Keycloak)或 OIDC 进行统一身份认证。切勿将初始密码用于日常运维。

4.6 安装架构总览

下图展示了 Argo CD 安装后的核心组件及其关系:

Argo CD 安装架构图 Argo CD 安装架构总览 用户 / Ingress (TLS) argocd-server (API / UI) Service: ClusterIP, Port 443 argocd-repo-server Git 仓库同步 argocd-application-controller 应用状态监控 argocd-redis (缓存) 会话 / 缓存 Kubernetes API 说明: Ingress 负责 TLS 终止;Server 提供 UI/API;Repo Server 拉取 Git 仓库;Controller 确保集群状态与 Git 一致;Redis 提供缓存。

4.7 安装后验证清单

完成安装后,建议按以下清单逐项验证:

  1. Pod 状态: 所有 Pod 处于 Running 状态,且 READY 列显示为 1/1 或 2/2(高可用模式)。
  2. Service 连通性: 通过 kubectl port-forward 临时暴露服务,验证 Web UI 可访问。
  3. Ingress 与 TLS: 使用 curl -v https://argocd.yourdomain.com 检查证书链和重定向。
  4. CLI 登录: 使用 argocd login 命令验证 API 连通性。
  5. 密码修改: 确认初始密码已修改,且新密码生效。
生产环境基线: 建议将 Argo CD 自身的配置(包括安装 values 文件、Ingress 定义、证书)也纳入 Git 仓库管理,实现“GitOps 管理 GitOps”。