首页 > 解决方案 > kubectl 端口转发连接被拒绝 [ socat ]

问题描述

我在 kubernetes 的一个端口上运行 pyspark。我正在尝试转发到我的本地机器。执行 python 文件时出现此错误。

Forwarding from 127.0.0.1:7077 -> 7077
Forwarding from [::1]:7077 -> 7077
Handling connection for 7077
E0401 01:08:11.964798   20399 portforward.go:400] an error occurred forwarding 7077 -> 7077: error forwarding port 7077 to pod 68ced395bd081247d1ee6b431776ac2bd3fbfda4d516da156959b6271c2ad90c, uid : exit status 1: 2019/03/31 19:38:11 socat[1748104] E connect(5, AF=2 127.0.0.1:7077, 16): Connection refused

这是我的python文件的几行。我在定义 conf 的行中遇到错误。

from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext

conf = SparkConf().setMaster("spark://localhost:7077").setAppName("Stand Alone Python Script")

我已经尝试socat在 kubernetes 上安装。我在本地使用 spark 版本 2.4.0。我什至尝试在 YAML 文件中公开端口 7077。没有成功。

这是用于部署的 YAML 文件。

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  creationTimestamp: 2018-10-07T15:23:35Z
  generation: 16
  labels:
    chart: spark-0.2.1
    component: m3-zeppelin
    heritage: Tiller
    release: m3
  name: m3-zeppelin
  namespace: default
  resourceVersion: "55461362"
  selfLink: /apis/apps/v1beta1/namespaces/default/statefulsets/m3-zeppelin
  uid: f56e86fa-ca44-11e8-af6c-42010a8a00f2
spec:
  podManagementPolicy: OrderedReady
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      component: m3-zeppelin
  serviceName: m3-zeppelin
  template:
    metadata:
      creationTimestamp: null
      labels:
        chart: spark-0.2.1
        component: m3-zeppelin
        heritage: Tiller
        release: m3
    spec:
      containers:
      - args:
        - bash
        - -c
        - wget -qO- https://archive.apache.org/dist/spark/spark-2.2.2/spark-2.2.2-bin-hadoop2.7.tgz
          | tar xz; mv spark-2.2.2-bin-hadoop2.7 spark; curl -sSLO https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-latest-hadoop2.jar;
          mv gcs-connector-latest-hadoop2.jar lib; ./bin/zeppelin.sh
        env:
        - name: SPARK_MASTER
          value: spark://m3-master:7077
        image: apache/zeppelin:0.8.0
        imagePullPolicy: IfNotPresent
        name: m3-zeppelin
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        resources:
          requests:
            cpu: 100m
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /zeppelin/conf
          name: m3-zeppelin-config
        - mountPath: /zeppelin/notebook
          name: m3-zeppelin-notebook
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
  - metadata:
      creationTimestamp: null
      name: m3-zeppelin-config
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10G
      storageClassName: standard
    status:
      phase: Pending
  - metadata:
      creationTimestamp: null
      name: m3-zeppelin-notebook
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10G
      storageClassName: standard
    status:
      phase: Pending
status:
  collisionCount: 0
  currentReplicas: 1
  currentRevision: m3-zeppelin-5779b84d99
  observedGeneration: 16
  readyReplicas: 1
  replicas: 1
  updateRevision: m3-zeppelin-5779b84d99
  updatedReplicas: 1

标签: portforwardingkubectlconnection-refusedsocat

解决方案


从 Kubernetes 的角度特别关注错误,它可能与以下内容有关:

  • 请求发送到的端口与接收端不匹配(例如向 : 上的实例NGINX发送请求)port1234
  • Pod不是在听一个想要的port

我已经成功地使用创建的 Kubernetes 集群重现了这个错误kubespray

假设您已运行以下步骤:

  • $ kubectl create deployment nginx --image=nginx
  • $ kubectl port-forward deployment/nginx 8080:80

一切都应该正确,NGINX运行时应该出现欢迎页面:$ curl localhost:8080.

如果我们对port-forward命令进行如下更改(注意1234端口):

  • $ kubectl port-forward deployment/nginx 8080:1234

您将收到以下错误:

Forwarding from 127.0.0.1:8080 -> 1234
Forwarding from [::1]:8080 -> 1234
Handling connection for 8080
E0303 22:37:30.698827  625081 portforward.go:400] an error occurred forwarding 8080 -> 1234: error forwarding port 1234 to pod e535674b2c8fbf66252692b083f89e40f22e48b7a29dbb98495d8a15326cd4c4, uid : exit status 1: 2021/03/23 11:44:38 socat[674028] E connect(5, AF=2 127.0.0.1:1234, 16): Connection refused

这也适用于Pod未绑定到端口和/或未侦听的应用程序。

旁注!

您可以通过运行一个Ubuntu Pod尝试卷曲其端口 80 的位置来模拟它。它将失败,因为没有任何东西在其端口上侦听。尝试exec进入它并运行$ apt update && apt install -y nginx并再次尝试卷曲(已kubectl port-forward配置)。它会起作用并且不会产生提到的错误(socat)。


解决问题的一部分:

我什至尝试在 YAML 文件中公开端口 7077。没有成功。

如果你的意思是你已经包含了- containerPort: 8080. 该字段纯粹是信息性的,不进行任何配置。你可以在这里读更多关于它的内容:

(除此之外,当您使用端口时,我认为这是不正确的7077:)


至于$ kubectl port-forward --address 0.0.0.0. 这是一种公开端口转发的方法,以便它可以侦听所有接口(在主机上)。它可以允许访问您的port-forwardfrom LAN

  • $ kubectl port-forward --help(部分):
  # Listen on port 8888 on localhost and selected IP, forwarding to 5000 in the pod
  kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000

其他资源:


推荐阅读