portforwarding - 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
解决方案
从 Kubernetes 的角度特别关注错误,它可能与以下内容有关:
- 请求发送到的端口与接收端不匹配(例如向 : 上的实例
NGINX
发送请求)port
1234
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-forward
from 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
其他资源:
推荐阅读
- flutter - 在颤振中找不到材料本地化祖先的特定小部件
- excel - 组合范围内的变量
- html - 为什么 HTML 打印分页符不起作用?
- asp.net - ASP.NET Core 身份验证失败
- android-widget - 将支持日/夜模式的 Android 应用程序更新为 MaterialComponents 主题,但在为材质小部件充气时出现不正确的主题错误
- python - 如何用逗号分隔每列并为存储在列表中的列重复此操作?
- javascript - 如何使用 JavaScript 在点击时切换隐藏的 div?
- google-apps-script - 在文本跳转前放一个 =
- visual-studio-code - 在我输入 Visual Studio Code 时是否可以关闭错误检查?
- ping - 检查对 ping -t TTL 标志的理解