【发布时间】:2017-12-08 18:21:46
【问题描述】:
我有一个可以从特定端口接收命令的应用程序,如下所示:
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 连接到它,但是每当我通过端口发出命令时,它就会挂起。
通常我应该能够发出“帮助”命令并获取有关应用程序的信息。使用 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 设置为指挥官解决了上述错误。但是,我仍然无法向应用发送任何命令。
【问题讨论】:
-
如果你使用 NodePort,你将提供超过 30000 的更多,使用该端口你应该能够连接到 pod。这是我的
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana-grafana NodePort 10.104.97.35 <none> 80:30612/TCP 17d -
@sfgroups 所以你是说我需要将我的
port字段设置为大于 30000 的值?
标签: networking kubernetes port