![OpenShift高效运维:SRE视角的集群和分布式系统管理](https://wfqqreader-1252317822.image.myqcloud.com/cover/859/49070859/b_49070859.jpg)
3.1 部署代码
要想将在OpenShift集群上运行的所有服务都包含在同一个命名空间中,首先需要创建一个新项目:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/36_03.jpg?sign=1739292483-FpODbjkqq9LhfopOxkQ4HUjuzmFIABJY-0-f52ff5fffe20790af031a9bb2118f03c)
这个命令将自动切换到新创建的arcade项目。所有后续命令都自动针对这个项目,而不需要在每个命令中提到它。
OpenShift中的项目是带有附加注释的命名空间。在大多数情况下,项目和命名空间之间的区别与本书中的示例无关,因此这两个术语大多是可以互换的。
要切换到另一个项目,可以使用以下命令:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/36_04.jpg?sign=1739292483-RC0xlTK786OSqHtv0P29zJXjy2XK43nA-0-c0184710ae485db3d4678ba25c144d30)
要切换回arcade项目,运行以下命令:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/36_05.jpg?sign=1739292483-7nYLnnplEG12hiVQQ8nPkANWP1ZxLDLn-0-fca4d0db47ce69b18b628d2296ec45fe)
除了在后续命令之前执行oc project命令外,还可以通过在每个命令中选择某个命名空间来执行针对某个命名空间的所有命令。所有oc命令都支持-n标志(--namespace的简写),该标志可用于指定要在其中运行命令的命名空间。
在实践中,当你知道将对同一命名空间执行许多命令时,使用oc project切换到它可以节省一些输入时间,还可以避免对“默认”命名空间执行命令,也不必担心所有资源都去了哪里。
3.1.1 部署现有容器镜像
在新项目中启动容器的最快方法是使用oc run。由于你想要部署的应用程序的game服务已经内置到一个容器镜像中,你可以使用以下命令在集群上启动它:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/37_01.jpg?sign=1739292483-cnQvhwgSfKMnBBb0vaGeRe7o1jM6MeTB-0-1d0c703851c7115019f13f0404bc275e)
这将在集群上启动一个新的pod。使用以下命令在它启动时观察它。一旦它准备好了,你应该会看到状态“Running”:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/37_02.jpg?sign=1739292483-YRyh3s2pGy0vER52JRG6V1ONIBbnTqt9-0-c3d866c70912e7c3ba263709b8c2c736)
此时,你可能很想看看你刚刚部署的游戏。然而,oc run命令只是启动了一个没有公开端点的pod,所以你需要找到一种方法来访问游戏UI(在这个容器镜像中,它在端口8080上公开)。确认UI正在工作的一种快速而简单的方法是将端口从容器转发到本地机器。为此,执行如下命令:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/37_03.jpg?sign=1739292483-aKJUWDRdB5pQ7PweV3R0tzRyzrv1GQwy-0-1393803cee7d1ca0fcfd6cb8b56b923d)
虽然oc run是验证集群可以访问构建的容器镜像并按预期运行的一种快速简便的方法,但它并不是在集群上持续运行应用程序的首选方法,因为它没有提供围绕部署pod的一些抽象所提供的高级概念。部署应用程序的标准方法是部署资源。部署为普通pod提供了额外的特性。例如,它们可用于滚动升级或运行分布在节点上的多个实例。要用相同的容器镜像创建一个部署游戏,运行oc create deployment和oc get pods来观察即将出现的pod:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/37_04.jpg?sign=1739292483-qOxA41cijcclDnNKnHg1eKPZMvZeQRDO-0-f62769ce19a1b57ee96ceaf30eefb94c)
安全上下文约束
当你使用oc create deployment部署容器时,pod将使用不同的参数运行。区别之一是注释openshift.io/scc。比较以下两个命令的输出,调整为基于你的部署生成的pod:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/37_05.jpg?sign=1739292483-8wLUxGv37CDFfCzru6TF5t21x1Do3A2r-0-f05d03f3b040f112cf0c1b55c6ed9219)
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/38_01.jpg?sign=1739292483-ygASVWnZQnRCnZXlTZ2utOUpWQnZdIAK-0-1386759d76499149b68a7efb4fc3fc21)
restricted安全上下文约束(SCC)意味着此部署的pod将不能运行特权容器或挂载主机目录,并且容器必须使用允许范围内的唯一标识符(UID)。这意味着,对于运行Web服务器的应用程序(在本例中是NGINX),它们需要进行相应的配置。它们不能在端口80上运行,也不能指定UID,该UID将自动映射到项目配置范围内的高UID。
请参阅NGINX文档(https://oreil.ly/Z1Wp8),了解如何配置NGINX以在特定端口上服务。
扩展和公开部署
现在,你可以使用oc scale deployment来扩展游戏部署。你会立即看到更多的pod。
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/38_02.jpg?sign=1739292483-kIjHzsu2EK9UrSE7f7pDeJIomFDYIapb-0-16730ed7e3d233e411f164fa68544047)
要访问这些不同的实例,你需要创建一个服务资源,并告诉它从你的pod公开端口8080。使用如下命令创建服务:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/38_03.jpg?sign=1739292483-3zN0lHBIWfrcycJqvPwtDUFt042vI4lp-0-e611b175631d1b2845c0b5e8b38c1cfc)
从oc get endpoints的输出可以看到,OpenShift为服务注册了三个不同的端点,每个运行的实例对应一个端点。为了测试连接,你可以再次将端口8080转发到localhost,这次使用服务而不是pod:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/38_04.jpg?sign=1739292483-vhmw6zbbGkQm6auHbnl8FO8bjxUeZQ5C-0-e141e7dec22e7170ec26779ffe5cb7f4)
要获得部署的街机平台应用程序的第二个服务,请重复平台服务的上述步骤:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/39_01.jpg?sign=1739292483-eNS3SQLCDwTdt6ds7DAts9GYCdo8FZaD-0-91bedfa98dae9a224f0898b8b0fbda46)
再次使用端口转发来检查服务是否正在接受请求:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/39_02.jpg?sign=1739292483-tSH3cgJ0qbEVATmQfpEmiJo8zRmIVvvD-0-780224a36674c24d915365b569b036cf)
你可能已经意识到,端口转发并不是用户希望服务访问方式。在深入讨论向集群外部公开服务(3.2节)之前,下一小节将介绍部署应用程序的第三种方法。
3.1.2 从Git仓库部署应用程序
街机平台包含一项服务,可以收集每个用户在所有游戏中的分数。该服务是用Go语言编写的(https://golang.org),可以在Git仓库的highscore子文件夹中找到。要部署此服务,本例不使用来自容器注册中心的现有镜像,而是使用OpenShift的内置构建基础设施。
要从Git仓库部署应用程序,需运行以下命令:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/39_03.jpg?sign=1739292483-noGMMz834LTaGrigXoMtydADtePUBlMl-0-afc49ba1beeb598fc472e14e3ccb83b1)
❶包含该应用程序的Git仓库
❷要部署的仓库中的子文件夹
❸资源中使用的应用程序名称
❹为应用程序创建的资源
在阅读这个命令的输出时,你可以看到OpenShift在维护这个应用程序方面为你做了很多工作。第5章将详细介绍OpenShift的内置构建系统。
现在重要的是,OpenShift创建了一个构建pod,它检出了Git仓库,并使用highscore子文件夹中的Dockerfile构建了一个容器镜像。它在同一步骤中自动为该应用程序创建了一个服务。
完成构建需要一些时间。当运行oc get pods时,你会看到一个构建pod正在运行,在这个pod的状态变为“Completed”后,应用程序pod将出现:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/40_01.jpg?sign=1739292483-Lg2bjkjcSWgZ3BRNrSDFdm0qg3ebAu49-0-561b26544c659e542fab3997258c5f1b)
oc new-app创建的所有资源都没有归属资源。你可以根据日志了解命令在OpenShift集群上为你创建了哪些资源。
清理应用程序
以下部分仍然使用oc new-app命令创建的资源,将它们公开给集群外部。但是,你可能想知道如何卸载应用程序,因为没有资源拥有OpenShift自动创建的所有内容。你可以运行以下命令来清除与highscore应用程序相关的所有内容,因为OpenShift将app=highscore标签添加到它创建的所有内容中:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/40_03.jpg?sign=1739292483-3ybkjTkqnlpY8AdFLo6z2XNKnvn4j3gv-0-b3f1433de23dd62c582cf6cc2b46b192)
如果你想摆脱整个平台,你也可以删除该项目:
![](https://epubservercos.yuewen.com/EB4D27/28831576607915606/epubprivate/OEBPS/Images/40_04.jpg?sign=1739292483-YsePsIzmjgzYTdlaxTVMfM0zm8d8qERE-0-42a20cadacbfcfe564ff07cd5765856d)