kubectl端口转发连接被拒绝[socat]

时间:2019-04-01 07:17:22

标签: portforwarding kubectl connection-refused 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")

我已经尝试在kubernetes上安装socat。我正在本地使用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

1 个答案:

答案 0 :(得分:1)

从 Kubernetes 的角度专门关注可能与之相关的错误:

  • 请求发送到的端口与接收端不匹配(例如向 NGINX 上的 port 实例发送请求:1234
  • Pod 未收听所需的 port

我已经通过使用 kubespray 创建的 Kubernetes 集群成功重现了此错误。

假设您已运行以下步骤:

  • $ 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-forward 访问您的 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

其他资源: