前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mesos:Authentication timed out

mesos:Authentication timed out

作者头像
domain0
发布2018-08-02 11:52:01
3170
发布2018-08-02 11:52:01
举报
文章被收录于专栏:运维一切运维一切

最近当slave开始慢慢部署异地集群的时候又碰上了这个问题

代码语言:javascript
复制
I0717 10:27:11.695762 28852 slave.cpp:895] New master detected at master@192.168.2.161:5050
I0717 10:27:11.695811 28852 slave.cpp:954] Authenticating with master master@192.168.2.161:5050
I0717 10:27:11.696765 28852 slave.cpp:965] Using default CRAM-MD5 authenticatee
I0717 10:27:11.697120 28852 slave.cpp:927] Detecting new master
I0717 10:27:11.697765 28850 authenticatee.cpp:97] Initializing client SASL
I0717 10:27:11.698652 28850 authenticatee.cpp:121] Creating new client SASL connection
W0717 10:27:16.700867 28852 slave.cpp:1068] Authentication timed out
W0717 10:27:26.715133 28856 slave.cpp:1013] Failed to authenticate with master master@192.168.2.161:5050: Authentication discarded

我这是受够了这种问题,明明看起来很简单,但是又老是出现

那我们来看一下到底cram-md5是怎么做验证的

代码语言:javascript
复制
S: * OK IMAP4 Server
C: A0001 AUTHENTICATE CRAM-MD5
S: + PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+ -------- Server发送BASE64编码的Timestamp、Hostname等给Client
C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw ------- Client将收到的信息加上用户名和口令,编码为BASE64发送给Server
S: A0001 OK CRAM authentication successful ----------- Server使用该用户的口令进行MD5运算,如果得到相同的输出则认证成功 

引用:https://blog.csdn.net/mhfh611/article/details/9470599

具体看一下协议的交互过程

协议
协议

引用:https://en.wikipedia.org/wiki/CRAM-MD5

通过上面的可以看出来,CRAM-MD5如果要验证成功,离不开的要素有

代码语言:javascript
复制
1. timestamp
2. hostname
3. 密钥
4. 必要的方法:md5 随机数  base64

所以要想mesos的slave和master验证成功,系统的时间首先要保证一致,其次,对本地hostname和解析要有,而且解析速度不能低于5秒,有代码为证:

代码语言:javascript
复制
  delay(Seconds(5),
        self(),
        &Self::authenticationTimeout,
        future);

这个5秒的限制在master和slave上都有,如果仔细看上面的日志,“Authentication timed out”发生的时间恰恰是"SASL connection"的5秒之后,就是这个硬编码控制的。

网上大多数的timeout的问题就出现在这里,如果你修改了主机的Hostname,但是你在本地没有配置/etc/hosts,本地的DNS server也没办法解析,这这里就会出现"Authentication timed out"。

另外我也做了tcpdump,对通信做了分析,master和slave之间的验证,只包含了两种通信

代码语言:javascript
复制
1. slave请求master接口
POST /master/mesos.internal.AuthenticateMessage HTTP/1.1
User-Agent: libprocess/crammd5_authenticatee(1)
Libprocess-From: crammd5_authenticatee(1)
Connection: Keep-Alive
Host: 
Transfer-Encoding: chunked
2. master请求slave的接口
POST /crammd5_authenticatee(1)/mesos.internal.AuthenticationMechanismsMessage HTTP/1.1
User-Agent: libprocess/crammd5_authenticator_session(2)
Libprocess-From: crammd5_authenticator_session(2)
Connection: Keep-Alive
Host: 
Transfer-Encoding: chunked

此时已经可以表示master和slave之间已经商量好了通信验证的方式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档