2、核心组件部署:在K8s集群中部署Argo CD、配置IDP(如Dex/Keycloak)作为SSO后端

本章聚焦于在Kubernetes集群中完成Argo CD与身份提供商(IDP)的联合部署。Argo CD作为GitOps的核心执行者,需要与外部IDP(本实战选用Dex和Keycloak)集成,实现统一的单点登录(SSO)与权限管控。部署顺序遵循“先基础设施,后应用组件”的原则,确保网络拓扑与认证链路在初始阶段即具备可观测性。

2.1 部署拓扑概览

下图展示了Argo CD与IDP组件在K8s集群内的逻辑部署关系。所有组件均运行在独立的命名空间中,通过ClusterIP Service与Ingress暴露内部端点。Dex作为上游OIDC代理,连接LDAP或外部身份源;Keycloak则直接提供完整的OIDC/SAML能力。本实战采用Dex+LDAP作为默认SSO后端,Keycloak作为备选方案。

Argo CD与IDP部署拓扑 Argo CD + IDP 部署拓扑 用户 / 浏览器 Ingress (argocd.example.com) Argo CD Server (argocd命名空间) Service: argocd-server:443 Dex (dex命名空间) OIDC代理 / LDAP连接器 LDAP / AD Keycloak (keycloak命名空间) OIDC / SAML 独立IDP 备选方案:Keycloak 可替代Dex作为SSO后端
部署策略提示: 生产环境中建议将Dex/Keycloak部署在独立的命名空间(如 dex、keycloak),与Argo CD的 argocd 命名空间隔离。这有助于故障域隔离和网络策略的精细化管控。

2.2 部署Argo CD

使用官方Helm Chart或Kustomize进行部署。以下采用Helm方式,版本以v2.10+为例。关键参数包括:Ingress配置、TLS证书、以及后续用于SSO的OIDC端点注册。

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

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

# 创建argocd命名空间
kubectl create namespace argocd

2.2.2 使用values.yaml定制部署

以下是一个最小化但包含SSO预配置的values文件。注意 configs.cm 中的 dex.config 部分将在后续步骤中填充。

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

server:
  ingress:
    enabled: true
    ingressClassName: nginx
    hosts:
      - argocd.example.com
    tls:
      - secretName: argocd-tls
        hosts:
          - argocd.example.com

configs:
  cm:
    url: https://argocd.example.com
    # OIDC配置占位,后续由Dex/Keycloak填充
    oidc.config: |
      name: Dex
      issuer: https://dex.example.com/dex
      clientID: argocd
      clientSecret: $dex-client-secret
      requestedScopes: ["openid", "profile", "email", "groups"]
  rbac:
    policy.default: role:readonly
    policy.csv: |
      g, ArgoCDAdmins, role:admin
      g, ArgoCDDevelopers, role:readonly

redis:
  enabled: true

controller:
  replicas: 1

repoServer:
  replicas: 1

2.2.3 执行部署

helm install argocd argo/argo-cd \
  --namespace argocd \
  --values argocd-values.yaml \
  --version 5.51.0
验证部署: 执行 kubectl get pods -n argocd 确认所有Pod处于Running状态。使用 kubectl get ingress -n argocd 检查Ingress地址。初始admin密码存储在Secret argocd-initial-admin-secret 中。

2.3 部署Dex作为SSO后端

Dex作为轻量级OIDC代理,能够对接LDAP、GitHub、Microsoft等多种身份源。本实战以LDAP为例。

2.3.1 创建Dex命名空间与配置

kubectl create namespace dex

创建Dex配置文件 dex-config.yaml:

# dex-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: dex-config
  namespace: dex
data:
  config.yaml: |
    issuer: https://dex.example.com/dex
    storage:
      type: kubernetes
      config:
        inCluster: true
    web:
      http: 0.0.0.0:5556
    connectors:
    - type: ldap
      id: ldap
      name: LDAP
      config:
        host: ldap.example.com:389
        insecureNoSSL: true
        bindDN: cn=admin,dc=example,dc=org
        bindPW: admin123
        userSearch:
          baseDN: ou=users,dc=example,dc=org
          filter: "(objectClass=person)"
          username: uid
          idAttr: DN
          emailAttr: mail
          nameAttr: cn
        groupSearch:
          baseDN: ou=groups,dc=example,dc=org
          filter: "(objectClass=groupOfNames)"
          userAttr: DN
          groupAttr: member
          nameAttr: cn
    staticClients:
    - id: argocd
      redirectURIs:
        - 'https://argocd.example.com/auth/callback'
      name: 'Argo CD'
      secret: $dex-client-secret

