大多数软件技术都有一个“ 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,我会看到
现在我想将其连接到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
好。现在我看到了一项服务:
但是现在呢?
如何将其推送到云端? (例如gcloud)我需要先创建一个集群,还是已经创建了集群?
下一步是什么?
答案 0 :(得分:2)
您拥有的服务类型为clusterIP
,只能从kubernetes集群中访问。您需要使用NodePort
或LoadBalanacer
类型的服务,或者使用ingress
将应用程序暴露在远程kubernetes集群(具有kubernetes的公共或私有云环境中的一组VM或裸机服务器)之外部署在其上)或本地minikube / docker桌面。完成后,您应该可以使用浏览器或curl进行访问
答案 1 :(得分:2)
在Kubernetes的上下文中,Cluster
是PODS
和Services
运行的环境。可以将其视为在其中设置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可帮助您在一个地方管理这种复杂性。
我要谈的第三个概念是create
和apply
命令。您肯定可以在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文件并将您的应用程序部署在GKE,AKS,EKS中,仅引用其中最大的几个即可,云提供商可以使用某种类型的Kubernetes服务,您可以在其中启动集群并开始玩耍。
实际上,要玩耍,我建议Katakoda,因为它们有免费的场景,您可以使用群集玩耍。
哇...这是一个很长的答案...
最后,我建议使用Network Introduction in Katakoda,因为有不同类型的服务,具体取决于您的方案或所需的内容,并且本教程以动手实践的方式介绍了不同类型的服务