我正在尝试在kubernetes上设置hadoop单节点。
奇怪的是,当我通过kubectl exec -it <pod> /bin/bash
登录到pod时,我可以很高兴地访问例如端口9000上的名称节点。
root@hadoop-5dcf94b54d-7fgfq:/hadoop/hadoop-2.8.5# telnet localhost 9000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
我也可以bin/hdfs dfs -put
个文件之类的文件,因此群集似乎工作正常。
我也可以通过kubectl port-forward <podname> 50070:50070
访问ui,并且看到一个数据节点已启动并正在运行。因此,群集(如here所述,设置为“伪分布式”。)似乎运行良好。
但是,当我想通过kubernetes dns访问我的服务时,我得到了Connection refused
。
telnet hadoop.aca534.svc.cluster.local 9000
Trying 10.32.89.21...
telnet: Unable to connect to remote host: Connection refused
通过k8s-dns访问端口有什么区别?
端口必须是开放的,我还可以看到hadoop名称节点正在侦听9000。
lsof -i :9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2518 root 227u IPv4 144574393 0t0 TCP localhost:9000 (LISTEN)
java 2518 root 237u IPv4 144586825 0t0 TCP localhost:9000->localhost:58480 (ESTABLISHED)
java 2660 root 384u IPv4 144584032 0t0 TCP localhost:58480->localhost:9000 (ESTABLISHED)
有关完整参考,请参阅我的kubernetes yml
服务和部署规范。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
service: hadoop
name: hadoop
spec:
selector:
matchLabels:
service: hadoop
replicas: 1
template:
metadata:
labels:
service: hadoop
run: hadoop
track: stable
spec:
containers:
- name: hadoop
image: falcowinkler/hadoop:2.8.5
imagePullPolicy: Never
ports:
# HDFS Ports
- containerPort: 50010
- containerPort: 50020
- containerPort: 50070
- containerPort: 50075
- containerPort: 50090
- containerPort: 8020
- containerPort: 9000
# Map Reduce Ports
- containerPort: 19888
# YARN Ports
- containerPort: 8030
- containerPort: 8031
- containerPort: 8032
- containerPort: 8033
- containerPort: 8040
- containerPort: 8042
- containerPort: 8088
- containerPort: 22
# Other Ports
- containerPort: 49707
- containerPort: 2122
---
apiVersion: v1
kind: Service
metadata:
labels:
service: hadoop
name: hadoop
spec:
ports:
- name: hadoop
port: 9000
- name: ssh
port: 22
- name: hadoop-ui
port: 50070
selector:
service: hadoop
type: ClusterIP
答案 0 :(得分:2)
通过k8s-dns访问端口有什么区别?
呼叫Pod IP地址时,您直接连接到Pod,而不是服务。
当您调用服务的DNS名称时,它将解析为服务IP地址,该地址使用选择器作为筛选器将您的请求转发到实际的Pod,以查找目的地,因此这是两种访问Pod的不同方式。
此外,您可以直接调用服务IP地址而不是使用DNS,它的工作方式相同。此外,服务IP地址与Pod IP不同,它是静态的,因此您可以随时使用它。
对于集群内通信,您正在使用ClusterIP服务模式,该模式是默认设置,您已对其进行了设置,因此此处一切正常。
您的服务转发请求的当前端点,您可以通过kubectl get service $servicename -o wild
在“端点”列中获得该端点。
关于您当前的连接问题,我可以推荐您:
检查服务的端点(应该有一个或多个pod的IP地址),
为每个服务端口设置targetPort
参数,例如:
apiVersion: v1
kind: Service
metadata:
labels:
service: hadoop
name: hadoop
spec:
ports:
- name: hadoop
port: 9000
targetPort: 9000 # here is
- name: ssh
port: 22
targetPort: 22 # here is
- name: hadoop-ui
port: 50070
targetPort: 50070 # here is
selector:
service: hadoop
type: ClusterIP
P.S。 Here是一个很好的主题,提供了有关服务如何工作的解释。另外,您可以检查官方documentation。