我们通常以这样的论点开始,即Kubernetes只是Kubernetes,而OpenShift已经是Kubernetes平台,例如Microsoft AKS或Amazon EKS。这些平台中的每一个都有自己的优势,专注于一个或另一个目标受众。在那之后,对话已经变成了特定平台优缺点的比较。
总的来说,我们认为写这篇文章的结论是``听着,在OpenShift或AKS,EKS,某些自定义Kubernetes或任何Kubernetes上运行代码都无关紧要(为简便起见,我们称之为KUK)在任何地方都非常简单。”
然后,我们计划采用最简单的“ Hello World”,并以其示例为例,展示KUK和Red Hat OpenShift容器平台(以下简称OCP或简称OpenShift)之间的共同点和区别。
但是,在撰写本文的过程中,我们意识到我们已经习惯了使用OpenShift这么长时间了,以至于我们根本没有意识到它是如何成长并变成一个令人惊叹的平台的,而不仅仅是一个Kubernetes发行版。我们习惯于将OpenShift的成熟性和简单性视为理所当然,而忽略了它的辉煌。
通常,积极悔改的时机已经到来,现在我们将逐步比较在KUK和OpenShift上运行“ Hello World”的情况,我们将尽可能客观地做到这一点(嗯,也许有时表现出对这个主题的个人态度)。如果您对这个问题有纯粹的主观意见感兴趣,则可以在此处阅读(EN)。在本文中,我们将仅坚持事实和事实。
集群
因此,我们的“ Hello World”需要集群。让我们立即对任何公共云说“不”,以免为服务器,注册表,网络,数据传输等支付费用。因此,我们在Minikube(用于KUK)和代码就绪容器(用于OpenShift集群)上选择一个简单的单节点集群。这两个选项确实很容易安装,但是在笔记本电脑上将需要大量资源。
在KUK-e上组装
所以走吧
第1步-建立我们的容器映像
首先,将我们的“ Hello World”部署到minikube。这将需要:
- 1.安装了Docker。
- 2.安装了Git。
- 3.安装了Maven(实际上,该项目使用mvnw二进制文件,因此可以不使用它)。
- 4.实际上,源本身,即 仓库github.com/gcolman/quarkus-hello-world.git的克隆
第一步是创建一个Quarkus项目。如果您从未使用过Quarkus.io,请不要惊慌-这很容易。您只需选择要在项目中使用的组件(RestEasy,Hibernate,Amazon SQS,Camel等),然后Quarkus自身(无需您的任何参与)即可配置maven原型并将所有内容上传到github。也就是说,只需单击一下鼠标-您就完成了。这就是为什么我们喜欢Quarkus。
将我们的“ Hello World”构建到容器映像中的最简单方法是使用quarkus-maven Docker扩展,它将完成所有工作。随着Quarkus的出现,这变得非常容易和简单:添加container-image-docker扩展,您可以使用maven命令创建映像。
./mvnw quarkus:add-extension -Dextensions=”container-image-docker”
最后,我们使用Maven构建图像。结果,我们的源代码变成了现成的容器映像,可以在容器运行时中启动它。
./mvnw -X clean package -Dquarkus.container-image.build=true
实际上,仅此而已,现在您可以使用docker run命令启动容器,将我们的服务映射到端口8080,以便您可以访问它。
docker run -i — rm -p 8080:8080 gcolman/quarkus-hello-world
容器实例启动后,仅需使用curl命令检查我们的服务正在运行:
因此,一切正常,并且非常容易和简单。
第2步-将我们的容器推送到容器映像存储库
到目前为止,我们创建的图像已存储在本地容器中。如果我们要在我们的KUK环境中使用此映像,则必须将其放入其他存储库中。Kubernetes没有此类功能,因此我们将使用dockerhub。因为,首先,它是免费的,其次,(几乎)每个人都这样做。
这也非常简单,您只需要一个dockerhub帐户。
因此,我们安装了dockerhub并将映像发送到那里。
第三步-启动Kubernetes
有多种方法可以构建kubernetes配置来运行“ Hello World”,但我们将使用其中最简单的一种,我们是那种人。
首先,启动minikube集群:
minikube start
第4步-部署我们的容器映像
现在我们需要在kubernetes配置中转换我们的代码和容器映像。换句话说,我们需要一个pod和部署定义,并在dockerhub上指示我们的容器映像。最简单的方法之一是运行指向我们的映像的create deploy命令:
kubectl create deployment hello-quarkus — image =gcolman/quarkus-hello-world:1.0.0-SNAPSHOT
使用此命令,我们告诉KUK创建一个部署配置,其中应包含我们的容器映像的pod规范。此命令还将此配置应用于我们的minikube集群,并创建一个部署,该部署将下载我们的容器映像并启动集群上的pod。
第5步-开放访问我们的服务
现在我们已经部署了容器映像,是时候考虑如何配置对该Restful服务的外部访问了,该服务实际上是在我们的代码中编程的。
有很多方法。例如,您可以使用Exposure命令自动创建适当的Kubernetes组件,例如服务和端点。实际上,这正是我们通过对部署对象执行Exposure命令来执行的操作:
kubectl expose deployment hello-quarkus — type=NodePort — port=8080
让我们暂时讨论一下暴露命令的“-类型”选项。
当我们公开并创建运行我们的服务所需的组件时,除其他外,我们希望能够从外部连接到位于SDN内的hello-quarkus服务。type参数允许我们创建并连接负载平衡器之类的东西,以将流量路由到该网络。
例如,通过输入type = LoadBalancer,我们将自动在公共云中初始化负载均衡器以连接到我们的Kubernetes集群。当然,这很棒,但是您需要了解,这样的配置将严格地绑定到特定的公共云,并且在不同环境中的Kubernetes实例之间传输它会更加困难。
在我们的示例中,键入= NodePort,即对我们服务的调用通过节点的IP地址和端口号进行。此选项允许您不使用任何公共云,但需要执行许多其他步骤。首先,您需要自己的负载平衡器,因此我们将在集群中部署NGINX负载平衡器。
第6步-安装负载均衡器
Minikube具有许多平台功能,可轻松创建外部访问所需的组件,例如入口控制器。Minikube与Nginx入口控制器捆绑在一起,我们只需要启用它并进行配置即可。
minikube addons enable ingress
现在,仅需一个命令,我们将创建一个Nginx入口控制器,该控制器将在我们的minikube集群中运行:
ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m
第7步-配置入口
现在,我们需要配置Nginx入口控制器以接受hello-quarkus请求。
最后,我们需要应用此配置。
kubectl apply -f ingress.yml
由于我们是在计算机上完成所有这些操作的,因此我们只需将节点的IP地址添加到/ etc / hosts文件中,即可将到minikube的http请求路由到NGINX负载均衡器。
192.168.99.100 hello-quarkus.info
就是这样,现在我们的minikube服务可以通过Nginx入口控制器从外部访问。
好吧,那很容易,对吧?还是不是?
在OpenShift上启动(代码就绪容器)
现在,让我们看看如何在Red Hat OpenShift容器平台(OCP)上完成所有操作。
与minikube一样,我们选择具有代码就绪容器(CRC)形式的单节点OpenShift集群的架构。它以前被称为minishift,基于OpenShift Origin项目,但现在它是CRC,并基于Red Hat的OpenShift容器平台构建。
很抱歉,我们在这里不得不说:“ OpenShift很棒!”
最初,我们认为写OpenShift上的开发与Kubernetes上的开发没有什么不同。实际上是这样。但是在撰写这篇文章的过程中,我们记住了当您没有OpenShift时必须执行多少不必要的动作,因此,这仍然很棒。当一切都变得轻松时,我们喜欢它,并且与minikube相比,它很容易,我们的示例在OpenShift上部署和运行,实际上促使我们撰写了这篇文章。
让我们完成该过程,看看我们需要做什么。
因此,在minikube示例中,我们从Docker开始...停止,我们不再需要在计算机上安装Docker。
而且我们不需要本地git。
而且不需要Maven。
而且您不必用手创建容器图像。
而且,无需搜索任何容器映像存储库。
而且您不需要安装入口控制器。
而且您也不需要配置入口。
你明白了吧?您不需要上述任何内容即可在OpenShift上部署和运行我们的应用程序。这个过程本身看起来像这样。
第1步-启动OpenShift集群
我们使用Red Hat的代码就绪容器,该容器本质上是相同的Minikube,但仅具有完整的单节点Openshift集群。
crc start
第2步-构建应用程序并将其部署到OpenShift集群
正是在这一步中,OpenShift的简单性和便利性体现在其所有荣耀中。与所有Kubernetes发行版一样,我们有多种在集群上运行应用程序的方法。而且,就像KUK一样,我们特意选择了最简单的一种。
OpenShift始终被构建为用于构建和运行容器化应用程序的平台。构建容器一直是该平台不可或缺的一部分,因此,还有大量用于相关任务的Kubernetes资源。
我们将使用OpenShift Source 2 Image(S2I)流程,该流程有几种不同的方式来获取源代码(代码或二进制文件)并将其转换为在OpenShift集群上运行的容器映像。
为此,我们需要两件事:
- 我们在git仓库中的源代码
- 构建器映像,将基于该映像执行构建。
其中有许多映像,都是由Red Hat和社区维护的,由于我正在构建Java应用程序,因此我们将使用OpenJDK映像。
您可以从OpenShift Developer图形控制台和命令行开始S2I构建。我们将使用new-app命令来告诉它在哪里获取构建器图像和我们的源代码。
oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git
就是这样,我们的应用程序已创建。为此,S2I流程执行以下操作:
- 为与构建应用程序有关的各种事物创建了一个服务构建容器。
- 创建了OpenShift Build配置。
- 将构建器映像下载到OpenShift的内部Docker注册表中。
- 将“ Hello World”克隆到本地存储库。
- 看到那里有一个maven pom,所以我使用maven编译了该应用程序。
- 创建了一个包含已编译的Java应用程序的新容器映像,并将该映像放入内部容器注册表中。
- 使用Pod规范,服务等创建Kubernetes部署
- 已启动容器映像的部署。
- 删除了服务构建舱。
此列表中有很多内容,但主要的是,所有构建都完全在OpenShift内部进行,内部Docker注册表位于OpenShift内部,并且构建过程将创建所有Kubernetes组件并在集群中运行它们。
如果您在控制台中直观地跟踪S2I的启动,则可以看到在构建过程中如何启动构建容器。
现在,让我们看一下构建器pod的日志:首先,它显示了maven如何完成其工作并下载依赖项以构建我们的Java应用程序。
Maven构建完成后,将开始容器映像构建,然后将此生成的映像推送到内部存储库。
就是这样,组装过程完成了。现在,确保我们的应用程序的Pod和服务正在集群中运行。
oc get service
就这样。只有一个团队。我们只需要公开此服务以进行外部访问。
第3步-公开服务以供外部访问
与KUK一样,在OpenShift平台上,我们的``Hello World''还需要一个路由器将外部流量定向到集群中的服务。 OpenShift使这非常容易。首先,默认情况下,HAProxy路由组件安装在集群中(可以更改为同一NGINX)。其次,有一些称为Routes的特殊且高度可配置的资源,类似于老式的Kubernetes中的Ingress对象(实际上,OpenShift的Routes强烈影响了Ingress对象的设计,现在可以在OpenShift中使用它) ,但对于我们的“ Hello World”,以及在几乎所有其他情况下,无需额外配置的标准Route就足够了。
要为“ Hello World”创建可路由的FQDN(是的,OpenShiift具有自己的DNS,用于按服务名称进行路由),我们只需公开我们的服务即可:
oc expose service quarkus-hello-world
如果查看新创建的路由,则可以在其中找到FQDN和其他路由信息:
oc get route
最后,我们从浏览器访问我们的服务:
现在真的很简单!
我们喜欢Kubernetes和技术允许我们做的所有事情,我们也喜欢简单和轻巧。 Kubernetes的构建是为了使分布式可伸缩容器的操作变得异常简单,但其简单性已不足以推出应用程序。这就是OpenShift发挥作用的地方,它与时俱进并提供了Kubernetes,其主要关注开发人员。已投入大量精力来专门为开发人员量身定制OpenShift平台,包括创建工具,例如S2I,ODI,开发人员门户,OpenShift Operator Framework,IDE集成,开发人员目录,Helm集成,监视等。
我们希望本文对您有所帮助。要找到其他资源,材料和其他有用的东西以在OpenShift平台上进行开发,请访问Red Hat Developers门户。