背景很简单哈,就是使用主题作者的随机图片获取接口的时候总是会出现调用不通的情况,很崩溃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 photos

2.图片接口

定义 /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-tls

3.服务验证

检查服务状态、服务日志


使用方法

只是用作封面插图,全使用的缩略图

  1. 准备图片 将图片放入 PVC 对应的目录

  2. 启动服务

    • 本地运行:python src/main.py

    • Docker 运行:docker run -p 5000:5000 -v /你的图片目录:/photos random-photos-api

    • K8s 部署:kubectl apply -f deploy.yaml

  3. 获取图片 访问 /api/images 路径即可获取随机图片。例如:

    curl http://api.gengbo.top/api/images