在Kubernetes中创建一个简单的Hello World应用

时间:2020-09-09 14:58:13

标签: spring-boot docker kubernetes

大多数软件技术都有一个“ Hello World”类型的示例开始。对于Kubernetes,这似乎是缺乏的。

我的情况再简单不过了。我有一个用Spring-Boot制作的简单的hello world应用程序,它带有一个Rest控制器,它只返回:“ Hello Hello!”。

创建docker文件后,我将构建一个像这样的映像:

docker build -t helloworld:1.0 .

然后我在这样的容器中运行它:

docker run -p 8080:8080 helloworld:1.0

如果现在打开浏览器,则可以在这里访问我的应用程序:

http://localhost:8080/hello/

它返回:

"Hello Hello!"

太好了!到目前为止一切顺利。

接下来我标记它(我的docker-hub叫ollyw123,我的映像ID是776 ...)

docker tag 7769f3792278 ollyw123/helloworld:firsttry

并推动:

docker push ollyw123/helloworld

如果我登录Docker-Hub,我会看到

enter image description here

现在我想将其连接到Kubernetes。这就是我陷入混乱状态的地方。

我的想法是,我需要创建一个集群。我需要以某种方式将此群集连接到我的图像,据我了解,我只需要使用图像的URL即可连接(即 https://hub.docker.com/repository/docker/ollyw123/helloworld

下一步,我将必须创建一个服务。这样,该服务便可以公开我的“ Hello World!”通过某个端口休息。这是我的逻辑思维,对我来说,这似乎很简单,但是有关Kubernetes的教程和文档却是混乱和死胡同的矿场。

接着从spring-boot kubernetes教程(https://spring.io/guides/gs/spring-boot-kubernetes/)开始,我必须先创建一个部署对象,然后是一个服务对象,然后再“应用”它:

kubectl create deployment hello-world-dep --image=ollyw123/helloworld --dry-run -o=yaml > deployment.yaml

kubectl create service clusterip hello-world-dep --tcp=8080:8080 --dry-run -o=yaml >> deployment.yaml

kubectl apply -f deployment.yaml

好。现在我看到了一项服务:

enter image description here

但是现在呢?

如何将其推送到云端? (例如gcloud)我需要先创建一个集群,还是已经创建了集群?

下一步是什么?

3 个答案:

答案 0 :(得分:2)

您拥有的服务类型为clusterIP,只能从kubernetes集群中访问。您需要使用NodePortLoadBalanacer类型的服务,或者使用ingress将应用程序暴露在远程kubernetes集群(具有kubernetes的公共或私有云环境中的一组VM或裸机服务器)之外部署在其上)或本地minikube / docker桌面。完成后,您应该可以使用浏览器或curl进行访问

答案 1 :(得分:2)

在Kubernetes的上下文中,ClusterPODSServices运行的环境。可以将其视为在其中设置Web服务器等的VM环境。(尽管我不喜欢自己的类比)

如果您想在GCloud中运行相同的东西,那么您将在其中创建Kubernetes集群,而要做的就是应用包含YAML和{{1}的Service文件},通过Google Cloud提供的CLI与您的群集进行交互。

为了通过本地命令提示符与GCloud GKS群集进行交互,您需要获取该群集的凭据。 This GCloud官方文档说明了如何检索您的群集凭据。完成后,您可以使用命令提示符通过Deployment命令开始与GCloud中运行的Kubernetes实例进行交互。

答案 2 :(得分:2)

关于您的问题,我们需要考虑几个概念。

首先是关于Kubernetes中的“ Hello World”应用程序。即使是现有的(如Limido在评论[link]中提到的),该应用程序本身也不是Kubernetes应用程序,而是使用您选择的语言创建的应用程序,该应用程序已容器化并部署在Kubernetes中。

因此,在您的情况下,我将其称为Dockerized SpringBoot HelloWorld应用。

好吧,现在我们有了一个容器,我们可以简单地在docker上部署它,但是如果您的容器死了,或者您需要放大和缩小它,管理卷,网络流量以及许多其他事情,该怎么办?变得复杂(设想一个现实生活场景,同时运行数百甚至数千个容器)。这就是容器编排的确切位置。

Kubernetes可帮助您在一个地方管理这种复杂性。

我要谈的第三个概念是createapply命令。您肯定可以在here中找到更详细的说明,但是这两者都可以用于在Kubernetes中创建资源。

在您的情况下,create命令不会创建资源,因为您正在使用--dry-run并将输出添加到部署文件中,稍后您会apply,但是以下命令也会创建您的资源:

kubectl create deployment hello-world-dep --image=ollyw123/helloworld

kubectl create service clusterip hello-world-dep --tcp=8080:8080

请注意,即使这项工作有效,如果您需要共享此部署或将其提交到存储库中,也需要获取它:

kubectl get deployment hello-world-dep -o yaml > your-file.yaml

因此,定义文件确实很有帮助,建议使用。

太好了...走得更远...

在进行部署时,还将有许多预期正在运行的副本(即使您未定义它-默认值为1)。在您的情况下,您的部署将管理一个pod

如果您运行:

kubectl get pods -o wide

您将获得pod hello-world-dep-hash和IP地址。该IP是您容器的IP,您可以使用它来访问您的应用程序,但是由于Pod是短暂的,如果Pod死了,Kubernetes会自动为您创建一个新的IP地址,因此如果您有例如后端,并且其IP不断变化,那么每次有新的后端Pod时,您都需要在前端中管理此更改。

为解决这个问题,Kubernetes具有Service,它将以持久的方式公开部署。因此,如果您的Pod死了,并且又有一个新的Pod回来,那么您的服务地址将继续不变,并且所有流量都将自动路由到您的新Pod。

当您有多个部署副本时,该服务还会在所有可用的容器之间进行负载平衡。

最后但并非最不重要的,您的问题!

您问过,现在呢?

因此,基本上,一旦将应用程序容器化,就可以将其几乎部署到任何地方。您可以在N个不同的地方获得它。在您的情况下,您正在本地运行它,但是您可以获取您的deployment.yaml文件并将您的应用程序部署在GKEAKSEKS中,仅引用其中最大的几个即可,云提供商可以使用某种类型的Kubernetes服务,您可以在其中启动集群并开始玩耍。

实际上,要玩耍,我建议Katakoda,因为它们有免费的场景,您可以使用群集玩耍。

哇...这是一个很长的答案...

最后,我建议使用Network Introduction in Katakoda,因为有不同类型的服务,具体取决于您的方案或所需的内容,并且本教程以动手实践的方式介绍了不同类型的服务