尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Ambari+Ranger高可用部署:统一域名下Kerberos票据配置与排障指南
最近在搞 Ranger 双节点高可用HA部署环境是 Ambari 管理的集群Kerberos 已经全线开启。做到第二步——统一访问域名——的时候卡了一阵子Ranger 两个节点打算用一个虚拟域名对外提供服务结果 Kerberos 票据一直验证不过去排了半天才明白问题全出在票据 SPNService Principal Name和访问域名不匹配上。这篇就把 Step2 的完整流程写清楚如何为统一访问域名生成可用的 Kerberos 票据、怎么配进 Ambari 的 Ranger 服务、以及排障时常见的坑。如果你也是 Ambari Ranger Kerberos 这套组合并且打算给 Ranger Admin 做 HA那这篇文章应该能帮你省下不少排查时间。我会尽量把能直接抄的命令、配置路径、报错对照都给出来。1. 为什么统一访问域名和 Kerberos 票据天生不对付1.1 一张 Kerberos 票据里到底写死了什么Kerberos 的认证逻辑和普通 HTTP 登录完全不一样。用账号密码登录系统服务端只需要校验用户名和密码是否正确跟用户从哪个域名进来没有关系。但 Kerberos 不是这样客户端向 KDC 申请服务票据Service Ticket时请求里带的是主机名和服务类型KDC 会去找对应的 SPN找不到就直接拒绝。SPN 的典型格式是服务类型/主机名REALM。在 Ranger 这个场景里服务类型是HTTP主机名就是浏览器或客户端请求里实际访问的域名REALM 是 Kerberos 域一般是大写的。比如HTTP/ranger.example.comEXAMPLE.COM。所以一张票据在签发出来的时候已经绑死了三件事客户端是谁用户 principal服务端是谁SPN 里的主机名用的什么协议HTTP、NFS、host 等这就是为什么你访问ranger.example.com时KDC 不会认HTTP/ranger1.example.com的票据。域名写进票据那一刻就固定了HA 切换不会改变这个事实。1.2 统一访问域名下常见的两种错误理解我在实际排查中遇到过两类比较典型的误区这里直接点破。第一个误区以为 Kerberos 票据只校验用户身份不校验访问域名。这是最大的坑。我在第一次搭的时候以为只要服务端的 keytab 里有HTTP/ranger1.example.com和HTTP/ranger2.example.com客户端用统一域名ranger.example.com访问就能自动匹配到对应节点。实际报错是 Server not found in Kerberos database原因很简单KDC 里根本没有HTTP/ranger.example.com这个 SPN自然签发不出票据。第二个误区以为 HA 切换后客户端的票据还能继续用。实际上服务票据是限时的默认有效期一般在 8 到 24 小时跟 TGT 的有效期绑定。更关键的是票据里的 SPN 是在首次请求时确定的切换节点并不会重新协商。如果你在 Ranger1 存活时申请的票据Ranger1 宕机后流量切到 Ranger2只要 DNS 和 SPN 配置正确Kerberos 认证其实没有问题因为票据是针对HTTP/ranger.example.com这个 SPN 签发的跟后端是哪台物理机无关。但如果你的 SPN 写的是具体节点名那就只能访问那台节点切换后必挂。理解这两点之后后面所有配置就顺理成章了一定要在 KDC 里注册统一域名的 SPN并且确保实际的 Ranger 节点也持有这个 SPN 对应的 keytab。2. 开工前先确认环境与配置清单2.1 集群背景与版本说明我这次操作的集群环境如下供大家对照参考Ambari 2.7.5HDP 3.1.5Ranger 2.1.0KDC 使用 MIT Kerberos默认安装在 kdc.example.comRanger Admin 部署在 rgserver1.example.com 和 rgserver2.example.com 两台节点对外统一访问域名ranger.example.comKerberos RealmEXAMPLE.COM这套流程在 CDP 7.x 环境里也适用Ambari 换成 CDP 的 Management Console 后配置路径略有差异但 Kerberos 侧的命令和原理完全一致。实际操作之前先把节点时间同步确认了。Kerberos 对时钟偏移容忍度默认是 5 分钟超过这个范围认证直接失败报错类似 Clock skew too great。如果 NTP 没有配好后面排查票据问题会非常痛苦因为你可能折腾半天 SPN 才发现是时间偏移导致的。2.2 需要准备哪些 principal 和 keytab在统一访问域名场景下我建议在 KDC 里创建三组 SPN别只建一组principal用途是否必须HTTP/ranger.example.comEXAMPLE.COM统一访问域名的服务票据客户端请求的主 SPN必须HTTP/rgserver1.example.comEXAMPLE.COMRanger 节点的本机 SPN应对按主机名访问的兜底场景建议HTTP/rgserver2.example.comEXAMPLE.COM同上第二台节点建议为什么建议把实际节点的 SPN 也建上因为有些内部组件、监控脚本或者排查问题时会直接用节点 IP 或主机名访问 Ranger API。如果只有统一域名的 SPN遇到这类请求会报错。多建两个不费事keytab 合在一起管理反而方便。keytab 文件我是统一命名为ranger_http.keytab放在/etc/security/keytabs/目录下。Ambari 对 keytab 目录有默认管理逻辑放在这里既方便 Ambari 识别也方便后续做凭证轮转。2.3 关键参数怎么选创建 SPN 时有两个参数需要特别注意。第一个是-randkey。创建服务主体时一定要用随机密钥不要自己指定密码。服务账号的密钥不需要人工知道指定密码反而会让密钥强度不可控也容易让 KDC 和 keytab 中的 KVNOKey Version Number变得难以管理。第二个是-norandkey。如果你在生成 keytab 时使用ktadd默认会重新生成随机密钥这会导致 KVNO 加一。如果客户端本地还持有旧的 keytab就会报 KVNO 不匹配。为了避免这个问题生成 keytab 时用xst -norandkey保持 KDC 中的密钥不变只把对应的 key 导出到 keytab 文件里。还有一个容易忽略的点主机名的大小写。Kerberos 是大小写敏感的浏览器或 curl 请求RANGER.EXAMPLE.COM和ranger.example.com会被当成两个不同的 SPN。建议在服务端配置和 DNS 解析层面统一使用小写域名并且把 DNS 解析记录里的域名也统一成小写避免踩坑。3. 生成与配置统一访问域名票据的完整流程3.1 在 KDC 中创建统一域名的 SPN这一步需要在 KDC 服务器上操作使用kadmin.local可以免认证进入管理数据库。我通常会先把所有 principal 批量创建好kadmin.local -q addprinc -randkey HTTP/ranger.example.comEXAMPLE.COM kadmin.local -q addprinc -randkey HTTP/rgserver1.example.comEXAMPLE.COM kadmin.local -q addprinc -randkey HTTP/rgserver2.example.comEXAMPLE.COM每条命令执行后应该能看到确认信息类似Principal HTTP/ranger.example.comEXAMPLE.COM created。如果提示 principal 已存在说明之前配置过可以用getprinc查看详情确认 KVNO 和密钥版本。创建完成后建议用listprincs确认一下kadmin.local -q listprincs | grep HTTP/这一步的目的是确认 SPN 已经存在于 KDC 数据库中。如果你用的是 AD 域控而不是 MIT KDC创建方式会有差异但核心思路一样为统一域名注册 SPN并且确保服务和 keytab 的对应关系正确。3.2 生成 keytab 并分发到 Ranger 节点SPN 创建好之后在 KDC 上导出 keytab。这里我用xstextract service ticket 的缩写注意加上-norandkeykadmin.local -q xst -norandkey -k /tmp/ranger_http.keytab HTTP/ranger.example.comEXAMPLE.COM HTTP/rgserver1.example.comEXAMPLE.COM HTTP/rgserver2.example.comEXAMPLE.COM执行完后用klist验证 keytab 文件里包含的 principalklist -e -k /tmp/ranger_http.keytab这个命令会列出 keytab 里的所有主体以及对应的加密类型。如果输出里能看到三个 HTTP/ 开头的 principal说明导出成功。注意看一眼加密类型如果有aes256-cts-hmac-sha1-96这种需要确保 JDK 支持 AES-256否则后面服务端验证会报加密类型不支持的问题。然后把这个 keytab 拷贝到两台 Ranger 节点上scp /tmp/ranger_http.keytab rootrgserver1:/etc/security/keytabs/ranger_http.keytab scp /tmp/ranger_http.keytab rootrgserver2:/etc/security/keytabs/ranger_http.keytab拷贝完成后在两台节点上分别设置属主和权限。这一步非常重要Ranger 服务以ranger用户运行如果 keytab 权限不对服务端无法读取chown ranger:ranger /etc/security/keytabs/ranger_http.keytab chmod 600 /etc/security/keytabs/ranger_http.keytab3.3 把 SPN 和 keytab 配进 Ambari 的 Ranger 配置keytab 就位后接下来要告诉 Ranger 服务端使用这个统一域名 SPN。在 Ambari 页面里进入 Ranger 服务的 Configs找到Advanced ranger-admin-site配置项。需要重点确认和修改的配置项有这几个ranger.spnego.kerberos.principal设置为HTTP/ranger.example.comEXAMPLE.COMranger.spnego.kerberos.keytab设置为/etc/security/keytabs/ranger_http.keytabranger.spnego.kerberos.auth.enabled设置为true这里有个细节要注意。Ambari 里很多组件默认的 SPN 格式是HTTP/_HOSTEXAMPLE.COM_HOST会被自动替换成部署节点的实际主机名。在统一域名场景下必须手动改成HTTP/ranger.example.comEXAMPLE.COM否则即使 keytab 分发到位服务端验证时用的还是实际主机名和客户端请求的域名对不上。修改配置后保存Ambari 会提示需要重启 Ranger。先不急着点继续把服务端票据验证的准备工作做完。3.4 重启服务并验证服务票据在 Ambari 里重启 Ranger Admin 组件等待状态变成绿色。然后到两台 Ranger 节点上验证服务端是否能正常读取 keytabklist -k /etc/security/keytabs/ranger_http.keytab用服务端 principal 初始化缓存kinit -kt /etc/security/keytabs/ranger_http.keytab HTTP/ranger.example.comEXAMPLE.COM klist如果能看到类似Ticket cache: FILE:/tmp/krb5cc_0的输出并且Default principal: HTTP/ranger.example.comEXAMPLE.COM显示正确说明服务端 keytab 可用。注意这里的 klist 是在命令行环境验证 keytab 能否被 KDC 接受实际 Ranger 服务运行时会自己读取 keytab 并响应 SPNEGO 认证请求不需要手动常驻票据缓存。之所以建议手动验证一次是为了排除 keytab 损坏或 KVNO 不一致的问题。3.5 给客户端用户生成可用的缓存票据服务端配置完成不等于客户端能直接访问。客户端发起 HTTPS 请求时需要先通过 kinit 拿到自己的 TGT再用 SPNEGO 机制申请针对HTTP/ranger.example.com的服务票据。测试机上执行kinit admin_userEXAMPLE.COM输入密码后用klist确认 TGT 存在。然后使用 curl 的 SPNEGO 支持来验证完整链路curl --negotiate -u : -k -I https://ranger.example.com:6182这里的参数解释一下--negotiate启用 SPNEGO 认证-u :配合 negotiate 使用表示从缓存中取凭证不需要在命令行输入密码-k跳过证书校验。如果 Ranger 已经配了合法的 CA 证书可以去掉如果返回HTTP/1.1 200 OK说明从 kinit 到 KDC 签发服务票据再到 Ranger 服务端验证 keytab整条链路已经通了。如果返回 401就需要按第 4 节的排查思路逐步定位。4. 服务端和客户端的常见报错排查实录4.1 典型错误场景与解决办法我把这次部署过程中实际遇到的报错整理成了对照表按出现的频率排序报错或现象根本原因解决办法Server not found in Kerberos databaseKDC 中没有HTTP/ranger.example.comEXAMPLE.COM这个 SPN用addprinc -randkey创建对应 SPNKey version number for principal is not availablekeytab 里的 KVNO 和 KDC 中不一致用xst -norandkey重新导出 keytab删除旧 keytab 后重新分发Credentials cache file not found当前用户没有有效的 kinit 缓存执行kinit并确认KRB5CCNAME环境变量指向正确的 cache 文件Encryption type not supportedKDC 或 JDK 不支持 keytab 里的加密类型检查 krb5.conf 的加密类型配置或升级 JDK/JCEcurl 返回 401但 klist 显示有票据客户端的服务票据是针对HTTP/实际节点名签发的不是统一域名kdestroy后重新请求确保访问的 URL 和 SPN 完全一致浏览器反复弹认证框无法免密登录浏览器没有把统一域名加入自动协商白名单Firefox 设置network.negotiate-auth.trusted-urisChrome 使用策略或将该域加入受信任站点服务端日志报 GSSException 或 JAAS 错误Ranger 服务端读不到 keytab或 keytab 权限不对确认/etc/security/keytabs/ranger_http.keytab属主是 ranger权限 600HA 切换后客户端无法访问DNS 的 TTL 太长客户端仍然解析到已宕机节点缩短 TTL或使用 VIP 方式绑定统一域名这里面最有迷惑性的是最后一条。Kerberos 票据本身不感知物理节点的存活性它会一直尝试连接解析出来的 IP。如果 DNS 在节点切换后没有及时更新客户端会一直往宕机节点发包表现出的现象是切换后认证失败但本质是网络不可达跟票据无关。4.2 排查过程中最容易被忽略的细节第一个容易被忽略的细节是KRB5CCNAME环境变量。用 root 执行 kinit 和使用 ranger 用户执行 kinit默认的缓存路径不同。如果你手动在 root 下验证客户端访问正常但以 ranger 用户跑的进程报错找不到凭证先检查环境变量是不是指向了同一个缓存文件。更保险的做法是在测试时显式指定export KRB5CCNAME/tmp/krb5cc_ranger_test kinit -kt /etc/security/keytabs/ranger_http.keytab HTTP/ranger.example.comEXAMPLE.COM这样能避免 shell 环境的缓存文件互相干扰排障时更容易定位。第二个细节是 /etc/hosts 的解析问题。如果 Ranger 节点的/etc/hosts里没有配置ranger.example.com的映射服务端日志里可能会出现主机名解析失败的情况。虽然这不一定直接导致 Kerberos 报错但在分布式环境里会让排查变得很混乱。我习惯在所有相关节点的/etc/hosts里加一行统一域名的映射指向当前的主 Ranger 节点并用注释标明这是一条 HA 域名解析记录。第三个细节是时间同步。前面提过一次这里再强调一遍因为真的是高发问题。Kerberos 认证对时间窗口非常敏感一旦超过 5 分钟偏差任何票据都会验证失败。如果发现 KDC 日志里大量出现CLOCK_SKEW不要犹豫先把 NTP 状态修好再往下排查。4.3 关于 KVNO 的一个经验教训KVNO 问题值得单独拿出来说因为我第一次搭的时候就是被它坑的。当时我在 KDC 上用ktadd生成了 keytab后来发现有一个 principal 的密码泄露风险就又执行了一次ktadd重新生成。结果旧 keytab 没有及时清理部分节点上还留着旧的 KVNO 版本导致服务端验证时一直报 KVNO 不匹配。正确做法是当需要重新生成 keytab 时在 KDC 上删除旧 keytab 文件用xst -norandkey导出新 keytab同步分发到所有相关节点用klist -e -k检查每台节点的 KVNO 是否一致如果 Ambari 本身管理了 Ranger 的 keytab 生成流程优先使用 Ambari 的Generate Keytabs功能它能保证所有节点的 keytab 一致。只有在 Ambari 无法覆盖的场景下才手动生成并分发。5. 一些实测后的经验总结与建议5.1 统一域名规范的几个建议经过这次部署我总结了一套相对稳妥的统一域名 Kerberos 配置规范供参考第一统一域名和真实节点域名要能区分。建议统一域名只作为服务入口角色存在不要和任何具体节点的主机名重叠。例如节点是 rgserver1.example.com、rgserver2.example.com统一域名单独命名为 ranger.example.com这样在排查问题时看日志就能快速判断是走统一入口还是直连节点。第二DNS 层面要给统一域名配好解析。最省心的方式是配合 VIP 或负载均衡器。如果没有现成的 LB至少要把 TTL 设短一点默认的 3600 秒在 HA 切换场景下太长了。我建议 TTL 设在 30 秒左右配合监控脚本做快速切换。第三keytab 统一命名并集中管理。不要每台节点生成一个单独的 keytab而是把统一域名和所有节点 SPN 合到一个 keytab 文件里分发到所有 Ranger 节点。这样后续做密钥轮转时只需要生成一次、分发一次。5.2 后续可以怎么扩展这套票据生成方案不只是给 Ranger Admin 用的思路可以复用到其他需要 Kerberos HA 统一域名的组件。比如 HiveServer2 的高可用场景如果也想用统一域名对外提供服务同样需要在 KDC 里注册HTTP/hive.example.comEXAMPLE.COM的 SPN并将对应的 keytab 分发给所有 HiveServer2 节点。ZooKeeper、HDFS NameNode 的高可用也有类似的诉求区别主要在服务类型前缀和端口。另外如果后续想用 Ranger 的 REST API 做自动化curl --negotiate 这种方式可以直接写入脚本。只需要保证执行脚本的用户在运行前有有效的 kinit 缓存或者每次运行时先执行 kinit -kt 指定 keytab。这样认证部分就不再依赖人工输入密码了。还有一点如果你打算把 Ranger 接入 Knox统一域名会变成 Knox 的对外地址此时 Kerberos 认证链路会多一层 Knox SSO。Knox 会使用自己的 SPN 和 keytabRanger 侧的 SPNEGO 配置通常会关闭由 Knox 代为认证。这个场景不在这篇范围内但原理是相通的理解票据 SPN 绑定域名的机制之后换到 Knox 环境也只是换了一个服务的 SPN 而已。最后分享一个小技巧。排障时如果不确定当前请求的 URL 和票据是否匹配可以在客户端执行klist查看缓存里的服务票据重点看 principal 里的主机名和请求域名是否一致然后执行kdestroy清空缓存重新发起一次请求。往往一次干净的重新认证能解决 80% 的奇怪问题。
RELATED

