跨Kerberos的集群间distcp

0 / 967

对于启用了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. 这两个 /域1@域2,是相反的。
kadmin.local:  addprinc krbtgt/CLUSTER-DEV@CLUSTER-