如何将Docker容器部署到Kubernetes集群中?

408 阅读5分钟

如何将Docker容器部署到Kubernetes集群中

容器化涉及将代码及其依赖关系打包在一起。为了更好地理解Docker和Kubernetes的容器化,本指南提供了一个例子,说明如何开发一个简单的应用程序,将其容器化,并部署到Kubernetes集群。

前提条件

你将需要以下东西来学习本教程。

  1. 一个文本编辑器来创建Flask应用程序。我将使用[VS Code]。
  2. 在你的电脑上安装[Docker Desktop]。
  3. 安装[Kubernetes CLI]。
  4. 在你的电脑中安装[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 .

Creating a Docker Image

部署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

该文件有两部分。

  1. Service - 该服务充当负载平衡器。负载平衡器用于将请求分配到各种可用的服务器上。

  2. Deployment 将充当预定的应用程序。用户请求击中了负载均衡器,然后负载均衡器通过创建 文件中定义的副本数量来分配请求。例如,在我们的案例中,我们有5个副本,以实现可扩展性,这意味着我们将有5个实例在同一时间运行。deployment.yaml

多个副本的好处是,如果一个实例崩溃了,其他应用实例会继续运行。

deployment.yaml 文件与之前创建的Docker镜像相连接,因此为了将应用程序部署到Kubernetes集群,我们使用Docker镜像。当我们部署应用程序时,该镜像将自动为该应用程序创建容器。

部署到Kubernetes服务

我们已经将Flask应用程序docker化,现在我们需要将其部署到Kubernetes引擎。

在你的终端中执行下面的命令。

kubectl apply -f deployment.yaml

这个命令将把我们的服务和应用实例部署到Kubernetes引擎上。执行这个命令后,我们应该可以看到flask-test-serviceflask-test-app 已经成功创建。

Deploying to Kubernetes

部署仪表板

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

minikube dashboard

这个命令应该产生一个如下所示的仪表板。

Deployment dashboard

我们可以看到我们的Flask应用程序已经部署,我们可以看到运行的实例数量。如果有请求,负载平衡器会将请求的点击率分配到各实例上。

访问应用程序

我们可以使用下面的命令访问应用程序。

minikube start service: flask-test-service

该命令将在浏览器中打开该应用程序,如下图所示。

Deployed app

总结

在本教程中,我们使用Flask框架创建了一个网络应用。我们继续前进并创建了应用程序的Docker镜像。

最后,我们使用Minikube成功地将该应用程序部署到Kubernetes集群。

这个教程应该可以帮助初学者开始使用Docker容器和Kubernetes集群进行容器化。