尝试通过kubernetes DNS访问kubernetes pod时连接被拒绝

时间:2019-01-20 08:57:58

标签: java docker hadoop kubernetes network-programming

我正在尝试在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

1 个答案:

答案 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