Kubernetes结合Docker的优势


【编者的话】本文主要是从实际的角度描述了Docker以及Kubernetes结合在一起给应用程序部署带来的优势。

你应该会看到很多关于KubernetesDocker的消息,以至于你可能想知道哪个更好。

事实上,没有“更好”一说,因为它们所解决的问题是不一样的。Docker就像飞机,而Kubernetes就像飞机场。就像你不可能说“我应该基于哪个去旅行——飞机或者飞机场?”,Docker和Kubernetes也是一样的,你需要它们两个。

在这篇文章中,我们将描述一个部署场景,讲述容器和编排工具是如何帮助部署的,以及开发人员每天是如何使用它们。看完这篇文章,你将了解它们在一起的方式。

所有事情基于你的本地环境

首先,我们从一个在每次部署中奋斗的人的典型一天开始。然后,我会解释这两种技术如何提供帮助。为了更实际一点,我们虚构一个开发人员John Smith,John是一家为初创公司工作的开发人员,他负责将他的代码部署到实时环境中。

John有两个应用程序:一个运行在.NET Core中,另一个运行在Node.js中。 每当新版本的语言、框架或库出来时,他必须进行升级。问题是当他所安装的东西不兼容时,导致app不能正常工作,他需要安装、卸载、更新或删除,直到最终恢复运行。当他完成了这些事情,恢复了运行环境,然后需要在另一个环境再来一次时,问题就更大了,毕竟在短时间内需要记住所有的步骤是非常困难的。

一种解决方案是让他使用虚拟机(VM)。这样,他可以隔离所有依赖项,并避免影响任何现有的应用程序及其依赖项。

虽然这个解决方案可以起到一定的作用,但不能扩展,为什么?因为每当有所改变时,他必须做新的快照。然后他必须以某种方式组织这些虚拟机快照的所有不同版本。他仍然需要将代码中的更改以及任何依赖部署到其他环境中。当然,他也可能在其他环境出现问题,然后修复它。但是如果是在生产环境时,事情就会变得危险。他必须与类生产环境一起工作来缓解部署并降低风险,这很难做到。

即使有自动化,部署也可能过于复杂。也许John甚至不得不花整整一个周末来做部署以及修复各种琐碎的东西。

我们都希望部署可以像按下按钮一样简单,这就是Docker和Kubernetes发挥作用的地方。

使用Docker来打包并发送你的应用程序

那么,Docker究竟是什么?

Docker是一家提供容器平台的公司。容器是一种将软件运行所需要的一切打包并隔离的方法。我说“隔离”的意思是因为容器可以从宿主机分配单独的资源。这听起来与虚拟机非常相似,但不同之处在于容器更轻:它们不需要另一个操作系统来运行软件。容器让你变得更加敏捷,并构建安全且便携式应用程序,这样可以让你在完成良好的基础架构时节省一些成本。

我知道这听起来像是一本教科书的定义,所以让我们实际看看John生活中的这一天是如何获益的。

假设John决定开始他的容器之旅。他了解到Docker容器与基础镜像一起工作是运行应用程序的基础。基础镜像及其所有依赖关系在名为“Dockerfile”的文件中进行了描述。Dockerfile就像一篇食谱,你在Dockerfile中定义好运行应用程序所需要的基础环境,而想要运行你的应用的任何人只需要通过Dockerfile就能构建一个相同的基础环境。John从.NET Core应用程序开始,Dockerfile看起来像这样:
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

Copy csproj and restore as distinct layers

COPY *.csproj ./
RUN dotnet restore

Copy everything else and build

COPY . ./
RUN dotnet publish -c Release -o out

Build runtime image

FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "hello.dll"]

正如你所看到的,这就好像你在编程。唯一的区别是你只是定义所有的依赖关系,并声明如何构建和运行应用程序。

John需要将该文件放入源代码的根目录并运行以下命令:
docker build -t dotnetapp .

该命令将创建一个包含编译代码及其所有依赖项的镜像。他只需要做一次“构建”,因为这种方式是让应用程序可移植到任何地方。所以,当他想运行应用程序时,只需要安装Docker,然后运行以下命令:
docker run -d -p 80:80 dotnetapp

该命令将开始在主机的端口80上运行应用程序。无论他在哪里运行此命令都无关紧要,只要端口80没有被使用,应用程序就会工作。

John现在就可以将应用程序发布到任何地方,因为他已经将应用程序打包在Docker容器中。

