最近当slave开始慢慢部署异地集群的时候又碰上了这个问题
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是怎么做验证的
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如果要验证成功,离不开的要素有
1. timestamp
2. hostname
3. 密钥
4. 必要的方法:md5 随机数 base64
所以要想mesos的slave和master验证成功,系统的时间首先要保证一致,其次,对本地hostname和解析要有,而且解析速度不能低于5秒,有代码为证:
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之间的验证,只包含了两种通信
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之间已经商量好了通信验证的方式