在Kubernetes中外部访问Hadoop HDFS

时间:2018-11-05 06:28:29

标签: hadoop dns kubernetes hdfs

当前,我已经在Kubernetes中部署了一个Hadoop集群。 HDFS有三个数据节点(状态集)和一个名称节点。 我想从外部访问HDFS中的数据。因此,我创建了一个具有nodePort类型的服务来导出namenode。当我尝试在HDFS中下载文件时,namenode将我重定向到datanode。问题是,重定向url的域是Kubernetes中的域,例如hadoop-hdfs-dn-0.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075,该域无法从外部访问。

我的第一个想法是由客户自己解决域名。喜欢

hadoop-hdfs-dn-0.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => IP0:50075
hadoop-hdfs-dn-1.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => IP1:50075
hadoop-hdfs-dn-2.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => IP2:50075

但是,nodePort应用于Kubernetes集群中的所有节点,因此上述所有三个IP将使用同一服务,并且可能使用错误的datanode。

这种情况有解决方案吗? 从Hadoop或Kubernetes的角度来看。 像强迫namenode这样重定向?

hadoop-hdfs-dn-0.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => <node IP>:50001
hadoop-hdfs-dn-1.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => <node IP>:50002
hadoop-hdfs-dn-2.hadoop-hdfs-dn.hadoop.svc.cluster.local:50075 => <node IP>:50003

这样我就可以为有状态集中的每个Pod创建三个服务。

1 个答案:

答案 0 :(得分:2)

我建议您尝试使用externalIP。

假设您的数据节点正在侦听端口50000,则可以为每个数据节点创建单独的服务,并将其运行的节点的nodeip用作externalIP。像这样的东西:

apiVersion: v1
kind: Service
metadata:
  name: datanode-1
spec:
  externalIPs:
  - node1-ip
  ports:
  - name: datanode
    port: 50000
  selector:
    app: datanode
    id: "1"
---
apiVersion: v1
kind: Service
metadata:
  name: datanode-2
spec:
  externalIPs:
  - node2-ip
  ports:
  - name: datanode
    port: 50000
  selector:
    app: datanode
    id: "2"
---
apiVersion: v1
kind: Service
metadata:
  name: datanode-3
spec:
  externalIPs:
  - node3-ip
  ports:
  - name: datanode
    port: 50000
  selector:
    app: datanode
    id: "3"

然后,您可以将这些Pod域名解析为运行它的节点ip。