WEBKT

Kubernetes 部署 Python 应用实战:从零开始到容器云端

112 0 0 0

想把你的 Python 应用部署到 Kubernetes 上,却被 Pod、Service、Deployment 这些概念搞得一头雾水?别担心,本文将以一个简单的 Flask 应用为例,手把手教你如何使用 Kubernetes 部署 Python 应用,并深入理解 Kubernetes 的核心概念。

1. 准备工作

  • Docker 环境: 确保你已经安装并配置好了 Docker 环境,用于容器化你的 Python 应用。
  • Kubernetes 集群: 你需要一个 Kubernetes 集群。可以使用 Minikube 在本地搭建一个简单的集群,或者使用云服务提供商(如 Google Kubernetes Engine, Amazon EKS, Azure Kubernetes Service)提供的 Kubernetes 服务。
  • kubectl: 安装 kubectl 命令行工具,用于与 Kubernetes 集群进行交互。

2. 创建一个简单的 Flask 应用

首先,创建一个名为 app.py 的 Python 文件,包含以下内容:

from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello():
    hostname = os.environ.get('HOSTNAME', 'unknown')
    return f'Hello, Kubernetes! I am running on {hostname}\n'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

这个简单的 Flask 应用会在根路径 / 上返回 "Hello, Kubernetes!",并显示运行应用的主机名。

接下来,创建一个 requirements.txt 文件,列出应用依赖的 Python 包:

Flask

3. 容器化 Flask 应用

现在,我们需要将 Flask 应用容器化。创建一个名为 Dockerfile 的文件,包含以下内容:

FROM python:3.9-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV FLASK_APP=app.py

CMD ["flask", "run", "--host=0.0.0.0"]

这个 Dockerfile 做了以下几件事:

  • 使用 python:3.9-slim-buster 作为基础镜像。
  • 设置工作目录为 /app
  • 复制 requirements.txt 文件并安装依赖。
  • 复制所有应用代码到 /app 目录。
  • 设置环境变量 FLASK_APPapp.py
  • 使用 flask run 命令启动应用。

在包含 Dockerfile 的目录下,运行以下命令构建 Docker 镜像:

docker build -t my-flask-app .

构建完成后,可以使用以下命令运行 Docker 容器:

docker run -d -p 5000:5000 my-flask-app

在浏览器中访问 http://localhost:5000,你应该能看到 "Hello, Kubernetes!" 的消息。

4. 部署到 Kubernetes

4.1 创建 Deployment

Deployment 用于管理 Pod 的创建和更新。创建一个名为 deployment.yaml 的文件,包含以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-flask-app
spec:
  replicas: 3 # 设置副本数量为 3
  selector:
    matchLabels:
      app: my-flask-app
  template:
    metadata:
      labels:
        app: my-flask-app
    spec:
      containers:
      - name: my-flask-app
        image: my-flask-app # 使用本地构建的镜像,需要先 push 到镜像仓库
        ports:
        - containerPort: 5000

这个 Deployment 定义了以下内容:

  • replicas: 3:指定运行 3 个 Pod 副本。
  • selector:用于选择要管理的 Pod,这里通过 app: my-flask-app 标签进行匹配。
  • template:定义 Pod 的模板,包括容器的镜像、端口等信息。

注意: 如果你的 Kubernetes 集群无法访问本地 Docker 镜像,你需要将镜像 push 到一个公共或私有的镜像仓库,并将 image 字段的值修改为镜像仓库中的地址。例如,如果你的镜像仓库是 Docker Hub,并且你的用户名是 your_username,那么你需要先执行 docker tag my-flask-app your_username/my-flask-app,然后执行 docker push your_username/my-flask-app,最后将 image 字段的值修改为 your_username/my-flask-app

使用以下命令创建 Deployment:

kubectl apply -f deployment.yaml

4.2 创建 Service

Service 用于暴露 Deployment 管理的 Pod。创建一个名为 service.yaml 的文件,包含以下内容:

apiVersion: v1
kind: Service
metadata:
  name: my-flask-app
spec:
  type: LoadBalancer # 使用 LoadBalancer 类型,方便外部访问
  selector:
    app: my-flask-app
  ports:
  - port: 80
    targetPort: 5000

这个 Service 定义了以下内容:

  • type: LoadBalancer:使用 LoadBalancer 类型的 Service,Kubernetes 会自动创建一个负载均衡器,将流量转发到 Pod 上。如果你使用的是 Minikube,可以将 type 修改为 NodePort
  • selector:用于选择要暴露的 Pod,这里通过 app: my-flask-app 标签进行匹配。
  • ports:定义 Service 的端口映射,将 Service 的 80 端口映射到 Pod 的 5000 端口。

使用以下命令创建 Service:

kubectl apply -f service.yaml

4.3 访问应用

等待几分钟,让 Kubernetes 创建好 Pod 和 Service。然后,可以使用以下命令查看 Service 的外部 IP 地址:

kubectl get service my-flask-app

如果 Service 的类型是 LoadBalancer,那么 EXTERNAL-IP 列会显示负载均衡器的 IP 地址。如果 Service 的类型是 NodePort,那么你需要使用 Minikube 的 IP 地址和 NodePort 端口号来访问应用。可以使用以下命令获取 Minikube 的 IP 地址:

minikube ip

在浏览器中访问 EXTERNAL-IP 或 Minikube IP 地址,你应该能看到 "Hello, Kubernetes!" 的消息。

5. 核心概念解释

  • Pod: Pod 是 Kubernetes 中最小的部署单元。一个 Pod 可以包含一个或多个容器。在我们的例子中,每个 Pod 只包含一个容器,运行 Flask 应用。
  • Deployment: Deployment 用于管理 Pod 的创建和更新。它可以确保指定数量的 Pod 副本始终在运行,并在 Pod 发生故障时自动重启。Deployment 还可以用于滚动更新应用,而无需停机。
  • Service: Service 用于暴露 Deployment 管理的 Pod。它可以提供一个稳定的 IP 地址和端口,供其他应用访问。Service 可以使用多种类型,如 LoadBalancer、NodePort、ClusterIP 等,以满足不同的需求。

6. 总结

本文通过一个简单的 Flask 应用,演示了如何使用 Kubernetes 部署 Python 应用。希望通过这个例子,你能更好地理解 Kubernetes 的核心概念,并能够将你的 Python 应用部署到 Kubernetes 上。

7. 进一步学习

K8s 小白成长记 KubernetesPythonDeployment

评论点评