只需3步部署Django项目到Kubernetes上

2023-09-16 17:20:28

1. 目标

本文讲述了如何通过3步,把Django项目部署在K8S上。

本文适用读者:

  1. 了解Django项目的开发。
  2. 了解K8S的用途。

2. 具体步骤

把一个Django项目部署在Kubernete环境上,只需以下3步:

  1. 创建镜像
  2. 部署在Kubernetes环境上
  3. 配置MySQL

接下来我们依次讲述具体步骤。

3. 第一步:创建镜像

假设已有Django项目,并保存在文件夹django_app下,具体结构如下:

django_app
-- apps 
-- django_app
---- settings.py
---- urls.py
---- wsgi.py
-- manage.py 
-- Dockerfile # 镜像创建文件
-- .dockerignore # 镜像的忽略文件
-- requirement.txt # 依赖包文件

3.1 构建Dockerfile文件

使用Dockfile来创建镜像,内容如下:

FROM python:3.8-slim-bullseye
RUN pip install gunicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

WORKDIR /app
COPY requirements.txt .

RUN pip install -r /app/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY django_app/ /app/

EXPOSE 80/tcp
ENTRYPOINT gunicorn -w 4 -b 0.0.0.0:80 django_app.wsgi

从基础镜像python:3.8 开始,安装gunicorn,创建工程目录app,复制requirements文件,接着安装依赖库(使用清华源),然后把项目里的文件都拷贝到工程路径app下,接着暴露80端口,最后使用gunicorn命令启动服务。

注意:由于国内更新pip比较慢,所以在制作镜像的过程中对pip临时更换到了清华源。

3.2 建立.dockerignore文件

项目里有些文件比如pyc等一些临时文件不需要复制到镜像中,我们只需把他们添加到.dockerignore里,就可以避免这些文件被打包到镜像里。

建立.dockerignore文件,内容如下:

*/*.zip
*/*.sh
*/*.pyc
*/__pycache__*

*.zip
*.sh
*.pyc
__pycache__
env/

3.3 构建镜像

运行命令构建镜像:

docker build -t django-example:v1.0 .

注意: 命令的末尾有个.符号

接着我们会看到如下输出:

image-20230914230345118.png

3.4 验证镜像

我们通过浏览器访问镜像里的服务的方式来验证镜像是否构建成功。

首先,使用运行镜像:

sudo docker run django-example:v1.0

接着,查看容器ID:

sudo docker ps -ls 

输出如下:

2.png

查看该容器对应的IP:

sudo docker inspect 890200dd1d12

输出如下:

3.png

复制IPAddress的输出172.17.0.2到浏览器的地址栏,看看能否访问到服务。

四. 第二步:部署在Kubernetes环境上

Kubernetes 中最小的对象是Pod,它是运行的容器的镜像,一个副本集包含多个Pod,利用副本集对外提供服务。这里我们只需创建一个具有1个的Pod副本集。

4.1 部署副本集

创建django-example_initial.yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: django-example
  labels:
    app: django-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: django-example
  template:
    metadata:
      labels:
        app: django-example
    spec:
      containers:
      - name: web-app
        image: django-example:v1.0
        ports:
        - containerPort: 80

接着运行命令:

kubectl apply -f django-example_initial.yaml

这样就创建了容器名为web-app的django-example镜像的副本集,副本集中只有1个Pod,并且暴露了80端口给外部。

检查部署是否成功:

kubectl get deploy

如果输出类似如下情况,表示部署成功

4.png

4.2 暴露部署程序

部署成功后,我们需要把部署的内容暴露成服务供大家能够使用,通过如下命令完成:

kubectl expose deployment django-example

4.3 访问部署程序

由于服务部署在Kubernetes上,我们需要找到服务映射出的地址,这样才能从外部访问到服务。

输入如下命令:

kubectl get services

看到如下输出:

5.png

这个CLUSTER-IP了吧,就是Kubernetes外可以访问的IP。打开浏览器,输入这个IP来验证下吧。

五. 第三步:配置MySQL

项目已经能在Kubernetes部署完成了,但是还不能正常使用数据库,要如何配置数据库呢?

5.1 在镜像中增加环境库

修改下之前的Dockfile:

FROM python:3.8-slim-bullseye
RUN apt update && apt install -y gcc libmariadb-dev-compat # 新增
RUN pip install gunicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

WORKDIR /app
COPY requirements.txt .

RUN pip install -r /app/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY django_app/ /app/

CMD sleep 5                       # 新增
CMD python manage.py migrate      # 新增

EXPOSE 80/tcp
ENTRYPOINT gunicorn -w 4 -b 0.0.0.0:80 django_app.wsgi

我们增加了mysql的依赖,并在镜像构建过程中增加了migrate的过程,之后重新构建镜像。

5.2 在项目中增加环境变量

修改原来settings.py里的MySQL部分:

import os

...

