![OpenShift高效运维:SRE视角的集群和分布式系统管理](https://wfqqreader-1252317822.image.myqcloud.com/cover/859/49070859/b_49070859.jpg)
3.2 访问已部署的服务
在部署了3.1节所描述的街机平台应用程序的所有三个服务之后,你现在应该有三个服务在arcade命名空间中运行:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/41_01.jpg?sign=1739522754-vg2adiS1irgt0egtY5jDQv8GYhnIdZNq-0-b8e5040a4285d80ecc49a390ce1fe1d9)
所有三个服务都公开pod的端口8080。对于game和platform,你可以使用你的服务知识来公开正确的端口。在highscore服务的情况下,OpenShift从它构建的容器中检测到公开的端口。
3.2.1 从其他pod访问服务
这三个服务的类型都是ClusterIP,它允许集群的其他组件访问它。对于仅由在集群内相互通信的组件使用的服务,这很有帮助。为了测试这一点,你可以部署一个pod来与该服务交互:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/41_02.jpg?sign=1739522754-L14iyadMUrlOPPaNnHxnnkyNrGTjx6E1-0-22d5455102666545b696eeacbcd4145b)
该命令将在集群中创建一个pod,你可以通过该pod使用curl命令查询其中一个服务。服务的主机名是你给服务的名称,所以在这种情况下,你可以查询http://platform:8080以访问平台We b服务:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/41_03.jpg?sign=1739522754-wRec6BBea5mfsFXaTh7dVapTAdtqaeNb-0-09df9852d91c0a68a6415d6cba5055c9)
前面的oc run命令在命名空间arcade中创建了一个pod,其中也部署了arcade平台的所有服务。这就是为什么你可以通过将服务名称指定为主机名来访问该服务。如果你在另一个命名空间中创建curl pod,例如default命名空间,则不可能这样做,如下面的代码片段所示:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/41_04.jpg?sign=1739522754-95p54CTiehtEmwx1EtTyNn7OZ3hl6OV1-0-2db7ff0ae564f0cf5022c95ef5f74e44)
如你所见,default命名空间中的curl pod无法解析主机名platform。但是,我们仍然可以通过指定服务的完整内部域名来查询不同命名空间中的服务:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/41_05.jpg?sign=1739522754-cMgYCNNdCtRkJHzsd4nQ89rMFk9PWyTR-0-a1affd83ede33dc9ef6de350ade361ee)
OpenShift服务的内部DNS名称设置为<service-name>.<name-space>.svc.cluster.local。
根据你正在使用的集群的网络配置,跨特定命名空间的通信可能会被阻止。NetworkPolicy可用于允许或阻止特定命名空间的服务之间的通信。
3.2.2 请求的分配
在3.1节中,你将game部署扩展到三个运行的pod。如果你现在还没有这样做,或者缩小它,那么使用下面的命令来扩大它:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/42_02.jpg?sign=1739522754-kunhZllV65rYkWWZl2JFhfnzAVHcY5b3-0-8268348c60519d567ac63b5906833815)
OpenShift将在服务的所有端点上分发请求。为了使其可见,game部署将头文件instance-ip写入响应,你可以从curl pod中查询。使用以下命令列出game服务的所有端点:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/42_03.jpg?sign=1739522754-zKpFeZYqFH2dqRcxOgaMe4VDpA8crhSU-0-752d5f5b4f391d2712c9261824aefc3d)
下面的命令使用curl命令运行一个无限循环,向game服务发送HTTP请求:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/42_04.jpg?sign=1739522754-HtD1jmdVKDBB3jxDu8bbMWmdnTQVz0ZP-0-5bba2caa786cdddd0077e5fa7752f149)
-i标志告诉curl打印响应头。curl命令的每个输出都使用grep进行过滤,以便只输出响应头instance-ip。这将产生一个列表,显示请求的分布。
在命令的输出中可以看到,请求随机分布到所有三个部署的pod中。
按Ctrl+C退出循环。
instance-ip头是出于本章的目的而添加的自定义头。如果你想在自己的应用程序中复制这一点,那么可以在NGINX配置中添加以下行:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/42_06.jpg?sign=1739522754-Cvuy9Lfmpo7IyC96qYsHS1SfAAejhkQM-0-4db7626ceb1be8c87e80afe05d4f1e4c)
但是,我们不建议在生产部署中使用这种方法,而只是为了可视化哪个端点接收到请求。