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作为备选方案。
部署策略提示: 生产环境中建议将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链路是否正常:
- 访问Argo CD UI: 打开
https://argocd.example.com,应自动重定向到Dex或Keycloak的登录页面。 - 输入LDAP/Keycloak用户凭证: 使用LDAP中存在的用户(如
uid=john,ou=users,dc=example,dc=org)或Keycloak中创建的用户登录。 - 检查RBAC权限: 登录后,在Argo CD UI中查看用户信息,确认角色(admin/readonly)正确映射。
- 验证: 使用
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 | — |