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

soat7uwm  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(639)

我正在尝试在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 我看到一个数据节点正在运行。因此集群(如这里所述的设置是“伪分布式的”)似乎工作正常。
但是,当我想通过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 node正在监听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
kt06eoxx

kt06eoxx1#

当通过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

p、 这里有一个很好的主题,解释了服务是如何工作的。此外,你还可以查看官方文件。

相关问题