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

news2024/11/25 0:22:03

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux命令查看谁在使用服务器的GPU

命令:查看GPU使用情况 nvidia-smi 可以知悉GPU占用情况和主要使用GPU的进程,如下图所示: 实时查看gpu使用: nvidia-smi -l 1 表示每隔1s刷新一下,数字可更改。 查看进程的归属者 方法一:ps -f -p pid…

360极速浏览器X终极奥义之——更改划词工具条的搜索为百度搜索 2023更新版

原文为2019版本,具体已失效,2023更新。 1.需要将 https://www.so.com/s?q%s&src360csex_zoned字符串对应的十六进制码替换为 https://www.baidu.com/s?wd%s&src360csex_z对应的十六进制码。 2.需要删除后面的"oned"以保证转换出来…

冒泡排序~

1、对应长度len 数组,需要进行 len -1 趟冒泡,每趟冒泡,将最大(小)元素排列到最后无序位置 2、每趟冒泡从第一个元素开始,邻近两两比较,找出最大元素 每一趟冒泡,都进行元素交换&am…

基于频谱信息的图像去噪与恢复——使用约束最小二乘方滤波法

大家好,我是带我去滑雪! 随着科学技术的不断发展,信息的交流和获取已不再受到时空的限制,已经成为人们日常生活中不可或缺的一部分。图像作为人类信息交流中的重要载体,起着不可替代的作用。频谱图像去噪复原方法是一种…

Hive【Hive(一)DDL】

前置准备 需要启动 Hadoop 集群,因为我们 Hive 是在 Hadoop 集群之上运行的。 从DataGrip 或者其他外部终端连接 Hive 需要先打开 Hive 的 metastore 进程和 hiveserver2 进程。 Hive DDL 数据定义语言 1、数据库(database) 创建数据库 c…

YOLOv8『小目标』检测指南

前言 目前博主课题组在进行物体部件的异常检测项目,项目中需要先使用 YOLOv8 进行目标检测,然后进行图像切割,最后采用 WinCLIP 模型 进行部件异常检测 但是在实际操作过程中出现问题, YOLOv8 模型目标检测在大目标精确度不错&a…

Vue的详细教程--入门

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Vue是什么 二. Vue的特点及优势 三.使用…

IT运维:利用数据分析平台采集Windows event log数据

概述 本文将介绍如何借助Winlogbeat和Vector在鸿鹄里采集Windows event log数据,使技术人员能够在鸿鹄里更便捷和高效地分析Windows event log数据。 操作步骤 Winlogbeat是一个开源的日志数据采集器,专门用于采集Windows操作系统中的event log数据。它可…

【JAVA数据结构】包装类与认识泛型

作者主页:paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精…

解决 Cannot read property ‘key‘ of undefined

目录 问题解决1解决2最终 问题 现场环境分页查询某些条件项查询时,分页接口获取成功但是数据不渲染,页面像是卡住了: 报错 Cannot read property key of undefined 解决1 有人说 使用的el-pagination在格式化代码的时候layout属性的参数会多加…

vue基础知识十一:Vue组件之间的通信方式都有哪些?

一、组件间通信的概念 开始之前,我们把组件间通信这个词进行拆分 组件通信 都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,…

Gin 框架 解决 跨域问题

Gin 框架解决跨域问题 一点废话 在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的,然后又刚好会一点点 go,就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json 。 这是我的go代码…

堡垒机的相关介绍

描述 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时处理及审…

javafx学习记录

1.布局 2.选择重写或实现方法(select methods to override/implements) ctrl o 3.javafx有init方法,start方法,stop方法 4.定义一个按钮,使用系统默认浏览器访问网站 5.使窗口的关闭栏,缩小扩屏栏,代码是倒数第二行 6.设置模态窗口,默认关闭模态的 下…

Leetcode 剑指Offer

求 12...n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 示例 1: 输入: n 3 输出: 6示例 2: 输入: n 9 输出: 45 一、信息 1.求一个等差数列的求和 2.要求不能使…

dubbo3 遇坑小结

最近给一个dubbo3的应用改名字,发现消费者还是会请求以前的地址。 问题现象 应用部署是k8s容器环境,dubbo版本是3.1.1,应用appA名字改成appB。改完名发现消费者应用appC请求还是会往以前的地址请求(当然是请求不通的) 问题分析 分析日志 d…

算法|Day52 单调栈3

LeetCode 84.柱状图中最大的矩形 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状…

【LeetCode-简单题 KMP匹配算法】28. 找出字符串中第一个匹配项的下标

文章目录 题目方法一:常规做法 一次一次截取再做比较方法二:KMP匹配算法 题目 方法一:常规做法 一次一次截取再做比较 class Solution {public int strStr(String haystack, String needle) {int haylen haystack.length();int neelen need…

【二叉树】的顺序存储(堆的实现)

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

【学习笔记】各类基于决策单调性的dp优化

文章目录 对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类 与图形相结合 决策单调性的常见优化手段二分队列二分栈分治类莫队做法 SMAWKWQS二分WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分…