04-17.eri-test 从Web应用程序到Docker映像再到Kubernetes的部署

FromaJavaApplicationtoaKubernetes部署方式

在本教程中,我们将从JavaWeb应用程序,创建一个Docker镜像将应用程序放在内部,然后将映像部署在本地Kubernetes集群。 本指南介绍了从编译Web应用程序到在Kubernetes上运行Web应用程序的所有必要步骤。 虽然有出色的开源工具可以执行所有这些步骤,但我们将在手动命令行.

Pipeline for typical cloud deployment

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
  选择器matchLabelsapp 我的应用
  模板元数据标签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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值