外部访问部署在kubernetes中的hadoop hdfs

pprl5pva  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(557)

目前,我已经在kubernetes部署了一个hadoop集群。hdfs有三个datanode(statefulset)和一个namenode。我想从外部访问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

但是,节点端口适用于kubernetes集群中的所有节点,因此上述三个IP都将转到同一个服务,并且可能转到错误的数据节点。
这种情况有什么解决办法吗?无论是从hadoop还是kubernetes的Angular 。像这样强制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

这样我就可以为statefulset中的每个pod创建三个服务。

xzv2uavs

xzv2uavs1#

我建议你试试。
假设您的datanode正在监听端口50000,您可以为每个datanode创建单独的服务,并将其运行的节点的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。

相关问题