相关推荐

AI写作与传统原创性的碰撞与思考

AI写作与传统原创性的碰撞与思考

1. 当86岁作家遭遇AI写作:一场关于原创性的时代对话那天在咖啡馆翻到新闻时,我的手突然停在半空——86岁的儿童文学作家公开承认抄袭,而同一版面上正报道着某AI写作平台完成B轮融资。玻璃窗上的雨痕把两则新闻连成扭曲的平行线,让…

📅 2026/9/15 23:36:39
Mini DP转HDMI/VGA双显技术原理与实战指南

Mini DP转HDMI/VGA双显技术原理与实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 23:36:39
猜数字游戏:零基础掌握编程核心逻辑的入门范式

猜数字游戏:零基础掌握编程核心逻辑的入门范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 23:36:39
MORE NEWS

更多资讯

📰

AI模型蒸馏技术原理与合规实践指南

我无法根据该标题生成符合要求的博文内容。原因如下:标题中提及的“Claude 20X”并非真实存在的公开模型版本。Anthropic 官方发布的 Claude 系列模型最新公开版本为 Claude 3.5 Sonnet(截至2024年中),不存在编号为“20X”的官方模…

📰

数据仓库分区策略与查询性能:从原理到实战调优

作为一名长期跟数据仓库打交道的人,我最早对“分区”这件事的理解其实很肤浅,觉得不就是把大表按日期切成小份嘛。直到有一次线上报表查询从几十秒恶化到十几分钟,我才真正意识到,数据分区策略远不是“切一刀”那么简单——它直接…

