django+uwsgi+docker+k8s
Posted edwar172038
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django+uwsgi+docker+k8s相关的知识,希望对你有一定的参考价值。
其实这个搞这个就因为一点小事,django的日志无法按日期切分
原来方式都是直接用manage.py runserver的,听取了同事的建议开始准备使用uwsgi来搞
1.安装uwsgi
pip install uwsgi
2.django新增一个uwsgi的配置文件
[uwsgi] http = :端口 socket = /tmp/名字随意.sock #这里文件夹必须要全部权限 chdir = /code #工作路径 wsgi-file = 项目路径/wsgi.py processes = 4 threads = 2 stats = 127.0.0.1:9191 #不知道干啥用的,但如果一台服务器上有2个站点,这个的端口号必须不一样 否则会报错 vacuum= true
配置项解释:
- http : 协议类型和端口号
- processes : 开启的进程数量
- workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
- chdir : 指定运行目录(chdir to specified directory before apps loading)
- wsgi-file : 载入wsgi-file(load .wsgi file)
- stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
- threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
- master : 允许主进程存在(enable master process)
- daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
- pidfile : 指定pid文件的位置,记录主进程的pid号。
- vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
配置完成后可在linux上试试是否能正常启动,启动命令
uwsgi --ini uwsgi.ini
3.整理自己项目的requirements.txt,上手没怎么关心过这块,后面发现部署docker的时候真心是太累了,以后一定会坚持维护。。。
4.创建一个dockerfile文件
FROM 基础镜像 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD . /code/ RUN pip install -r requirements.txt RUN python manage.py collectstatic --noinput CMD ["/bin/sh","run.sh"]
我的基础镜像有专门默认装了一些工具,比如django,request,uwsgi等
5.创建一个启动文件run.sh,路径要和dockerfile中的路径对应
uwsgi --ini uwsgi.ini
6.部署jenkins,我写的是pipeline
pipeline { agent none environment { result_info = "Info: " } options { timeout(time: 5, unit: ‘MINUTES‘) retry(1) } stages { stage(‘git_build‘) { agent { label ‘master_linux‘ } steps { git branch: ‘master‘, credentialsId: ‘jenkins的git登录用户‘, url: ‘git路径‘ sh ‘‘‘ docker build -t 编译出来的镜像名 -f Dockerfile . ‘‘‘ sh ‘‘‘ docker push 编译出来的镜像名 docker rmi 编译出来的镜像名 ‘‘‘ } } stage(‘deploy‘) { parallel { stage(‘deploy‘) { agent { label ‘服务器label‘ } steps { sh ‘‘‘ docker pull 编译出来的镜像名 ‘‘‘ script{ def return_code = sh(returnStatus:true, script:‘‘‘ docker stop 容器名 docker rm 容器名 ‘‘‘) echo ‘return_code‘+return_code if (return_code == 0) { result_info += "succuss. " } else { result_info += "fail. " } } sh ‘‘‘ docker run -d --name 容器名 --net=host -v /var/log/workstation_jenkins:/code/log -v /tmp:/tmp -v /etc/localtime:/etc/localtime --hostname=localhost 编译出来的镜像名 ‘‘‘ } } } } } }
K8S编排本身以调通,还有点小问题 近期会补上
以上是关于django+uwsgi+docker+k8s的主要内容,如果未能解决你的问题,请参考以下文章
在 Docker 上使用 Nginx、uWSGI 和 Postgres 配置 Django