FromaJavaApplicationtoaKubernetes部署方式
在本教程中,我们将从JavaWeb应用程序,创建一个Docker镜像将应用程序放在内部,然后将映像部署在本地Kubernetes集群。 本指南介绍了从编译Web应用程序到在Kubernetes上运行Web应用程序的所有必要步骤。 虽然有出色的开源工具可以执行所有这些步骤,但我们将在手动命令行.
Kubernetes is a system for deploying containerized 应用程式lications on a cluster. 它允许将创建Web应用程序与在服务器上运行Web应用程序的关注分开. The entities that run on Kubernetes clusters are typically containerized 应用程式lications such as Docker images.
For this tutorial, you will use the docker
and Kubectl
(Kubernetes) command line tools. Both these tools can be installed through Docker desktop tools. 作为本教程的一部分,您将安装Docker工具,这样您就可以在计算机上发出与本教程中所述相同的命令. 在本教程的最后,您将在自己的Kubernetes集群上部署一个Web应用程序. 😊
Running the Web Application on your O小号
我们将使用的网络应用程序是Java 小号pring Boot网络应用程序. For simplicity, we’ll use a simple existing application from the official Spring Boot Tutorials. 此Web应用程序是一种REST服务,它公开了一个HTTP GET端点.
As a prerequisite for this section, you need Git, JDK (Java 8要么newer) and Maven. First, start by downloading the Java Project, then compile it using Maven:
$git clone https://github.com/spring-guides/gs-rest-service.git$光盘gs-rest-service\C完成$mvn清洁包装$cp目标 / rest-service-0.0.1-SNAPSHOT.jar ../ ..$光盘../ ..
第三个命令编译Java应用程序并将Web应用程序打包在JAR文件中。 您会在target
夹。
接下来,您可以使用java
命令:
$爪哇-罐rest-service-0.0.1-SNAPSHOT.jar
您会在终端上看到许多行经过,告诉您Spring-Application上下文已初始化,并且您的应用程序暴露在端口8080上:
。 ____ _ __ _ _
/ \\ / ___'_ __ _ _(_)_ __ __ _ _ \ \ \ \
(()\ ___ |'_ |'_ | |'_ \ / _` | \ \ \ \ \
\\ / ___)| | _)| | | | | || (_ | |))))
'| ____ | .__ | _ | | _ | _ | | _ \ __,| / / / /
======== | _ | ============= | ___ / = / _ / _ / _ /
:: Spring Boot ::(v2.2.2.RELEASE)
2020-03-26 20:56:13.857信息18504 --- [main] c.e.restservice.Rest服务Application:使用PID 18504在Philipp-PC上启动Rest服务Application v0.0.1-SNAPSHOT [...]
[...]
2020-03-26 20:56:17.477信息18504 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcat在端口8080(http)上启动,具有上下文路径''
2020-03-26 20:56:17.481信息18504 --- [main] c.e.restservice.RestServiceApplication:在4.834秒内启动RestServiceApplication(JVM运行5.736)
您可以通过使用GET方法调用REST服务来验证Web应用程序是否正常运行. 在您喜欢的Web浏览器中,导航到URL: http://本地主机:8080 /问候. 您可以看到以下消息:
{“ID”:1,“内容”:“你好,世界!”}
Introduction to Docker images
确保已安装Docker桌面工具. You can find all installation instructions here.
Docker属于PaaS(平台即服务)类别,并且它是开源的。 简而言之,Docker在容器中运行应用程序(例如我们的Web应用程序)。 容器与外界隔离并且包含一个操作系统,application要运行及其所有依存关系。 Docker工作流程如下所示:
- 从基础映像开始,该基础映像包含操作系统和最常用的依赖项,例如JDK或Python。
- 将您自己的应用程序添加到基本映像。 另外,添加所有不属于基本映像的依赖项。
- 输出是一个自定义图像,其中包含我们的应用程序。
- 在图像中运行应用程序。
Build and run a Docker application
Docker映像是分层的:每个映像都通过添加更多实体在另一个映像上构建。 为了使图像创建过程更加透明,我们使用了Docker文件。 该Docker文件包含有关如何创建Docker映像的所有信息。 创建一个名为Docker文件
具有以下内容:
FROM openjdk:8-jre-alpine
COPY rest-service-0.0.1-SNAPSHOT.jar /我的应用.jar
CMD 爪哇-罐 /我的应用.jar
在第一行中,我们指定基础映像,其中包含Java 8运行时环境。 在下一行,我们将Web应用程序复制到图像中。 在最后一行,我们描述了当镜像作为Docker容器运行时会发生什么:我们的Web应用程序已执行。
现在,我们使用Docker文件创建自己的映像:
$码头工人-t我的应用:0.0.1.
我们可以使用以下命令列出所有已知的Docker映像:
$码头工人图像
储藏标签图像ID尺寸增加
我的应用 0.0.1 32b488088806 25分钟前103MB
openjdk 8-jre-alpine f7a292bbb70c 10分钟前84.9MB
上面的命令应显示我们的自定义图片,名为我的应用
。 现在,我们准备运行我们的Docker映像。 请注意,我们目前不使用Kubernetes,而是通过docker
直接命令:
$docker运行-p8080:8080-d我的应用:0.0.1
c5a91de6d0d6ffe692434548ff2ce6fdcc2c89fa02f7bc621c0c132ddfe2589a
Congrats, you just started a web service in a Docker container 😊 Check that the web app runs as expected by navigating to the URL http://localhost:8080/greeting. Docker提供了多种命令来创建,运行和监视Docker映像. 要列出正在运行的Docker映像,只需键入:
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5a91de6d0d6 我的应用:0.0.1 “ / bin / sh -c'java -j ...” 2 minutes ago Up 21 seconds 0.0.0.0:8080->8080/tcp funny_dhawan
最后,您可以通过键入以下命令停止正在运行的容器码头工人停止
.
For a more thorough documentation on Docker files, please refer to the official documentation here.
Introduction to Kubernetes
Kubernetes is a system for deploying, monitoring and scaling your applications in the cloud. 它最初由Google开发,是开源的. Kubernetes takes care of running your containerized application.
在Kubernetes中,映像的单个运行实例称为荚,并且使用RESTful网络服务,通常您可以并行运行同一应用程序的多个Pod。 Kubernetes使您可以轻松地将计算资源分配给您的Pod,在工作负载繁重时启动更多Pod或检测不健康的Pod。
您安装的Docker桌面工具包含一个本地Kubernetes服务器。 您可以像在云中一样在本地Kubernetes上部署工作负载,但是请注意,这仅用于测试目的。 在现实生活中,您将使用Kubernetes将应用程序部署到真实的云基础架构(例如Amazon Cloud或Google Cloud)。
Run your application on Kubernetes cluster
在本节中,您将使用Kubernetes部署Docker映像。 更具体地说,您将使用kubectl
命令行工具以及Kubernetes文件来运行您的应用。
First make sure you have Kubernetes active and running on your machine (see description here).
其次,我们要启动一个Pod. For this purpose we typically use 部署方式 files. Kubernetes将确保启动必要的Pod,并在必要时甚至替换不健康的Pod.
创建以下部署文件Deployment.yml
:
apiVersion: 应用/ v1
类: Deployment
元数据:name: 我的应用程序部署
规格:
复制品: 1
选择器:matchLabels:app: 我的应用
模板:元数据:标签:app: 我的应用规格:货柜:- name: 我的应用image: 我的应用:0.0.1港口:- containerPort: 8080
The Deployment file 规格ifies the docker image to run (货柜: name
),要启动的广告连播数量(复制品
)以及暴露的端口(containerPort
)。 (可选)我们可以添加资源限制,例如最大的CPU和内存使用率。
$kubectl适用-F deployment.yml
deployment.apps/我的应用程序部署 created
$kubectl进行部署
姓名可用年龄
我的应用程序部署1/1 1 1 1分钟$kubectl描述部署我的应用-deploy
在第一行中,我们创建Kubernetes部署。 您可以通过以下方式自动启动关联的广告连播kubectl得到豆荚
. On the second line you get a list of all Deployments and on the third line, you query all details of our Deployment. Note that our Deployment is configured to start only one pod. We can change this configuration to two 复制品:
$库比克规模-副本=2部署/ 我的应用-deploy
deployment.extensions / my-app-deploy已缩放$kubectl描述部署my-app-deploy
您可以看到我们有两个正在运行的Pod,它们都处于“可用”状态。
目前,我们的网络应用已在集群上运行,但是我们无法直接访问该网络应用。 我们Pod的IP地址只能从Kubernetes集群中访问。 所以现在的问题是:我们如何从集群外部测试我们的Web应用程序? 当您考虑到将来可能更换我们的一个吊舱,从而IP地址将发生变化的事实时,这个问题变得更加棘手。 好消息是Kubernetes提供了一个简单的解决方案,称为服务
.
Kubernetes Services are an abstract way to expose multiple pods on just one IP address. You can create the Service through a file service.yml
:
apiVersion: v1
类: Service
元数据:
name: 我的应用程序服务
规格:
港口:- 港口: 80targetPort: 8080
选择器:app: my-app
$kubectl创建-F service.yml
service/我的应用程序服务 created
$kubectl获得服务
名称类型集群IP外部IP端口(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d1h
我的应用程序服务 ClusterIP 10.104.130.56 <none> 80/TCP 24s
我们的IP地址my-app-service
Service is still only accessible from within the cluster. We can use 港口 forwarding to resolve that problem. Note though that for a production ready environment, you would use another solution such as a Service of type 节点端口
or 负载均衡器
.
$kubectl port-Forward service/my-app-service 8081:80
Our web app is now accessible on localhost
at the URL http://localhost:8081/greeting. 恭喜,您的Kubernetes集群现在正在托管您的Web应用程序,您可以从Web浏览器访问它😊
要关闭服务和窗格,您可以键入:
$kubectl删除部署my-app-deploy
部署扩展“我的应用程序部署”已删除$kubectl删除服务my-app-service
服务“我的应用程序服务”已删除
Summary
让我们总结一下我们的云部署流程中最重要的步骤:
- 将Web应用打包为JAR
- 使用内部的JAR文件创建Docker映像
- 创建Kubernetes部署
- Kubernetes将自动使用我们的Docker映像启动Pod
- 创建一个Kubernetes服务作为所有正在运行的Pod的入口点
感谢您对此主题的关注! 如果您有任何疑问或建议,请发表评论!
from: https://dev.to//pmgysel/from-a-web-application-to-a-docker-image-to-a-deployment-with-kubernetes-171b