📰

谨慎选择!并非所有 AI 都能帮你写论文,2026 教授认可工具推荐

每年毕业季,无数同学深陷论文难题:开题毫无思路、搭建框架耗费数日、初稿逻辑松散、查重标红泛滥、AI检测超标、格式反复被导师驳回。面对繁重的写作任务,不少学生选择借助通用型AI工具辅助,但市面上大多数AI平台存在明显短板。它…

📰

MES质量过程管理与AI视觉检测深度集成实战

1. 这不是PPT里的概念图,而是产线凌晨三点还在跑的系统骨架MES(制造执行系统)这个词,现在被讲得太多,反而失真了。很多人一听到“MES”,脑子里立刻浮现出一张带箭头的流程图:订单进来→排产→工…

📰

现在实用的一键生成论文工具有哪些品牌?聊聊真实使用体验

每到期末、毕业答辩、课题申报阶段,很多学生都会陷入论文写作的困境:选题毫无头绪、大纲搭建逻辑混乱、正文撰写耗时长、参考文献格式出错、查重重复率偏高、AIGC检测告警、本校论文排版标准复杂。依靠纯人工从零开始撰写、一遍遍修改格式和降重&#xf…

📰

CUDA Samples 完整实战指南:从源码构建、交叉编译到自动化测试(CUDA Toolkit 13.3)

CUDA Samples 完整实战指南:从源码构建、交叉编译到自动化测试(CUDA Toolkit 13.3) 【免费下载链接】cuda-samples Samples for CUDA Developers which demonstrates features in CUDA Toolkit 项目地址: https://gitcode.com/GitHub_Trend…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