2.3.2 部署Dex

# 应用ConfigMap
kubectl apply -f dex-config.yaml

# 使用官方Dex部署(简化版,生产建议使用Helm)
kubectl apply -f https://raw.githubusercontent.com/dexidp/dex/main/examples/k8s/dex.yaml -n dex

# 创建Service暴露Dex
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: dex
  namespace: dex
spec:
  ports:
  - port: 5556
    targetPort: 5556
    name: http
  selector:
    app: dex
EOF

2.3.3 配置Ingress暴露Dex端点

cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dex-ingress
  namespace: dex
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /dex
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - dex.example.com
    secretName: dex-tls
  rules:
  - host: dex.example.com
    http:
      paths:
      - path: /dex
        pathType: Prefix
        backend:
          service:
            name: dex
            port:
              number: 5556
EOF
注意: Dex的 issuer 字段必须与Ingress暴露的外部URL完全一致(包括 /dex 路径)。Argo CD的OIDC配置中的 issuer 也必须指向同一个地址。证书使用Let's Encrypt或自签名证书,确保集群内信任。

2.4 配置Keycloak作为备选SSO后端

Keycloak提供更丰富的身份管理功能,适合企业级场景。以下为快速部署步骤。

2.4.1 部署Keycloak

kubectl create namespace keycloak

# 使用Bitnami Helm Chart部署
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install keycloak bitnami/keycloak \
  --namespace keycloak \
  --set auth.adminUser=admin \
  --set auth.adminPassword=admin123 \
  --set ingress.enabled=true \
  --set ingress.hostname=keycloak.example.com \
  --set ingress.tls=true

2.4.2 在Keycloak中创建OIDC客户端

通过Keycloak Admin Console(https://keycloak.example.com)执行以下操作:

步骤 操作 关键参数
1 创建Realm(如 argocd) Realm Name: argocd
2 创建Client Client ID: argocd
Client Protocol: openid-connect
Access Type: confidential
3 配置Valid Redirect URIs https://argocd.example.com/auth/callback
4 获取Client Secret 在Credentials标签页复制Secret
5 创建用户与角色 创建用户并分配 argocd-admin 或 argocd-readonly 角色

2.4.3 更新Argo CD OIDC配置指向Keycloak

kubectl edit configmap argocd-cm -n argocd

# 将oidc.config替换为:
oidc.config: |
  name: Keycloak
  issuer: https://keycloak.example.com/realms/argocd
  clientID: argocd
  clientSecret: $keycloak-client-secret
  requestedScopes: ["openid", "profile", "email", "groups"]
切换SSO后端: 修改 argocd-cm ConfigMap后,Argo CD Server会自动热加载配置,无需重启Pod。可以通过 kubectl rollout restart deployment argocd-server -n argocd 强制刷新。

2.5 验证SSO集成

完成部署后,通过以下步骤验证SSO链路是否正常:

  1. 访问Argo CD UI: 打开 https://argocd.example.com,应自动重定向到Dex或Keycloak的登录页面。
  2. 输入LDAP/Keycloak用户凭证: 使用LDAP中存在的用户(如 uid=john,ou=users,dc=example,dc=org)或Keycloak中创建的用户登录。
  3. 检查RBAC权限: 登录后,在Argo CD UI中查看用户信息,确认角色(admin/readonly)正确映射。
  4. 验证: 使用 argocd account get-user-info 命令查看当前用户的OIDC声明。
# 使用argocd CLI验证
argocd login argocd.example.com --sso
# 浏览器完成SSO登录后,CLI会获取
argocd account get-user-info
故障排查要点:
  • 检查Dex/Keycloak Pod日志:kubectl logs -n dex deployment/dex
  • 确认Ingress TLS证书有效,浏览器无安全警告
  • 验证OIDC回调URL完全匹配(包括末尾斜杠)
  • 使用 curl -v https://dex.example.com/dex/.well-known/openid-configuration 测试Dex端点可达性

2.6 组件版本与配置清单

下表汇总了本实战中各组件的推荐版本与关键配置项,便于后续故障恢复时快速核对。

组件 推荐版本 命名空间 关键Service 配置ConfigMap
Argo CD v2.10+ argocd argocd-server:443 argocd-cm
Dex v2.37+ dex dex:5556 dex-config
Keycloak 22+ keycloak keycloak:8080 (通过Helm values管理)
Ingress Controller nginx-ingress 1.9+ ingress-nginx ingress-nginx-controller:443 —