kubernetes (kubectl) 端口转发在 Mac 上无法用于 IBM MQ/Docker 部署
Posted
技术标签:
【中文标题】kubernetes (kubectl) 端口转发在 Mac 上无法用于 IBM MQ/Docker 部署【英文标题】:kubernetes (kubectl) port forwarding not working on mac for IBM MQ/Docker deployment 【发布时间】:2018-12-19 21:39:36 【问题描述】:我正在尝试使用托管在 docker hub 存储库上的映像将 IBM MQ 部署到我的本地 MAC 机器。我正在使用支持 Kubernetes 的 docker edge 版本。
我能够使用 kubernetes 成功部署映像,并且队列管理器在容器内运行良好。我还能够通过 ssh 进入容器并确保所有 MQ 进程都按预期运行。
但是,当我使用以下 kubectl 命令使用端口转发时,它会打开端口,但不允许我使用“IP 或主机名”(即使从本地机器)远程登录到它。但是当我使用“localhost”远程登录时,它工作正常。
在进行故障排除时,我使用 docker 命令而不是 kubernetes 部署了相同的映像,并且通过 docker 部署,端口转发按预期工作。它让我可以使用 IP、主机名和 localhost 远程登录。
所以,Kubernetes 端口转发肯定存在一些问题。如果我在这里遗漏任何东西,有人可以告诉我吗?如果我需要一些额外的信息,请告诉我。
我是 kubernetes 和 docker 的新手,但对 IBM MQ 非常熟悉。
正在使用的命令:
使用 kubectl 创建端口转发规则,检查 netstat 并使用 telnet 连接:
HOSTNAME:Test2 an0s5v4$ sudo kubectl port-forward private-reg 1414:1414 &
[1] 3001
HOSTNAME:Test2 an0s5v4$ Forwarding from 127.0.0.1:1414 -> 1414
Forwarding from [::1]:1414 -> 1414
HOSTNAME:Test2 an0s5v4$ netstat -an |grep 1414
tcp6 0 0 ::1.1414 *.* LISTEN
tcp4 0 0 127.0.0.1.1414 *.* LISTEN
HOSTNAME:Test2 an0s5v4$ ps -ef|grep 1414
0 3001 920 0 10:27AM ttys006 0:00.03 sudo kubectl port-forward private-reg 1414:1414
0 3002 3001 0 10:27AM ttys006 0:00.18 kubectl port-forward private-reg 1414:1414
502 3007 920 0 10:28AM ttys006 0:00.00 grep 1414
HOSTNAME:Test2 an0s5v4$ telnet IP 1414
Trying IP...
telnet: Unable to connect to remote host: Connection refused
HOSTNAME:Test2 an0s5v4$ telnet localhost 1414
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Handling connection for 1414
L-RCC9048942:Test2 an0s5v4$ telnet HOSTNAME 1414
Trying IP ...
telnet: Unable to connect to remote host: Connection refused
HOSTNAME:Test2 an0s5v4$ nslookup HOSTNAME
;; Truncated, retrying in TCP mode.
Name: HOSTNAME
Address: IP
Kubernetes pod YAML 文件内容
apiVersion: v1
kind: Pod
metadata:
name: private-reg
labels:
app: ibmmq
spec:
containers:
-
env:
-
name: LICENSE
value: accept
-
name: MQ_QMGR_NAME
value: QM4
image: "image path in docker hub"
name: private-reg-container
ports:
-
containerPort: 1414
hostPort: 1414
编辑:在帖子中添加 K8S 服务
Kubernetes 服务 YAML 文件内容
apiVersion: v1
kind: Service
metadata:
name: myservice-nodeport
labels:
app: ibmmq
spec:
ports:
- port: 3000
targetPort: 1414
nodePort: 31414
selector:
app: ibmmq
type: NodePort
【问题讨论】:
Anurag 我对 kubectl 了解不多,但是在查看一些文档时,您可能想尝试一下sudo kubectl port-forward my-pod 1414:1414
@JoshMc - 感谢您的调查。是的,我也尝试过 sudo 。但到目前为止还没有运气:)
Anurag 我把private-reg
改成了字面值my-pod
,你试过了吗?
@JoshMN - 我也试过了。结果相同....
以下博文指出您需要“确保已安装 nsenter 和 socat”。 prefetch.net/blog/2018/02/03/…
【参考方案1】:
正如earlier comment 中所述,尽管--address 0.0.0.0
明确要求,Docker 仍会将转发端口绑定到 127.0.0.1。
这个问题可以通过socat
解决。给定以下设置:
WebServer
在 kubernetes 集群的 8080 端口上运行
Docker 镜像,kubectl port-forward
在其中运行,并在端口 9876 处将其暴露给外部
Web 浏览器访问 WebServer
localhost:9876
的 HostOS
隧道连接的代码由以下部分组成:
Dockerfile
RUN yum -y install socat
Docker 运行命令
docker run --publish 9876:9876 ...
端口转发和暴露
kubectl --namespace YOUR_NAMESPACE port-forward pod/YOUR_POD_NAME --address 0.0.0.0 9877:8000 & socat TCP-LISTEN:9876,fork TCP:localhost:9877
这里,9877
端口用作“跳转端口”以绕过 Docker 限制。
【讨论】:
【参考方案2】:如果你需要端口转发来绑定所有的网络接口,你可以给这个选项。这在使用 OpenShift 等具有不同本地和浮动 IP 的服务器时非常有用
--地址0.0.0.0
例子
kubectl port-forward minio-64b7c649f9-9xf5x --address 0.0.0.0 7000:9000 --namespace minio
【讨论】:
【参考方案3】:这是 kubectl port-forward 命令的一个已知问题。它只连接到本地主机接口。请参阅此 PR:https://github.com/kubernetes/kubernetes/pull/46517。我仍然在寻找同样的问题。我看到了两种解决方法:
-
socat 选项:(需要使用
brew install socat
安装)https://github.com/kubernetes/kubernetes/issues/43962#issuecomment-418305960,我不太喜欢,因为我需要另一个端口来监听而不是转发
pf 解决方案:https://superuser.com/questions/473039/pfctl-port-forwarding-in-mac-osx#521803,我仍然无法正常工作。
我在/etc/pf.conf
文件中添加了如下规则:
rdr pass on en0 inet proto tcp from any to any port 10001 -> 127.0.0.1 port 10001
,其中en0
是我的wifi接口:
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 6c:96:cf:dd:98:e9
inet6 fe80::b0:4b17:388d:8a1b%en0 prefixlen 64 secured scopeid 0x6
inet 192.168.12.82 netmask 0xfffffc00 broadcast 192.168.15.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
我有一个带有kubectl端口转发的终端:kubectl port-forward mypod 10001:10001
,但*:10001
端口上没有监听器(您可以使用命令检查:sudo lsof -PiTCP -sTCP:LISTEN
)
如果我修复它,我会编辑这个答案。
【讨论】:
以上是关于kubernetes (kubectl) 端口转发在 Mac 上无法用于 IBM MQ/Docker 部署的主要内容,如果未能解决你的问题,请参考以下文章
来自本地 kubernetes 集群的 Keycloak 端口转发
Kubectl 命令(命令式 与 声明式)与 K8S Ports 访问端口