DATABASES = {
    'default': {
        'ENGINE': "django.db.backends.mysql",
        'NAME': 'Test',
        'USER': os.environ.get('MYSQL_USER', 'root'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD', 'xxxxx'),
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

...

利用os.environ.get()来获取对应的环境变量名称和数值。
注意: 环境变量里的数据类型都是字符串,我们需要在用到int的地方做转化。

在项目中增加.env文件:

MYSQL_USER=root
MYSQL_PASSWORD=xxxxx

这样settings里的os.environ.get()会读取.env里的环境变量。最后我们还需在Kubernetes把环境变量信息传递给.env文件。我们利用Kubernetes的保密字典来完成这一步。

5.2 通过保密字典设置环境变量

使用kubectl设置保密字典(Secrets)通常是管理Kubernetes集群中敏感信息的一种方法,比如API令牌、数据库密码等。

创建保密字典:

kubectl create secret generic my-secret --from-literal=MYSQL_USER=root --from-literal=MYSQL_PASSWORD=xxxxx

接着,我们要在Pod中使用保密字典,修改下之前创建的django-example_initial.yaml文件,增加环境变量信息:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: django-example
  labels:
    app: django-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: django-example
  template:
    metadata:
      labels:
        app: django-example
    spec:
      containers:
      - name: web-app
        image: django-example:v1.0
        env:
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: MYSQL_USER
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: MYSQL_PASSWORD
        ports:
        - containerPort: 80

好了,按照之前的步骤重新部署下就能成功MySQL了。

6 总结:

本文章通过3步完成了把一个Django项目部署到Kubernetes上。

具体包括:

  1. 创建镜像
  2. 部署在Kubernetes环境上
  3. 配置MySQL
更多推荐

【企业级SpringBoot单体项目模板】 —— 全局配置

😜作者:是江迪呀✒️本文关键词:SpringBoot、模版、企业级☀️每日一言:你坚持下来了,而别人坚持不下来,这就是你的资本。文章目录一、全局异常配置1.1全局异常处理1.2处理业务异常类1.3状态码枚举类1.3使用二、返回体配置2.1返回体类2.2抽象controller2.3使用上回我们创建了一个SpringB

XC3420B 低压降压IC 5V降3.3V 大电流降压IC 开关频率1.5MHZ

XC3420B是一个1.5MHz的恒定频率,电流模式降压转换器。它非常适合需要单节鲤离子电池提供高达2A电流的便携式设备,同时在峰值负载条件下仍能实现90%以上的效率。XC3420B也可以运行在100%的低压差操作占空比,延长便携式系统的电池寿命,而轻载操作提供了非常低的输出纹波噪声敏感的应用。XC3420B可提供高达

在月球上看地球和太阳是怎么转的?

文章目录参数初始化运动模型绝对坐标系以太阳和地球为中心以月球为坐标原点参数初始化众所周知,地球围绕太阳转,月球围绕地球转。但在地球上看,月亮和太阳都绕着地球转,那么如果我们是土生土长的月球人,我们看到的是谁绕着谁转呢?日地月就是典型的三体系统,其中太阳质量为1.989×1030kg1.989×10^{30}kg1.98

三维模型3DTile格式轻量化在网络传输中的重要性分析

三维模型3DTile格式轻量化在网络传输中的重要性分析三维模型3DTile格式轻量化在网络传输中扮演了至关重要的角色。随着数字化和虚拟化技术的发展,越来越多的应用需要通过网络来获取和分享大规模三维地理空间数据。但由于这类数据通常具有高精度和大尺度等特点,其数据量巨大,直接传输原始数据会消耗大量的网络带宽,严重影响传输效

Swift 5.9 有哪些新特性(二)

文章目录前言Noncopyable结构体和枚举结束变量绑定的生命周期makeStream()方法添加sleep(for:)到ClockDiscardingtaskgroups总结前言虽然Swift6已经在地平线上浮现,但5.x版本仍然有很多新功能-更简单的if和switch用法、宏、非可复制类型、自定义actor执行器

2603. 收集树中金币

给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处有一个金币。一开始,你需要选择树中任意一个节点出发。

Java 21 新特性:Record Patterns

RecordPatterns第一次发布预览是在JDK19、随后又在JDK20中进行了完善。现在,Java21开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。recordPoint(intx,inty){}staticvoidprintSum(Objectobj){if(objinstanceofPoint

1. 两数之和

目录给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],target=9输出:[0,1]

【python零基础入门学习】python进阶篇之时间表示方法和异常处理以及linux系统的os模块执行shell命令以及记账程序编写教学(一)

本站以分享各种运维经验和运维所需要的技能为主《python零基础入门》:python零基础入门学习《python运维脚本》:python运维脚本实践《shell》:shell学习《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战《k8》暂未更新《docker学习》暂未更新《ceph学习

从统计语言模型到预训练语言模型---神经网络语言模型

随着神经网络的发展,神经语言模型(NeuralNetworkLanguageModels,NNLM)展现出了比统计语言模型更强的学习能力,克服了N-gram语言模型的维度灾难,并且大大提升了传统语言模型的性能。神经网络先进的结构使其能有效的建模长距离上下文依赖,以词向量(WordEmbedding)为代表的分布式表示的

Windows 下 MySQL 8.1 图形化界面安装、配置详解

首先我们下载安装包官方下载链接:MySQL::BeginYourDownload网盘链接:https://pan.baidu.com/s/1FOew6-93XpknB-bYDhDYPw提取码:brys外网下载慢的同学可以使用上述网盘链接下载完成后我们双击安装包即可进入安装界面点击next勾选同意协议,点击next这里选

热文推荐