我正在尝试使用docker hub存储库上托管的映像将IBM MQ部署到我的本地MAC机器上。我正在使用具有Kubernetes支持的docker edge版本。
我能够使用kubernetes成功部署映像,并使队列管理器在容器内运行良好。我也可以ssh到容器中并确保所有MQ进程按预期运行。
但是当我使用以下kubectl命令使用端口转发时,它会打开端口,但不允许我使用“IP或主机名”(即使是从本地计算机)telnet到它。但是当我使用“localhost”来telnet它工作正常。
在进行故障排除时,我使用docker命令而不是kubernetes部署了相同的映像,并且使用docker部署,端口转发按预期工作。它允许我使用IP,主机名和localhost进行telnet。
所以,肯定是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
这是kubectl port-forward命令的已知问题。它只连接到localhost接口。看到这个PR:https://github.com/kubernetes/kubernetes/pull/46517。我仍然在研究同样的问题。我看到两个解决方法:
brew install socat
)https://github.com/kubernetes/kubernetes/issues/43962#issuecomment-418305960,我不喜欢,因为我需要另一个端口来听取而不是转发我添加到/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
)
如果我修复它,我会编辑这个答案。