使用flume读取kafka时出现no rules applied to
排查思路,根据报错可以得知是kerberos认证规则出现了问题,于是在当前节点安装了kerberos客户端,使用kinit进行认证发现没有问题.
下一步排查flume配置的krb5.conf文件查看domain_realm映射的realms是否有问题,发现也正常.
大数据Kerberos认证报No rules applied to
后来查一下相关资料,发现大佬看了kerberos源码,跟着看下来发现问题出现在这里,遍历了所有rules后,都未能返回一个不为null的result
public String getShortName() throws IOException {
String[] params;
if (hostName == null) {
// if it is already simple, just return it
if (realm == null) {
return serviceName;
}
params = new String[]{realm, serviceName};
} else {
params = new String[]{realm, serviceName, hostName};
}
for (Rule r : rules) {
String result = r.apply(params);
if (result != null) {
return result;
}
}
LOG.info("No auth_to_local rules applied to {}", this);
return toString();
}
这个位置params = new String[]{realm, serviceName, hostName}
接下来查看遍历rules时做了什么
通过上面得知result都是null,猜测defaultRealm与realm不一致
Rule() {
isDefault = true;
}
String apply(String[] params) throws IOException {
String result = null;
if (isDefault) {
//如果defaultRealm等于realm,result=serviceName
if (defaultRealm.equals(params[0])) {
result = params[1];
}
} else if (params.length - 1 == numOfComponents) {
String base = replaceParameters(format, params);
if (match == null || match.matcher(base).matches()) {
if (fromPattern == null) {
result = base;
} else {
result = replaceSubstitution(base, fromPattern, toPattern, repeat);
}
}
}
if (result != null && nonSimplePattern.matcher(result).find()) {
LOG.info("Non-simple name {} after auth_to_local rule {}",
result, this);
}
if (toLowerCase && result != null) {
result = result.toLowerCase(Locale.ENGLISH);
}
return result;
}
于是排查了一下krb5.conf中的default_realm,发现确实配置的是另一个KDC
感觉像是后面认证hdfs的时候没有通过domain_realm找到正确的realms而是使用的defaultRealm,删掉default_realm,问题解决