Kubernetes 部署 Python 应用实战:从零开始到容器云端
想把你的 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_APP为app.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. 进一步学习
- Kubernetes 官方文档: https://kubernetes.io/docs/
- Minikube: https://minikube.sigs.k8s.io/docs/
- Docker 官方文档: https://docs.docker.com/