我有一个可以从特定端口接收命令的应用程序,如下所示:
echo <command> | nc <hostname> <port>
在这种情况下,它是打开端口22082,我相信它是Docker容器。
当我将此应用程序放入kubernetes pod时,我需要通过创建kubernetes服务来公开它。这是我的服务:
apiVersion: v1
kind: Service
metadata:
name: commander
spec:
selector:
app: commander
ports:
- protocol: TCP
port: 22282
targetPort: 22082
#type: NodePort
externalIPs:
- 10.10.30.19
注意:我注释掉了NodePort,因为我无法使用该方法公开端口。每当我使用sudo netstat -nlp | grep 22282
时,我什么也得不到。
使用外部IP我能够找到端口并使用netcat连接到它,但每当我通过端口发出命令时,它就会挂起。
通常我应该能够发出'help'命令并获取有关该应用的信息。使用kubernetes,我无法获得相同的输出。
现在,如果我在我的应用yaml(不是服务)中使用hostNetwork: true
,我可以连接到端口和获取我的'帮助'信息。
在不使用hostNetwork配置的情况下,什么可以阻止我的命令到达应用程序?
由于
更新:从sudo iptables --list
注意到此消息:
Chain KUBE-SERVICES (1 references)
target prot opt source destination
REJECT tcp -- anywhere 172.21.155.23 /* default/commander: has no endpoints */ tcp dpt:22282 reject-with icmp-port-unreachable
更新#2:我通过将spec.template.metadata.labels.app设置为commander解决了上述错误。但是,我仍然无法向应用程序发送任何命令。
答案 0 :(得分:0)
感谢@sfgroups,我发现我需要像这样设置一个实际的nodePort
:
apiVersion: v1
kind: Service
metadata:
name: commander
spec:
selector:
app: commander
ports:
- protocol: TCP
port: 22282
nodePort: 32282
targetPort: 22082
type: NodePort
非常奇怪的行为,让我想知道port
字段的重点是什么!