尝试通过 kubernetes DNS 访问 kubernetes pod 时连接被拒绝
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
访问 ui,我看到一个数据节点向上和 运行。因此集群(设置为 'pseudo-distributed',如 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
What is the difference when accessing a port via k8s-dns?
调用 Pod IP 地址时,您直接连接到 Pod,而不是服务。
当您调用服务的 DNS 名称时,它会解析为一个服务 IP 地址,它将您的请求转发到实际 pods 使用选择器作为过滤器来查找目的地,因此有两种不同的方式如何访问 pods。
此外,您直接调用服务 IP 地址而不是使用 DNS,其工作方式相同。此外,与 Pod IP 不同,Service IP 地址是静态的,因此您可以随时使用它。
对于集群内通信,您使用的是 ClusterIP 服务模式,这是默认设置并且您已设置,所以这里一切正常。
您的服务转发请求的当前端点,您可以在 "endpoint" 列中通过 kubectl get service $servicename -o wide
获得。
你目前的连接问题呢,我可以推荐你:
检查您的服务端点(应该有一个或多个pods的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 is a nice topic with explanation about how Service works. Also, you can check official documentation。
我正在尝试在 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,我看到一个数据节点向上和 运行。因此集群(设置为 'pseudo-distributed',如 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
What is the difference when accessing a port via k8s-dns?
调用 Pod IP 地址时,您直接连接到 Pod,而不是服务。
当您调用服务的 DNS 名称时,它会解析为一个服务 IP 地址,它将您的请求转发到实际 pods 使用选择器作为过滤器来查找目的地,因此有两种不同的方式如何访问 pods。
此外,您直接调用服务 IP 地址而不是使用 DNS,其工作方式相同。此外,与 Pod IP 不同,Service IP 地址是静态的,因此您可以随时使用它。
对于集群内通信,您使用的是 ClusterIP 服务模式,这是默认设置并且您已设置,所以这里一切正常。
您的服务转发请求的当前端点,您可以在 "endpoint" 列中通过 kubectl get service $servicename -o wide
获得。
你目前的连接问题呢,我可以推荐你:
检查您的服务端点(应该有一个或多个pods的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 is a nice topic with explanation about how Service works. Also, you can check official documentation。