当前位置: 首页 > 知识库问答 >
问题:

如何通过节点访问 Openshift 服务

晏和风
2023-03-14

我正在尝试访问一个运行在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失败。如何访问集群IP服务。

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

我回答了其他问题:我如何通过ClusterIP 1访问Kubernetes服务。但是,这对Nodeport没有帮助。

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

这是我在pods中运行的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上监听外部接口吗?

如果我正确理解问题,我在这里的意图只是通过集群IP服务在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!

但是,如果我尝试使用我的网络应用程序或服务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个答案

赖明煦
2023-03-14

我正在回答我自己的问题。以下是根据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 通过集群 IP 成功通信。以下是服务详情(再增加一个豆荚)

$ 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!
 类似资料:
  • 我正在尝试使用三个虚拟机(Master–10.x.x.4、Node1–10.x.x.150、Node2–10.x.x.160)创建Kubernetes集群。 我能够通过此链接成功创建留言簿应用程序:http://kubernetes.io/v1.0/examples/guestbook/.我只对frontend-service.yaml做了一个更改:使用NodePort。我可以使用节点IP和端口号

  • 我想通过postman在openshift项目上创建kafka connect连接器。但是当通过邮递员发送Post命令时,出现如下错误。在openshift中将pod公开为服务(通过postman进行交互)时,我们需要运行什么特定的命令?请指教。 您看到此页面的可能原因: 主机不存在。确保正确键入了主机名,并且存在与此主机名匹配的路由。 主机存在,但没有匹配的路径。检查URL路径是否键入正确,以及

  • 我正在尝试使用入口公开部署,其中DeamonSet具有hostNetwork=true,这将允许我跳过额外的负载平衡器层,并直接在Kubernetes外部节点IP上公开我的服务。很遗憾,我无法从外部网络访问入口控制器。 我在GCP上运行库伯内特斯版本1.11.16-gke.2。 我将刷新群集设置为: 我运行部署: 然后我创建服务: 和入口资源: 我获取节点外部IP: 检查入口是否正在运行: 然后尝

  • 我是的新手,虽然我阅读了基本文档,并尝试部署一个简单的Spring BootAPI,但我可能缺少很多东西 我已经将API部署为.jar文件,然后安装并使用以下命令推送它: 然后使用docker命令启动API: 当我访问localhost:7777/hello时,我得到了所需的响应 这是我的 根据这个应答的命令,发布这个命令以获取 因此,我使用运行它,得到了这个错误 如果我设法获得,我是否能够访问它

  • 我希望我的UI通过我的节点服务器获取数据,其中每个都是一个独立的容器。如何使用docker-compose文件连接它们? 我有三个运行mongodb、node server和oracle jet for ui容器,我想通过oraclejet ui访问node API,通过node访问mongo db,所以我定义了这个Docker-Compose。mongo和node工作之间的链接。

  • 我们正在建立一个测试云OpenShift Origin,它是我们使用openShift anable playbook创建的。我们按照留档在:https://docs.openshift.com/container-platform/latest/install_config/install/advanced_install.html 我们没有做任何关于openShift注册表或路由器的特别事情。