如何将Docker容器部署到Kubernetes集群中
容器化涉及将代码及其依赖关系打包在一起。为了更好地理解Docker和Kubernetes的容器化,本指南提供了一个例子,说明如何开发一个简单的应用程序,将其容器化,并部署到Kubernetes集群。
前提条件
你将需要以下东西来学习本教程。
- 一个文本编辑器来创建Flask应用程序。我将使用[VS Code]。
- 在你的电脑上安装[Docker Desktop]。
- 安装[Kubernetes CLI]。
- 在你的电脑中安装[Minikube]。
了解Docker和容器
Docker是一个开源的容器化工具,它将应用程序打包成称为容器的小单元。Docker容器镜像是一个独立的软件包,包含了应用程序运行的所有要求。
如果没有Docker,开发人员可以将运行中的代码发送给测试人员,但运行后,代码可能无法在测试人员的系统上运行。然而,有了Docker,一个应用程序被打包了所有的要求和依赖性,因此Docker容器可以在任何有Docker运行时间的平台上运行。
什么是Kubernetes?
Kubernetes协助协调容器化应用程序在主机集群上的运行。它使云平台中的Docker化应用程序的部署和管理自动化。它使部署团队在部署和扩展应用程序的手动过程中得到缓解。
创建应用程序
我们将创建一个简单的Flask应用程序,生成随机数并在网页上显示。为了创建Flask应用程序,我们需要安装flask 。
在项目的目录中,运行下面的命令。
pip install flask
接下来,创建两个文件requirements.txt ,以指向和app.py 的库和依赖项。
将下面的脚本添加到app.py 文件中。
from flask import Flask, render_template
import flask
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
创建一个名为templates 的文件夹,其中包含网页上渲染的HTML文件。在该文件夹中,创建一个名为index.html 的文件,然后添加下面的片段。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Docker App</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar navbar-dark bg-success">
<div class="container-fluid">
<a class="navbar-brand" href="#">SECTION</a>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
</ul>
</div>
</div>
</nav><br><br>
<div class="container">
<div class="card">
<div class="card-header">
AWESOME ARTICLE
</div>
<div class="card-body">
<h5 class="card-title">DEPLOY DOCKER CONTAINER TO KUBERNETES CLUSTER</h5>
<p class="card-text">
Docker is an open-source containerization tool that packages applications
into small units called containers.
A docker container image is a standalone software package that contains all
the requirements for an application to run.
Without docker, a developer can send a running code to a tester but upon running, the code might not run on the tester's system.
However, with Docker, an app is packaged with all the requirements and dependencies hence a Docker container can run on any platform.
</p>
<a href="#" class="btn btn-success ">view article</a>
</div>
</div>
</div>
</body>
</html>
需求文件
该文件规定了运行应用程序所需的依赖性。在应用程序的根目录下,创建一个名为requirements.txt 的文件。我们的应用程序只需要flask和unicorn。
所以我们需要在requirements.txt 文件中包括这两个,如下所示。
flask==1.1.2
gunicorn==20.0.4
创建一个Dockerfile
Dockerfile被Docker引擎用来创建应用程序容器的新Docker镜像。它设置了一个运行应用程序所需的环境。
创建一个名为Dockerfile 的文件,并添加下面的片段。
# We need python 3.8
FROM python:3.8
# make the working directory in the container
RUN mkdir /app
# specify where to install the app
WORKDIR /app/
# add all files to the working directory
ADD . /app/
# Install the dependencies in the requirements file.
RUN pip install -r requirements.txt
# Run the app
CMD ["python", "/app/app.py"]
生成应用程序的镜像
启动Docker桌面,然后执行下面的命令。
docker build --tag flask-test-app:latest .

部署Docker镜像
现在我们有一个Docker容器镜像,我们需要创建一个部署文件。在根目录下,创建一个名为deployment.yaml 的新文件。这个文件将把应用程序部署到Kubernetes引擎上。
在该文件中添加以下片段。
apiVersion: v1
kind: Service
metadata:
name: flask-test-service
spec:
selector:
app: flask-test-app
ports:
- protocol: "TCP"
port: 6000
targetPort: 5000
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-test-app
spec:
selector:
matchLabels:
app: flask-test-app
replicas: 5
template:
metadata:
labels:
app: flask-test-app
spec:
containers:
- name: flask-test-app
image: flask-test-app
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
该文件有两部分。
-
Service- 该服务充当负载平衡器。负载平衡器用于将请求分配到各种可用的服务器上。 -
Deployment将充当预定的应用程序。用户请求击中了负载均衡器,然后负载均衡器通过创建 文件中定义的副本数量来分配请求。例如,在我们的案例中,我们有5个副本,以实现可扩展性,这意味着我们将有5个实例在同一时间运行。deployment.yaml
多个副本的好处是,如果一个实例崩溃了,其他应用实例会继续运行。
deployment.yaml 文件与之前创建的Docker镜像相连接,因此为了将应用程序部署到Kubernetes集群,我们使用Docker镜像。当我们部署应用程序时,该镜像将自动为该应用程序创建容器。
部署到Kubernetes服务
我们已经将Flask应用程序docker化,现在我们需要将其部署到Kubernetes引擎。
在你的终端中执行下面的命令。
kubectl apply -f deployment.yaml
这个命令将把我们的服务和应用实例部署到Kubernetes引擎上。执行这个命令后,我们应该可以看到flask-test-service 和flask-test-app 已经成功创建。

部署仪表板
Minikube和Kubernetes提供了一个仪表盘来可视化部署。为了在该仪表板中看到我们的部署,在你的终端中执行以下命令。
minikube dashboard
这个命令应该产生一个如下所示的仪表板。

我们可以看到我们的Flask应用程序已经部署,我们可以看到运行的实例数量。如果有请求,负载平衡器会将请求的点击率分配到各实例上。
访问应用程序
我们可以使用下面的命令访问应用程序。
minikube start service: flask-test-service
该命令将在浏览器中打开该应用程序,如下图所示。

总结
在本教程中,我们使用Flask框架创建了一个网络应用。我们继续前进并创建了应用程序的Docker镜像。
最后,我们使用Minikube成功地将该应用程序部署到Kubernetes集群。
这个教程应该可以帮助初学者开始使用Docker容器和Kubernetes集群进行容器化。