在EKS上部署Apache Spark History Server时配置LDAP身份认证的方案咨询
在EKS上部署Apache Spark History Server时配置LDAP身份认证的方案咨询
嘿,刚好我之前在EKS环境里给Spark History Server配置过AD LDAP认证,给你分享几个实用的方案和踩过的坑:
方案一:直接通过Spark内置Jetty配置LDAP认证
Spark History Server默认基于Jetty运行,官方已经原生支持LDAP认证配置,不用额外加组件:
- 你可以通过修改
spark-defaults.conf或者在启动History Server时传入JVM参数来配置:- 先开启UI认证:
spark.history.ui.authenticate true - 指定LDAP服务器地址:
spark.history.ui.authenticate.ldap.url ldap://your-ad-domain-controller:389(如果用SSL加密就换ldaps://,对应端口636) - 设置用户搜索的基准DN:
spark.history.ui.authenticate.ldap.user.baseDN DC=your-company,DC=com - AD里用户名一般用
sAMAccountName作为标识,所以配置过滤规则:spark.history.ui.authenticate.ldap.user.filter (sAMAccountName={0}) - 如果你的AD不允许匿名搜索用户,需要配置一个有权限的绑定账号:
spark.history.ui.authenticate.ldap.bindDN CN=spark-service-account,OU=ServiceAccounts,DC=your-company,DC=com spark.history.ui.authenticate.ldap.bindPassword your-service-account-password
- 先开启UI认证:
- 在EKS里,你可以把这些配置塞进ConfigMap,然后挂载到Spark History Server的Pod里,或者通过环境变量
SPARK_HISTORY_UI_AUTHENTICATE_LDAP_URL这类形式传入(注意环境变量要把点换成下划线,全大写)。
方案二:用Ingress-Nginx做前置LDAP认证
如果你的Spark History Server是通过Ingress-Nginx暴露到集群外的,推荐在Ingress层面配置认证,这样不用改动Spark本身的配置,更灵活:
- 给Ingress资源添加以下annotations:
nginx.ingress.kubernetes.io/auth-type: ldap nginx.ingress.kubernetes.io/auth-url: "ldap://your-ad-server:389/DC=your-company,DC=com?sAMAccountName?sub?(objectClass=user)" nginx.ingress.kubernetes.io/auth-secret: ldap-bind-secret nginx.ingress.kubernetes.io/auth-realm: "Spark History Server - 请使用AD账号登录" - 先创建存储绑定账号密码的Secret:
kubectl create secret generic ldap-bind-secret --from-literal=password=your-bind-account-password - 这个方案的优势是可以统一管理所有Ingress服务的认证规则,适合团队里有多个服务需要AD认证的场景。
方案三:通过OIDC间接对接AD(适合有成熟身份体系的团队)
如果你们已经把AD集成到Azure AD或者其他OIDC身份提供商,也可以把Spark History Server配置成OIDC客户端,实现更现代化的认证流程:
- 在
spark-defaults.conf里开启OIDC认证:spark.history.ui.authenticate true spark.history.ui.authenticate.oauth2.enabled true spark.history.ui.authenticate.oauth2.clientId your-oidc-client-id spark.history.ui.authenticate.oauth2.clientSecret your-oidc-client-secret spark.history.ui.authenticate.oauth2.authorizationEndpoint https://your-oidc-provider/authorize spark.history.ui.authenticate.oauth2.tokenEndpoint https://your-oidc-provider/token spark.history.ui.authenticate.oauth2.jwksEndpoint https://your-oidc-provider/jwks - 这种方式支持单点登录(SSO),扩展性更强,适合已经有统一身份管理平台的团队。
一些踩坑提示
- 不管用哪种方案,先确保EKS集群的节点能访问到AD服务器的389/636端口,最好在Pod里用
telnet测试连通性 - 如果用Jetty方案,还可以开启授权规则,比如指定只有AD里特定组的用户能访问:
spark.history.ui.authorize true,然后配置spark.history.ui.authorize.ldap.group.baseDN和spark.history.ui.authorize.ldap.group.filter - 所有敏感信息(比如密码、客户端密钥)都不要硬编码,用Kubernetes Secret来管理,通过挂载或者环境变量的方式让Pod读取
备注:内容来源于stack exchange,提问作者Rajashekhar Meesala
相关产品推荐
相关产品推荐

