背景很简单哈,就是使用主题作者的随机图片获取接口的时候总是会出现调用不通的情况,很崩溃o(≧口≦)o
那就只能自己动手啦╮(╯▽╰)╭
项目简介
本项目通过 Flask 提供一个
/api/images路由,每次请求会从本地挂载的图片目录随机返回一张图片。支持容器化部署,并可通过 Kubernetes Ingress 对外暴露服务。
项目地址:https://github.com/Gengbo89/random-photos-api
项目结构
random-photos-api/
├── deploy.yaml # K8s部署文件(含PVC和Ingress)
├── Dockerfile # 容器构建文件
├── README.md # 项目说明
├── requirements.txt # Python依赖包列表
└── src/
├── main.py # 应用入口
├── api/
│ └── photos.py # 图片接口
└── utils/
└── file_utils.py # 文件工具函数主要代码实现
1. 文件工具函数
负责扫描本地图片目录,获取所有图片文件路径。
# src/utils/file_utils.py
import os
from glob import glob
def get_all_photos(directory):
extensions = ('*.jpg', '*.jpeg', '*.png', '*.gif', '*.bmp', '*.tiff')
photos = []
for ext in extensions:
photos.extend(glob(os.path.join(directory, ext)))
return photos2.图片接口
定义 /api/images 路由,随机返回一张图片。
# src/api/photos.py
from flask import Blueprint, send_file, jsonify
import random
from utils.file_utils import get_all_photos
photos_bp = Blueprint('photos', __name__)
@photos_bp.route('/api/images', methods=['GET'])
def get_random_image():
photos = get_all_photos('/photos')
if not photos:
return jsonify({"error": "No photos found"}), 404
photo = random.choice(photos)
return send_file(photo)3.应用入口
注册蓝图,启动 Flask 服务。
# src/main.py
from flask import Flask
from api.photos import photos_bp
app = Flask(__name__)
app.register_blueprint(photos_bp)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)4.依赖声明
# requirements.txt
flask部署应用
1.docker镜像
使用阿里云 PyPI 源加速依赖安装,工作目录为 /app,图片目录通过挂载方式传入。
# Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
COPY src ./src
EXPOSE 5000
CMD ["python", "src/main.py"]2.deploy部署
包含 PVC 持久化存储、Deployment、Service 和 Ingress,支持 HTTPS。
# deploy.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: photos-pvc
namespace: dev
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: random-photos-api
namespace: dev
spec:
replicas: 1
selector:
matchLabels:
app: random-photos-api
template:
metadata:
labels:
app: random-photos-api
spec:
containers:
- name: random-photos-api
image: registry.gengbo.top/random-photos-api:v1.0.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
volumeMounts:
- name: photos-volume
mountPath: /photos
volumes:
- name: photos-volume
persistentVolumeClaim:
claimName: photos-pvc
---
apiVersion: v1
kind: Service
metadata:
name: random-photos-api
namespace: dev
spec:
selector:
app: random-photos-api
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: random-photos-api-ingress
namespace: dev
spec:
ingressClassName: nginx
rules:
- host: api.gengbo.top
http:
paths:
- backend:
service:
name: random-photos-api
port:
number: 80
path: /api/images
pathType: ImplementationSpecific
tls:
- hosts:
- api.gengbo.top
secretName: api.gengbo.top-tls3.服务验证
检查服务状态、服务日志

使用方法
只是用作封面插图,全使用的缩略图
准备图片 将图片放入 PVC 对应的目录
启动服务
本地运行:
python src/main.pyDocker 运行:
docker run -p 5000:5000 -v /你的图片目录:/photos random-photos-apiK8s 部署:
kubectl apply -f deploy.yaml
获取图片 访问
/api/images路径即可获取随机图片。例如:curl http://api.gengbo.top/api/images