Docker是利用OS虚拟化的最强大和流行的容器化工具之一。它创建了在原始应用程序中孤立的环境中运行的Docker容器。 Docker容器包含所有配置和文件以运行应用程序。当他们在Docker Hub注册表中托管时,它们很容易在不同的开发人员中共享。
在本教程中,您将学习如何将Fast API应用程序扩展到Kubernetes。我们将首先在本地创建并运行快速的API应用程序。我们将对快速API应用程序进行扩展,并将其作为Docker容器运行。我们最终将将Dockerized快速API应用程序部署到Kubernetes。
Kubernetes是一个开源平台,可以自动管理Docker容器的部署。 Kubernetes协调应用程序容器,并将其托管在Kubernetes群集中。 Kubernetes群集具有运行和管理托管/部署的容器应用程序的节点(主和工作节点)。部署的容器在称为POD的Kubernetes环境中运行。 POD是在Kubernetes群集中运行的最小可部署单元。
在本教程中,我们将将Dockerized快速API应用程序部署到称为Minikube的本地Kubernetes群集。稍后,我们将更多地谈论Minikube。让我们开始从事我们的项目!
先决条件
让您轻松地使用本教程并将您的应用程序部署到Kubernetes,您需要了解Docker。您还必须在计算机上拥有以下软件:
- VS Code code editor
- Docker Desktop
- Python Pip软件包经理
- Python ≥v3.7
快速API入门
FastApi是一个流行的Python Web框架,开发人员用它来创建RESTFUL API。它基于Pydantic和Python型提示,可有助于数据的序列化,进行验证和验证。在本教程中,我们将使用FastAPI创建一个简单的“ Hello World”应用程序。我们在本地测试并运行该应用程序。 FastApi需要ASGI server运行应用程序生产,例如Uvicorn。
与任何应用程序或项目一样,我们需要安装框架和依赖项。让我们使用以下pip
命令安装快速API框架和UVICORN:
pip install fastapi
pip install "uvicorn[standard]"
安装过程后,创建一个名为fast-api
的新文件夹,并使用VS代码打开它。在文件夹中,创建一个名为main.py
的新文件,并添加以下python代码:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
上面的Python片段将创建一个route
路线,该路由将返回“ Hello”:“ World”。要运行该应用程序,请cd
进入fast-api
文件夹并在您的终端中执行此uvicorn
命令:
uvicorn main:app
命令将在http://127.0.0.1:8000上启动您的应用程序,如下所示:
然后,您可以在Web浏览器中键入上面的URL以查看应用程序:
我们的fastapi应用程序正在运行,下一步是停靠fastapi应用程序。
停靠FastAPI应用程序
我们将在Docker容器内运行FastAPI应用程序。为了扩展FastAPI应用程序,我们需要遵循以下步骤:
- 创建一个
requirements.txt
文件。 - 为Fastapi应用程序编写Dockerfile。
- 使用Dockerfile构建Fastapi应用程序的Docker映像。
- 使用Docker Image启动Docker容器。
让我们应用以下步骤。
创建一个requirements.txt
文件
requirements.txt
文件包含FastAPI应用程序的框架和依赖项。 Docker在为FastAPI应用程序创建Docker映像时将安装所有这些要求。
在fast-api
文件夹中,创建一个名为requirements.txt
的新文件。打开文件并添加以下内容:
fastapi
uvicorn
为Fastapi应用程序编写Dockerfile
Dockerfile是一个可执行文件,其中包含用于创建Docker映像的命令或指令列表。 Docker Engine将按时间顺序执行所有这些命令,并创建一个Docker映像。在fast-api
文件夹中,创建一个名为requirements.txt
的新文件。打开文件并添加以下内容:
#It instructs Docker Engine to use official python:3.10 as the base image
FROM python:3.10
#It creates a working directory(app) for the Docker image and container
WORKDIR /app
#It copies the framework and the dependencies for the FastAPI application into the working directory
COPY requirements.txt .
#It will install the framework and the dependencies in the `requirements.txt` file in our Docker image and container.
RUN pip install -r requirements.txt
#It will copy the remaining files and the source code from the host `fast-api` folder to the `app` container working directory
COPY . .
#It will expose the FastAPI application on port `8000` inside the container
EXPOSE 8000
#It is the command that will start and run the FastAPI application container
CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]
使用Dockerfile为FastAPI应用程序构建Docker映像
我们将使用Dockerfile中的指令为FastAPI应用程序构建Docker映像。您将cd
进入终端中的fast-api
文件夹,然后运行此docker
命令:
docker build -t bravinwasike/fast-api .
注意:确保使用Docker Hub帐户用户名称命名Docker Image。将Docker映像推向Docker Hub存储库将变得更加容易。该命令将在您的终端中显示以下输出:
使用Docker Image启动Docker容器
我们将使用Docker Image启动Docker容器。运行Docker映像时,它将为应用程序启动Docker容器。在您的终端中,运行此docker
命令:
docker run -p 8000:8000 bravinwasike/fast-api
命令将在http://127.0.0.1:8000上启动您的应用程序,如下所示:
然后,您可以在Web浏览器中键入上面的URL以查看应用程序:
我们已经停止了快速API应用程序。让我们将Docker图像推到Docker Hub。
将Docker图像推到Docker Hub
要将Docker Image推向Docker Hub,您需要从您的终端登录到Docker Hub帐户:
docker login
然后,您将使用以下docker
命令推动docker映像:
docker push bravinwasike/fast-api
您必须推动为Docker Hub创建的Docker映像。将快速API应用程序部署到Minikube时,我们将使用此Docker映像。让我们开始使用Minikube。
Minikube入门
Minikube是Kubernetes引擎,可让DevOps工程师在其本地机器上创建Kubernetes群集。 Minikube Kubernetes群集只有一个可以管理已部署应用程序的节点。 Minikube是一个基于云的Kubernetes群集的简单版本,该群集具有多个主节点和工人节点。我们将使用Minikube托管我们的Dockerized FastApi应用程序。
Minikube很容易设置,因为它通常带有Docker安装。只要您在计算机中运行Docker,默认情况下就有Minikube。
注意:仅在开发环境中测试简单的kubernetes应用程序时才使用Minikube。在生产环境中,您永远无法使用Minikube。
要检查Docker随附的Minikube版本,请运行此minikube
Comamnd:
minikube version
要启动Minikube Kubernetes群集,运行此minikube
命令:
minikube start --driver=docker
命令将创建并启动Minikube Kubernetes群集,如下所示:
我们在本地机器上启动了Minikube Kubernetes群集。在部署Dockerized快速API应用程序之前,我们需要设置Kubernetes CLI(Kubectl)。
kubernetes CLI入门
kubernetes cli(kubectl)是一个强大的命令行工具接口,允许DevOps工程师与终端的Kubernetes群集通信。它具有允许您管理和部署Dockerized应用程序到Kubernetes群集的命令。安装Kubernetes CLI有不同的方法。在本教程中,我们将使用以下命令安装此工具:
choco install kubernetes-cli
要检查安装是否成功,请运行此kubectl
命令:
kubectl version --client
当您想使用Kubectl将应用程序部署到Minikube Kubernetes群集时,您将需要创建一个kubernetes yaml文件。让我们谈谈这个文件。
kubernetes yaml文件
kubernetes yaml文件描述了Kubernetes应用程序和将在Kubernetes群集中创建的POD的资源。该文件还为应用程序配置了Kubernetes Service。 Kubectl将使用此文件将Dockerized快速API应用程序部署到Minikube。在fast-api
文件夹中,创建一个名为kubernetes.yaml
的新文件。打开文件并添加以下代码:
apiVersion: apps/v1
kind: Deployment
metadata:
name: fast-api-deployment
spec:
replicas: 2
selector:
matchLabels:
app: fast-api
template:
metadata:
labels:
app: fast-api
spec:
containers:
- name: fast-api
image: bravinwasike/fast-api
resources:
limits:
memory: "256Mi"
cpu: "500m"
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: fast-api-service
spec:
selector:
app: fast-api
ports:
- port: 8000
targetPort: 8000
type: LoadBalancer
kubernetes.yaml
分为两个。第一部分被称为Deployment
,而第二部分被称为Service
。
1。部署
文件的第一部分将配置应用程序POD和您已部署的应用程序的资源。它将创建两个豆荚。 POD是部署应用程序的复制品或实例。它将使用Docker Hub的bravinwasike/fast-api
图像来创建Docker容器。
2。服务
第二种类型的文件为应用程序配置了Kubernetes服务。它使用LoadBalancer
Kubernetes服务将流量平均分配给两个容器吊舱。 Minikube将把外部IP地址分配给Kubernetes服务。它将使我们能够访问已部署的快速API应用程序。
让我们将kubectl应用于此文件:
kubectl apply -f kubernetes.yaml
命令将创建一个名为fast-api-deployment
的Kubernetes部署。它还将创建一个名为fast-api-service
的Kubernetes服务。让我们运行以下命令以获取Kubernetes部署和服务:
1。 Kubernetes部署
运行以下命令:
kubectl get deployment
它给出以下输出:
2。 Kubernetes服务
运行以下命令:
kubectl get service
它给出以下输出:
访问已部署的FastAPI应用程序
要访问已部署的FastAPI应用程序,Minikube将把外部IP地址分配给fast-api-service
。您将在Web浏览器中键入外部IP地址并访问应用程序。要获取外部IP地址,请运行此minikube
命令:
minikube service fast-api-service
Minikube已将外部IP地址分配给fast-api-service
,如下所示:
在您的Web浏览器中键入分配的IP地址以访问您的Dockerized FastApi应用程序:
我们的Dockerized FastApi应用程序正在Minikube Kubernetes群集中运行。因此,我们已经成功地对接并部署了一个快速的API应用程序。
结论
在本教程中,您已经学会了如何将快速API应用程序扩展到Kubernetes。我们首先在本地创建和运行快速的API应用程序。然后,我们写了一个Dockerfile,并用它为FastApi应用程序构建了Docker映像。
我们使用Docker Image启动Docker容器。最后,我们将Dockerized快速API应用程序部署到Minikube Kubernetes。我们使用Kubernetes CLI和Kubernetes Yaml部署了应用程序。