如何从节点

时间:2019-11-13 13:32:06

标签: kubernetes openshift

我正在尝试访问在另一个Openshift容器中运行的Flask服务器。

为此,我创建了以下服务。

$ oc get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
my-web-app   ClusterIP   172.30.216.112   <none>        8080/TCP   8m


$ oc describe svc my-web-app
Name:              my-web-app
Namespace:         neo4j-sys
Labels:            app=my-web-app
Annotations:       openshift.io/generated-by=OpenShiftNewApp
Selector:          app=my-web-app,deploymentconfig=my-web-app
Type:              ClusterIP
IP:                172.30.216.112
Port:              8080-tcp  8080/TCP
TargetPort:        8080/TCP
Endpoints:         172.20.203.104:5000,172.20.49.150:5000
Session Affinity:  None
Events:            <none>

1) 首先,我ping从一个吊舱到另一个吊舱进行编辑,并得到了答复。

(app-root) sh-4.2$ ping 172.20.203.104
PING 172.20.203.104 (172.20.203.104) 56(84) bytes of data.
64 bytes from 172.20.203.104: icmp_seq=1 ttl=64 time=5.53 ms
64 bytes from 172.20.203.104: icmp_seq=2 ttl=64 time=0.527 ms
64 bytes from 172.20.203.104: icmp_seq=3 ttl=64 time=3.10 ms
64 bytes from 172.20.203.104: icmp_seq=4 ttl=64 time=2.12 ms
64 bytes from 172.20.203.104: icmp_seq=5 ttl=64 time=0.784 ms
64 bytes from 172.20.203.104: icmp_seq=6 ttl=64 time=6.81 ms
64 bytes from 172.20.203.104: icmp_seq=7 ttl=64 time=18.2 ms
^C
--- 172.20.203.104 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6012ms
rtt min/avg/max/mdev = 0.527/5.303/18.235/5.704 ms

但是,当我尝试curl时,它没有响应。

(app-root) sh-4.2$ curl 172.20.203.104
curl: (7) Failed connect to 172.20.203.104:80; Connection refused

(app-root) sh-4.2$ curl 172.20.203.104:8080
curl: (7) Failed connect to 172.20.203.104:8080; Connection refused

2) 之后,我尝试从一个Pod到达群集IP。在这种情况下,两个ping, curl都无法访问。

(app-root) sh-4.2$ ping 172.30.216.112
PING 172.30.216.112 (172.30.216.112) 56(84) bytes of data.
From 172.20.49.1 icmp_seq=1 Destination Host Unreachable
From 172.20.49.1 icmp_seq=4 Destination Host Unreachable
From 172.20.49.1 icmp_seq=2 Destination Host Unreachable
From 172.20.49.1 icmp_seq=3 Destination Host Unreachable
^C
--- 172.30.216.112 ping statistics ---
7 packets transmitted, 0 received, +4 errors, 100% packet loss, time 6002ms
pipe 4
(app-root) sh-4.2$ curl 172.30.216.112
curl: (7) Failed connect to 172.30.216.112:80; No route to host

请让我知道我在哪里出问题了。为什么上述情况#1,#2失败。如何访问clusterIP服务。

我对服务和访问它们是完全陌生的,因此我可能缺少一些基础知识。

我经历了其他答案How can I access the Kubernetes service through ClusterIP 1。但是,Nodeport却无济于事。

基于Graham Dumpleton的以下评论进行的更新,以下是我的观察。

这是我正在容器中运行的Flask服务器日志,以获取信息。

* Serving Flask app "wsgi" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/  (Press CTRL+C to quit)
127.0.0.1 - - [14/Nov/2019 04:54:53] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [14/Nov/2019 04:55:05] "GET / HTTP/1.1" 200 -
  

您的Pod是否正在监听Pod 8080的外部接口?

如果我正确理解了问题,那么我的目的只是通过clusterIP服务在Pod之间进行通信。我不希望从外部接口(其他项目或通过Web URL作为负载均衡器服务)访问pod

  

如果您进入吊舱,可以卷曲$ HOSTNAME:8080吗?

是的,如果我以localhost127.0.0.1的身份运行,则可以从按预期方式运行的同一个Pod中获得响应。

(app-root) sh-4.2$ curl http://127.0.0.1:5000/  
Hello World!

(app-root) sh-4.2$ curl http://localhost:5000/  
Hello World!

但是,如果我尝试使用my-web-appservice IP(clusterIP)。我没有得到回应。

(app-root) sh-4.2$ curl http://172.30.216.112:5000/
curl: (7) Failed connect to 172.30.216.112:5000; No route to host

(app-root) sh-4.2$ curl my-web-app:8080
curl: (7) Failed connect to my-web-app:8080; Connection refused

(app-root) sh-4.2$ curl http://my-web-app:8080/
curl: (7) Failed connect to my-web-app:8080; Connection refused

使用pod IP时,我也没有得到响应。

(app-root) sh-4.2$ curl http://172.20.49.150:5000/
curl: (7) Failed connect to 172.20.49.150:5000; Connection refused

(app-root) sh-4.2$ curl 172.20.49.150
curl: (7) Failed connect to 172.20.49.150:80; Connection refused

1 个答案:

答案 0 :(得分:0)

我正在回答自己的问题。这是根据Graham Dumpleton的意见如何解决的。

最初,我曾经按如下方式连接Flask服务器。

from flask import Flask
application = Flask(__name__)

if __name__ == "__main__":
    application.run()

这默认情况下将服务器绑定到http://127.0.0.1:5000/

作为解决方案的一部分,我将绑定更改为0.0.0.0如下

from flask import Flask
application = Flask(__name__)

if __name__ == "__main__":
    application.run(host='0.0.0.0')

然后记录如下。

* Serving Flask app "wsgi" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/  (Press CTRL+C to quit)

之后,pod通过clusterIP成功通信。以下是服务详细信息(增加了一个豆荚)

$ oc describe svc my-web-app
Name:              my-web-app
Namespace:         neo4j-sys
Labels:            app=my-web-app
Annotations:       openshift.io/generated-by=OpenShiftNewApp
Selector:          app=my-web-app,deploymentconfig=my-web-app
Type:              ClusterIP
IP:                172.30.4.250
Port:              8080-tcp  8080/TCP
TargetPort:        5000/TCP
Endpoints:         172.20.106.184:5000,172.20.182.118:5000,172.20.83.40:5000
Session Affinity:  None
Events:            <none>

下面是成功的响应。

(app-root) sh-4.2$ curl http://172.30.4.250:8080  //with clusterIP which is my expectation
Hello World!

(app-root) sh-4.2$ curl http://172.20.106.184:5000 // with pod IP
Hello World!

(app-root) sh-4.2$ curl $HOSTNAME:5000    // with $HOSTNAME
Hello World!