使用k8s部署Django项目的方法步骤


Posted in Python onJanuary 14, 2019

接触了一下docker和k8s,感觉是非常不错的东西。能够方便的部署线上环境,而且还能够更好的利用机器的资源,感觉是以后的大趋势。最近刚好有一个基于django的项目,所以就把这个项目打包到docker里面,放到k8是里面运行,顺便学习下k8s和docker的使用。

docker

为什么使用docker?

我觉得docker最大的好处是部署的时候比较方便,一个预先打包好的docker镜像,可以在任何安装有docker的机器上面直接运行,不用再安装其他任何的依赖环境。不管是在开发、测试、还是发布阶段,都能节省很多安装依赖和配置文件的时间,真正做到了Build once, Run anywhere。

docker在我的项目中怎么使用?

在我的项目中,我主要使用dockerfile来生成项目的镜像。我们都知道docker是按照层的思想来构建一个镜像的,我的镜像的最底层的操作系统使用的是centos7,再接着安装python相关的工具和库,然后安装项目所需求的库,最后再把项目拷到镜像中。

FROM centos:7

ENV LC_ALL=en_US.utf-8 LANG=en_US.utf-8
RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm && \
 yum install -y python36u python36u-libs python36u-devel python36u-pip mysql-devel gcc which && \
 pip3.6 install pipenv

COPY Pipfile Pipfile.lock /my_app/
WORKDIR /my_app
RUN pipenv sync

COPY my_app_site /my_app/my_app_site
COPY gunicorn_config.py /my_app/gunicorn_config.py
COPY resource/nginx.conf /my_app/resource/nginx.conf

RUN mkdir /static/ && \
 cd my_app_site && \
 pipenv run python manage.py collectstatic && \
 cd my_app_site && \
 rm -f local_settings.py

WORKDIR /my_app

EXPOSE 8000
CMD pipenv run gunicorn my_app_site.wsgi -c gunicorn_config.py --log-file logs/gunicorn.log

在dockerfile中,每个RUN命令都会构建新的层,我这边之所以在dockerfile中使用三个RUN命令,是为了能够尽量的减少重复的构建过程。每次在构建镜像的时候docker都会判断每层的内容是否有修改,如果没有修改的话,就不需要重复的构建。所以在应用开发的过程中,上面的dockerfile最多也就重新构建最后一层和倒数第二层(在项目有新包加入的时候才重新构建倒数第二层,不然正常情况下就只会重新构建最后一层)。

k8s

为什么使用k8s?

k8s的功能非常强大。不过简单的来说,k8s是用来管理容器的一个工具。有了k8s以后我们就能让k8s自动的去拉取docker镜像,并且根据需要来启动、关闭、调度docker容器,实现一些牛逼的自动化运维操作。

k8s在我的项目中怎么使用?

我使用了yaml文件定义了一个k8s部署,下面是具体的文件示例:

# ------------------- MyApp Deployment ------------------- #

kind: Deployment
apiVersion: apps/v1beta2
metadata:
 labels:
 k8s-app: my_app
 name: my_app
spec:
 replicas: 2
 revisionHistoryLimit: 10
 selector:
 matchLabels:
 k8s-app: my_app
 template:
 metadata:
 labels:
 k8s-app: my_app
 spec:
 volumes:
 - name: nginx-config
 emptyDir: {}
 - name: static-dir
 emptyDir: {}
 containers:
 - name: my_app-web
 image: my_app:latest
 ports:
 - containerPort: 8000
  protocol: TCP
 volumeMounts:
 - name: nginx-config
  mountPath: /etc/nginx/conf.d/
 - name: static-dir
  mountPath: /usr/share/nginx/html/my_app/static
 command: ["/bin/sh"]
 args: ["-c", "cp resource/nginx.conf /etc/nginx/conf.d/ && \
  cp /static/* /usr/share/nginx/html/my_app/static -rf && \
  pipenv run gunicorn my_app.wsgi -c gunicorn_config.py"]
 - name: my_app-nginx
 image: nginx:1.15.8
 ports:
  - containerPort: 8899
  protocol: TCP
 volumeMounts:
  - name: nginx-config
  mountPath: /etc/nginx/conf.d/
  - name: static-dir
  mountPath: /usr/share/nginx/html/my_app/static
 livenessProbe:
  httpGet:
  scheme: HTTP
  path: /
  port: 8899
  initialDelaySeconds: 30
  timeoutSeconds: 30
---

# ------------------- MyApp Service ------------------- #

kind: Service
apiVersion: v1
metadata:
 labels:
 k8s-app: my_app
 name: my_app
spec:
 ports:
 - port: 8899
 targetPort: 8899
 selector:
 k8s-app: my_app
 type: NodePort

django项目在部署的时候需要用到nginx服务器,所以在部署的时候我在同一个pod里面也加入了一个nginx镜像,不过为了少打包一个新的nginx镜像(带有nginx配置文件和静态文件的nginx镜像),我在两个容器之间使用volumes来共享django静态文件和nginx配置文件。

总结

以上就是我使用docker和k8s来部署django项目的一个示例,文章里面没有包含一些具体的docker和k8s的介绍,是因为这些内容比较多,在这篇小文章里面放不下,感兴趣的同学可以去他们官网详细了解。最后我只想说,docker和k8s真是好东西,没有用过的同学赶紧去试试吧!希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现ftp客户端示例分享
Feb 17 Python
Python中的作用域规则详解
Jan 30 Python
python自定义类并使用的方法
May 07 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
Python爬虫工程师面试问题总结
Mar 22 Python
python代码 输入数字使其反向输出的方法
Dec 22 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 #Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 #Python
用Python实现大文本文件切割的方法
Jan 12 #Python
python实时获取外部程序输出结果的方法
Jan 12 #Python
python实现控制台打印的方法
Jan 12 #Python
python 自定义对象的打印方法
Jan 12 #Python
python设定并获取socket超时时间的方法
Jan 12 #Python
You might like
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
JavaScript立即执行函数的三种不同写法
2014/09/05 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
js中new一个对象的过程
2017/02/20 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
vue上传图片组件编写代码
2017/07/26 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
Python读取MRI并显示为灰度图像实例代码
2018/01/03 Python
Python星号*与**用法分析
2018/02/02 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
2014年统战工作总结
2014/12/09 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
欢迎新生标语2015
2015/07/16 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
Python道路车道线检测的实现
2021/06/27 Python
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技