Django项目k8s部署方案

k8s部署上线Django方案


一、容器构建

建议将Django项目环境与uWSGI服务器在同一容器中构建。

1. Docker镜像构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 使用指定Python版本的基础镜像
FROM python:3.6.8

# 镜像源设置pip
RUN echo "[global]" >> /root/.pip/pip.conf \
&& echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> /root/.pip/pip.conf \
&& echo "[install]" >> /root/.pip/pip.conf \
&& echo "trusted-host = pypi.tuna.tsinghua.edu.cn" >> /root/.pip/pip.conf

# 安装系统依赖(包含uWSGI编译所需)
RUN apt-get update && apt-get install -y \
gcc python3-dev libpq-dev build-essential libssl-dev libffi-dev \
&& rm -rf /var/lib/apt/lists/*

# 复制项目代码及依赖清单
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

# 使用uwsgi启动服务替代开发服务器
# 配置uwsgi uwsgi.ini

# 编写启动脚本start.sh
ENTRYPOINT /bin/bash ./start.sh

start.sh基本内容(容器启动时需要执行的操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

# 设置脚本遇到错误时立即退出
set -e

# 配置数据库、中间件相关配置
# 使用环境变量默认值,在k8s ConfigMap中进行具体配置
MYSQL_HOST="${MYSQL_HOST:-db}"
MYSQL_PORT="${MYSQL_PORT:-3306}"

# 等待数据库服务启动
echo "等待 MySQL 服务在 $MYSQL_HOST:$MYSQL_PORT 启动..."
until nc -z "$MYSQL_HOST" "$MYSQL_PORT"; do
echo "MySQL 服务尚未就绪,等待中..."
sleep 3
done
echo "MySQL 服务已就绪。"

# 执行Django初始化流程
echo "执行Django初始化流程..."
python manage.py collectstatic --noinput
python manage.py makemigrations
python manage.py migrate
echo "Django 初始化完成。"

# 启动uWSGI服务
echo "启动 uWSGI 服务..."
exec uwsgi --ini "$UWSGI_INI"

2.运行命令构建镜像

1
docker build -t django:v1 .

2. 推送私有镜像仓库

  • 在内网搭建Harbor或使用Docker Registry或阿里云镜像仓库
  • 推送镜像:docker push 仓库地址/django:v1

二、Kubernetes资源配置

1. Deployment配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: apps/v1
kind: Deployment
metadata:
name: django
spec:
replicas: 3
selector:
matchLabels:
app: django
template:
metadata:
labels:
app: django
spec:
containers:
- name: django-app
image: 仓库地址/django:v1
ports:
- containerPort: 8000
envFrom:
- configMapRef:
name: config
- secretRef:
name: secrets
resources:
requests:
cpu: "4"
memory: "4Gi"
limits:
cpu: "8"
memory: "16Gi"
livenessProbe:
httpGet:
path: /health/
port: 8080
initialDelaySeconds: 30 # 适当延迟等待应用初始化
periodSeconds: 15

2. Service暴露

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: django-service
spec:
selector:
app: django
ports:
- protocol: TCP
port: 8080
targetPort: 8080
# 内网环境建议使用ClusterIP+Ingress组合
type: ClusterIP

三、网络

1. 网络配置

  • Ingress配置:搭配Nginx Ingress Controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: ingress
    annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
    spec:
    ingressClassName: nginx
    rules:
    - http:
    paths:
    - path: /api
    pathType: Prefix
    backend:
    service:
    name: django-service
    port:
    number: 8080
  • 网络策略(按需配置):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: allow-frontend
    spec:
    podSelector:
    matchLabels:
    app: django
    ingress:
    - from:
    - podSelector:
    matchLabels:
    app: frontend
    policyTypes:
    - Ingress
  • DNS配置

    在k8s的CoreDNS中配置私有域解析

    1
    2
    3
    4
    # coredns configmap添加
    internal.domain.com {
    forward . 10.100.0.100 # 指向内部DNS服务器
    }

2.存储方案

  • 数据库分离:使用独立的数据库集群(非容器化

四、配置与密钥管理

1. ConfigMap配置容器环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ConfigMap定义(非敏感配置)
apiVersion: v1
kind: ConfigMap
metadata:
name: config
data:
MYSQL_HOST: "mysql-cluster" # 数据库服务地址
MYSQL_PORT: "3306" # 数据库端口
STATIC_DIR: "/data/test/static" # 静态文件目录
LOG_LEVEL: "INFO" # 日志级别

# 文件存储配置
MEDIA_ROOT: "/data/test/uploads" # 文件上传路径
STATIC_ROOT: "/data/test/static" # 静态文件收集路径

# 日志配置
LOG_LEVEL: "INFO" # 生产环境日志级别
LOG_DIR: "/var/log/test" # 日志存储路径

2. Secret管理

1
2
3
4
5
6
7
8
9
# Secret定义(敏感信息)
apiVersion: v1
kind: Secret
metadata:
name: secrets
type: Opaque
data:
DB_PASSWORD: eHh4Cg== # base64编码的数据库密码(明文为"xxx")
SECRET_KEY: eXl5Cg== # base64编码的Django SECRET_KEY

五、运维监控

  1. 健康检查:确保/health/接口返回200

  2. 日志收集

    1
    2
    3
    4
    5
    6
    7
    # 容器内日志直接输出到stdout
    containers:
    - name: django-app
    ...
    volumeMounts:
    - name: logs
    mountPath: /var/log/app
  3. 监控集成:部署Prometheus Operator+Grafana,监控Pod资源使用率和Django性能指标



Django项目k8s部署方案
http://example.com/2025/02/21/Django项目k8s部署方案/
作者
Sanli Ma
发布于
2025年2月21日
许可协议