当然可以!下面是一个 Python 版本的 Kubernetes 镜像动手实验任务,使用轻量级的 Flask 框架,步骤清晰、资源占用少,非常适合学习和快速验证。
🎯 实验目标(Python 版)
- 编写一个返回
"Hello from K8s! 🐍"的 Flask 应用 - 构建 Docker 镜像(基于
python:3.11-slim) - 推送镜像到 阿里云容器镜像服务 ACR
- 在 Kubernetes 中部署并暴露为
NodePort服务 - 通过浏览器或
curl访问验证
✅ 环境要求:
- Linux 服务器(如阿里云 ECS)
- 已安装 Docker
- 已配置
kubectl连接到 K8s 集群
📦 第一步:编写 Python Web 应用
1.1 创建项目目录
bash
mkdir ~/k8s-python-demo && cd ~/k8s-python-demo
1.2 创建 app.py
python
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello():
return "Hello from K8s! 🐍\n"
@app.route('/')
def index():
return "Welcome to Python K8s Demo!\n"
if __name__ == '__main__':
# 监听所有接口,端口 8080
app.run(host='0.0.0.0', port=8080)
1.3 创建 requirements.txt
ini
# requirements.txt
Flask==3.0.3
🐳 第二步:构建 Docker 镜像
2.1 编写 Dockerfile
bash
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
# 复制依赖文件并安装(利用 Docker 层缓存)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY app.py .
# 暴露端口
EXPOSE 8080
# 启动命令
CMD ["python", "app.py"]
💡 使用
slim镜像减小体积,--no-cache-dir减少镜像大小
2.2 构建镜像
erlang
docker build -t k8s-python-app:1.0 .
2.3 本地测试
bash
docker run -d --name test-py -p 8080:8080 k8s-python-app:1.0
curl http://localhost:8080/hello
# 输出:Hello from K8s! 🐍
docker stop test-py && docker rm test-py
☁️ 第三步:推送镜像到阿里云 ACR
3.1 前提:已在 阿里云 ACR 控制台 创建:
- 个人版实例(如地域:
cn-hangzhou) - 命名空间(如:
my-namespace)
3.2 登录 ACR 并推送
perl
# 登录(替换为你的阿里云账号密码或独立 Registry 密码)
docker login registry.cn-hangzhou.aliyuncs.com
# 打标签
docker tag k8s-python-app:1.0 \
registry.cn-hangzhou.aliyuncs.com/my-namespace/k8s-python-app:1.0
# 推送
docker push registry.cn-hangzhou.aliyuncs.com/my-namespace/k8s-python-app:1.0
✅ 成功后可在 ACR 控制台看到镜像
🚀 第四步:在 Kubernetes 中部署
4.1 创建部署 YAML 文件
yaml
# python-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-demo-app
spec:
replicas: 2
selector:
matchLabels:
app: python-demo
template:
metadata:
labels:
app: python-demo
spec:
containers:
- name: flask-app
image: registry.cn-hangzhou.aliyuncs.com/my-namespace/k8s-python-app:1.0
ports:
- containerPort: 8080
imagePullPolicy: Always
# 可选:资源限制
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
---
apiVersion: v1
kind: Service
metadata:
name: python-demo-svc
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30081 # 注意:不要和之前冲突
selector:
app: python-demo
4.2 部署到集群
kubectl apply -f python-app.yaml
4.3 验证部署
csharp
# 查看 Pod 状态
kubectl get pods -l app=python-demo
# 查看 Service
kubectl get svc python-demo-svc
# 从本地访问(替换为你的 ECS 公网 IP)
curl http://<ECS公网IP>:30081/hello
# 输出:Hello from K8s! 🐍
🔒 安全组设置 :确保阿里云 ECS 安全组已开放 30081 端口(TCP)
🧪 第五步:进阶挑战(可选)
✅ 挑战 1:用 ConfigMap 自定义欢迎语
yaml
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
WELCOME_MSG: "Hello from ConfigMap! 🎉"
修改 app.py 支持环境变量:
python
import os
from flask import Flask
app = Flask(__name__)
msg = os.getenv("WELCOME_MSG", "Hello from K8s! 🐍")
@app.route('/hello')
def hello():
return msg + "\n"
在 Deployment 中注入:
yaml
env:
- name: WELCOME_MSG
valueFrom:
configMapKeyRef:
name: app-config
key: WELCOME_MSG
✅ 挑战 2:添加健康检查
yaml
livenessProbe:
httpGet:
path: /hello
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /hello
port: 8080
initialDelaySeconds: 2
periodSeconds: 5
🗑️ 清理资源
perl
# 删除应用
kubectl delete -f python-app.yaml
# 删除本地镜像
docker rmi k8s-python-app:1.0
docker rmi registry.cn-hangzhou.aliyuncs.com/my-namespace/k8s-python-app:1.0
📌 关键优势(Python vs Java)
| 项目 | Python 版 |
|---|---|
| 镜像大小 | ~120 MB(Java 通常 300MB+) |
| 启动速度 | 秒级 |
| 依赖简单 | 只需 Flask |
| 学习曲线 | 更平缓 |
✅ 总结流程图
perl
app.py + requirements.txt
↓
Docker build → k8s-python-app:1.0
↓
docker push → 阿里云 ACR
↓
kubectl apply → Deployment + Service
↓
curl http://ECS_IP:30081/hello → 成功!
现在你拥有了一个完整的 Python 微服务 + K8s 部署 实践案例!
需要我提供:
- 带 Helm Chart 的版本?
- 使用 Gunicorn 提升性能的生产级 Dockerfile?
- 对接阿里云 SLB 或 Ingress 的方案?
欢迎继续提问!🐍🚀