[英]Connection refused when trying to access a kubernetes pod via kubernetes DNS
我正在尝试在 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
访问用户界面,我看到一个数据节点正在运行。 因此集群(设置为“伪分布式”作为描述在这里。)似乎是工作的罚款。
但是,当我想通过 kubernetes dns 访问我的服务时,我收到Connection refused
denied 。
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
通过 k8s-dns 访问端口有什么区别?
当您调用 Pod IP 地址时,您直接连接到 Pod,而不是连接到服务。
当您调用服务的 DNS 名称时,它会解析为服务 IP 地址,该地址使用选择器作为过滤器将您的请求转发到实际的 pod 以查找目的地,因此这是访问 pod 的两种不同方式。
此外,您可以直接调用服务 IP 地址而不是使用 DNS,它的工作方式相同。 此外,服务 IP 地址与 Pod IP 不同,它是静态的,因此您可以随时使用它。
对于集群内通信,您使用的是ClusterIP服务模式,这是默认的并且您设置了它,所以这里一切正常。
您的服务转发请求的当前端点,您可以通过kubectl get service $servicename -o wide
在“端点”列中获取。
关于您目前的连接问题,我可以向您推荐:
检查服务的端点(应该有一个或多个 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.