当前,我已经在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创建三个服务。
答案 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。