为什么这种方式更好?因为John不必担心忘记他在本地计算机或任何其他服务器上安装的内容。当团队扩大时,新的开发人员可以迅速开始coding。当约翰的公司聘用一位运维人员时,新员工将知道容器中包含了什么。如果他们想要升级框架或者依赖项,他们就可以做到,而不用担心影响当前的工作。

使用Docker打包并发布你的应用程序,而不用担心应用程序在本地进行测试后是否可以在其他地方使用。如果它在你的机器上能够工作,它会在别人的机器上也能正常工作。

使用Kubernetes部署和扩展你的应用程序

完成了上面的事情,John现在只需要到他想要发布应用程序的服务器上启动容器就好。比方说,在生产中,他有十台服务器来支持流量负载。他必须在所有服务器上运行先前的命令。如果由于某种原因容器死亡,他必须去该服务器运行命令以再次启动它。

这听起来不像是一种改进,对吧?这与虚拟机没有多大区别。当程序发生异常时,他仍然需要手动去再次启动容器。他也可以自动执行该任务,但他需要考虑健康检查和可用资源等事情。所以这就是Kubernetes需要解决的事情。

正如官网所说,Kubernetes是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。相同作用的工具有很多种,但Kubernetes是目前最流行的一种。Kubernetes执行容器编排,因此你不必编写这些任务的脚本。 这是将你的应用程序容器化后的下一步,以及你如何在生产中大规模运行容器。

Kubernetes将帮助你在任何地方以相同的方式部署应用程序。你只需要用声明性语言说出你想如何运行容器即可。你将拥有一个负载均衡器,运行最少量的容器,并且只有在需要时才可以向上扩展或向下缩小。你将规模运行所需的一切,并且你将在同一个地方拥有这一切。不仅如此,感谢Minikube,你现在可以在本地运行自己的Kubernetes集群,或者你可以使用Docker,因为Docker现在正式支持Kubernetes。

所以,回到John这边,他可以定义他想要如何部署一个名为“dotnetapp”的应用程序。

我们来看“dotnetapp-deployment.yaml”文件,其中John定义了如何在Kubernetes集群中执行部署,包括在容器级别的所有依赖关系。在这种情况下,除了启动dotnetapp外,它还使用容器启动数据库。以下就是该文件:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: dotnetapp
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
template:
metadata:
labels:
app: dotnetapp
spec:
containers:
- name: dotnetapp
image: johndoe/dotnetapp:1.0
ports:
- containerPort: 80
resources:
requests:
cpu: 250m
limits:
cpu: 500m
env:
- name: DB_ENDPOINT

value: "dotnetappdb"

apiVersion: v1
kind: Service
metadata:
name: dotnetapp
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: dotnetapp

John现在只需运行如下命令即可在本地或其他任何Kubernetes集群中部署应用程序:
kubectl apply -f .\dotnetapp-deployment.yaml

该命令会创建所需的所有东西,或者如果已经有一个存在了,它将会更新现有应用程序。

John可以在这台计算机或任何其他环境(包括生产环境)上运行完全相同的命令,并且在任何地方都能以相同的方式运行。不仅如此,Kubernetes根据你使用的yaml文件中定义的不断检查你的部署状态,如果一个Docker容器出现故障,Kubernetes会自动启动一个新容器。John不再需要去每台服务器上启动容器,编排软件会为他处理这件事,并且它会一直在监控应用程序,以确保它始终按预期运行。

这就是你如何在大约五分钟轻松完成一天的多次部署的方法。

快速,一致和可预测地交付

现在你知道什么是Docker和Kubernetes,而不仅仅只是了解概念。你也从一个实际的角度进行了了解。这两种技术都使用声明性语言来定义它们将如何运行和编排应用程序。

你将能够提供更快速的交付,但更重要的是,你将以一致且可预测的方式进行交付。Docker容器将帮助你隔离和打包你的软件及其所有依赖项。 Kubernetes将帮助你部署和协调你的容器。这可让你专注于开发新功能并更快地修复错误。然后你会注意到,在某个时候,你的部署不再是一个大型工程。

最后,最重要的是要记住:当你将Docker和Kubernetes结合在一起时,每个人都会增加信心和生产力。

原文链接:The Advantages of Using Kubernetes and Docker Together(翻译:肖远昊)

0 个评论

要回复文章请先登录注册