同Kerberos域双Ambari集群跨集群访问NameNode认证问题
解决相同REALM独立KDC下跨Ambari集群访问NameNode的Kerberos认证问题
这个问题的核心其实很好理解:虽然两个集群用了相同的REALM名称,但各自的KDC是完全独立的——app-cluster的KDC数据库里根本没有data-cluster的nn/machine@REALM这个服务主体,自然会抛出找不到主体的TGS请求错误。下面是我整理的可行解决方案:
方案一:同步KDC数据库主体(推荐)
既然两个集群共用同一个REALM名称,最直接的方式就是让两个KDC的主体信息保持同步,具体操作步骤如下:
- 在data-cluster的KDC服务器上,导出包含NameNode主体的KDC数据库条目:
kdb5_util dump -b64 /tmp/data_cluster_princs.b64 - 将导出的文件传输到app-cluster的KDC服务器上:
scp /tmp/data_cluster_princs.b64 app-kdc-host:/tmp/ - 在app-cluster的KDC服务器上,导入这些主体条目:
kdb5_util load -b64 /tmp/data_cluster_princs.b64 - 重启两个集群的KDC和Kadmin服务,确保新的主体信息生效:
# 在两个KDC服务器上分别执行 systemctl restart krb5kdc systemctl restart kadmin - 最后在app-cluster的节点上,获取data-cluster NameNode的票据测试:
kinit -kt /path/to/your/keytab user@REALM klist -e # 确认票据包含nn/machine@REALM的条目
方案二:配置KDC间信任关系(适用于扩展场景)
如果后续两个集群需要更灵活的跨域访问,或者不想完全同步主体,可以配置两个独立KDC之间的信任关系(即使REALM名称相同):
- 在两个KDC服务器上,分别创建对方KDC的信任密钥:
# 在data-cluster KDC上执行 kadmin.local: addprinc -randkey krbtgt/REALM@REALM # 在app-cluster KDC上执行 kadmin.local: addprinc -randkey krbtgt/REALM@REALM - 交换两个KDC的信任密钥(确保密钥一致):
在其中一个KDC上导出密钥,再导入到另一个KDC:# 在data-cluster KDC导出密钥 kadmin.local: dump -b64 /tmp/trust_key.b64 krbtgt/REALM@REALM # 传输到app-cluster KDC后导入 kadmin.local: load -b64 /tmp/trust_key.b64 krbtgt/REALM@REALM - 配置
krb5.conf文件,在两个集群的所有节点上添加REALM的多KDC配置:
修改/etc/krb5.conf的[realms]部分,同时指定两个KDC地址:[realms] REALM = { kdc = app-kdc-host:88 kdc = data-kdc-host:88 admin_server = app-kdc-host:749 admin_server = data-kdc-host:749 default_domain = your-domain.com } - 重启所有节点的Kerberos相关服务,包括Ambari代理、Hadoop服务等。
额外注意事项
- 确保两个KDC的时钟同步,Kerberos默认对超过5分钟的时间差非常敏感,会直接导致认证失败。
- 检查app-cluster节点上的
core-site.xml和hdfs-site.xml,确认已正确配置data-cluster的NameNode地址及对应的Kerberos主体名称。 - 如果用Ambari管理集群,可以通过Ambari的Kerberos管理界面添加同步主体,避免手动操作出错。
内容的提问来源于stack exchange,提问作者Srini2k6
相关产品推荐
相关产品推荐

