代码之家  ›  专栏  ›  技术社区  ›  Falco Winkler

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

  •  0
  • Falco Winkler  · 技术社区  · 7 年前

    我正试图在Kubernetes上建立一个Hadoop单节点。 奇怪的是,当我通过 kubectl exec -it <pod> /bin/bash 我可以很高兴地访问端口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 我看到一个数据节点正在运行。所以集群(设置是“伪分布式”的,如前所述 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 name节点正在监听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 回复  |  直到 7 年前
        1
  •  2
  •   Anton Kostenko    7 年前

    通过K8S DNS访问端口有什么区别?

    当您调用一个POD IP地址时,您直接连接到一个POD,而不是服务。

    当您调用服务的DNS名称时,它解析为一个服务IP地址,该地址使用选择器作为过滤器将您的请求转发到实际的pods以查找目标,因此有两种不同的访问pods的方法。

    另外,您可以直接调用服务IP地址,而不是使用DNS,它的工作方式相同。此外,与pod-ips不同的是,服务IP地址是静态的,因此您可以随时使用它。

    用于集群通信 ClusterIP 服务模式,这是默认的,您设置了它,所以这里一切都正常。

    服务转发请求的当前端点 kubectl get service $servicename -o wild 在“端点”列中。

    关于您目前的连接问题,我可以向您推荐:

    • 检查服务的端点(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
      

    附笔。 Here 是一个很好的主题,可以解释服务是如何工作的。另外,你可以查一下官方的 documentation .

    推荐文章