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

标签 spring-boot docker kubernetes

大多数软件技术都有“Hello World”类型的示例开始。对于Kubernetes,这似乎是缺乏的。
我的情况再简单不过了。我有一个由Spring-Boot制作的简单的hello world应用程序,带有一个Rest Controller ,该应用程序仅返回:“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)我是否需要首先创建集群,或者这已经是集群?
我下一步应该做什么?

最佳答案

关于您的问题,我们需要考虑几个概念。
首先是关于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,因为有不同类型的服务,具体取决于您的场景或所需的内容,并且本教程将以动手实践的方式介绍不同类型的服务。

关于spring-boot - 在Kubernetes中创建一个简单的Hello World应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63814357/

相关文章:

go - 使用 kubernetes/go-client 无法从集群配置中恢复数据

kubernetes - 无需启动 Kubernetes 的 Kubectl 文档

java - 如何过滤Eureka服务器中的Eureka客户端?

spring - 如何使用响应式(Reactive)单声道环绕一系列非阻塞操作?

docker - Dockerfile 中的条件 ENV

docker - 使用docker-compose启动容器时,如何以编程方式获取其ip?

kubernetes - 使用gltlab-runner Helm 安装的自定义卷

java - JPA - 带有 in 子句且不区分大小写的规范

java - Apache CXF (JAX-RS) 与 Spring Javaconfig 和 Jackson

Docker:容器运行在某个端口?