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 部署的主要内容,如果未能解决你的问题,请参考以下文章

Kubectl基础命令大全

Kubernetes 端口转发 - 连接被拒绝

来自本地 kubernetes 集群的 Keycloak 端口转发

Kubectl 命令(命令式 与 声明式)与 K8S Ports 访问端口

错误:转发端口:错误升级连接:错误拨号后端:-Azure Kubernetes 服务

kubectl port-forward bind: address already in use unable