对于启用了kerberos认证的两个集群之间,如何进行分布式拷贝(distcp)。做一个记录和备忘。主要是如何设置kerberos之间的双向信任。 [toc]
一 从有kerberos认证的集群 向 无keberos认证的集群 复制文件
#1.1 场景描述
CLUSTER-A集群开启了Kerberos认证, CLUSTER-B集群无Kerberos认证。 在CLUSTER-A集群上,运行 distcp 命令,复制文件到CLUSTER-B集群。
1.2 问题备忘
报错:java.io.IOException: Server asks us to fall back to SIMPLE auth, but this client is configured to only allow secure connections. 客户端配置了安全连接, 但是服务器请求回退到非安全的SIMPLE模式。 对于单次运行的命令行,可以使用 -D ipc.client.fallback-to-simple-auth-allowed=true 参数,例如:
hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true /tmp/testfile hdfs://cluster-b-namename:8020/tmp/
对于经常执行的集群之间,可以在core-site.xml中设置此参数,如果使用CDH集群,Cloudera Manager上面,设置对应的core-site.xml的集群高级配置代码段。
二 两个独立Kerberos认证的集群
2.1 场景描述
对于两个独立的开启Kerberos认证的集群,比如CLUSTER-DEV 和 CLUSTER-PROD环境。 CLUSTER-DEV: 表 2.1 CLUSTER-DEV集群说明
IP地址 | host name | 角色 |
---|---|---|
192.168.1.250 | cluster-dev-master | Hadoop NameNode |
192.168.1.249 | cluster-dev-worker01 | Hadoop NameNode |
192.168.1.240 | cluster-dev-kerberos | Kerberos KDC |
CLUSTER-PROD: 192.168.进行集群间通信,172.16进行集群内通信 表 2.2 CLUSTER-PROD集群说明
IP地址 | host name | 角色 |
---|---|---|
192.168.1.221 / 172.16.1.221 | cluster-prod-master01 | Hadoop NameNode |
192.168.1.222 / 172.16.1.222 | cluster-prod-master02 | Hadoop NameNode |
192.168.1.235 / 172.16.1.235 | cluster-prod-kerberos | Kerberos KDC |
需要按照下列步骤,进行Kerberos域的双向认证。
2.2 配置步骤
2.2.1 配置/etc/krb5.conf
- 配置[realms]段,加入另外一个KDC服务器。
[realms]
CLUSTER-DEV = {
kdc = cluster-dev-kerberos
admin_server = cluster-dev-kerberos
default_principal_flags = +renewable
default_domain = cluster-dev
}
CLUSTER-PROD = {
kdc = cluster-prod-kerberos
admin_server = cluster-prod-kerberos
default_principal_flags = +renewable
default_domain = cluster-prod
}
-
配置[domain_realm]段,特定域名的主机属于特定的Kerberos域。 因为我们主机命名没有使用FQDN的域名方式,所以无法通过域名后缀判断所属的Kerberos域,需要额外指定哪些主机是属于哪些域的。
[domain_realm] .cluster-prod = CLUSTER-PROD cluster-prod = CLUSTER-PROD .cluster-dev = CLUSTER-DEV cluster-dev = CLUSTER-DEV # 因为我们的主机命名,没有遵循FQDN的方式,所以要指明那些主机属于另外一个域。 cluster-prod-master01 = CLUSTER-PROD cluster-prod-master02 = CLUSTER-PROD cluster-dev-master = CLUSTER-DEV cluster-dev-worker01 = CLUSTER-DEV
-
配置[capaths]段 一些手册写配置此项,但是我试了一下,配不配都不影响。 对于CLUSTER-PROD集群, capaths段配置:
#[capaths] # CLUSTER-PROD = { # CLUSTER-DEV = . # }
对于CLUSTER-DEV集群,capaths段配置:
#[capaths] # CLUSTER-DEV = { # CLUSTER-PROD = . # }
理论上,是应该把这些krb5.conf复制到集群的全部节点当中。但是测试发现,只要通信的两个节点之间的krb5.conf是对的,就可以了。不过还是建议遵从参考建议,保持krb5.conf在集群中的一致性。
2.2.2 创建krbtgt互信principal
在两个集群的KDC上,运行kadmin.local
注意:
- 密码要一致。
- 这两个 /域1@域2,是相反的。
kadmin.local: addprinc krbtgt/CLUSTER-DEV@CLUSTER-