【问题标题】:Send command over a mapped port via kubernetes service通过 kubernetes 服务通过映射端口发送命令
【发布时间】: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 &lt;none&gt; 80:30612/TCP 17d
  • @sfgroups 所以你是说我需要将我的port 字段设置为大于 30000 的值?

标签: networking kubernetes port


【解决方案1】:

感谢@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 字段的意义是什么!

【讨论】:

  • 在访问集群内部的服务(即访问服务的 pod)时,端口字段更有意义。在这种情况下,它必须使用端口 22282
  • @JavierSalmeron 哦,我明白了,这完全与端口的范围有关。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2011-05-10
  • 2013-02-25
  • 2015-12-22
  • 2020-06-24
  • 2022-12-12
  • 2014-06-05
相关资源
最近更新 更多