其实这个搞这个就因为一点小事,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 编译出来的镜像名:$BUILD_NUMBER -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 编译出来的镜像名
                        '''
                    }
                }


            }
        }
    }
}

 

 7.部署k8s,这里我使用的rancher来将K8S起来的

机器上先安装docker的client

docker run -d -v <主机路径>:/var/lib/rancher/ --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:stable的  

https://ip地址

 

8.进入rancher,做一个集群,公司比较穷我是用3个台式机组的集群

django+uwsgi+docker+k8s+jenkins

 

9.到集群中创建一个项目和命名空间,当然也可以用default,但别用system的,里面东西多

 

10.找一台jenkins的节点机,配好kubectl

django+uwsgi+docker+k8s+jenkins

12.如果镜像仓库有权限 记得加入镜像仓库凭证

django+uwsgi+docker+k8s+jenkins

 

 

 

13.创建一个部署编排

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: 应用名,可随便
  namespace: 命名空间
spec:
  replicas: 2 节点机数量
  template:
    metadata:
      labels:
        key:label  标签或者注释 随便填写
    spec:
      containers:
        - name: workstationjenkins
          image: 镜像:latest
          imagePullPolicy: Always#每次都啦镜像
          volumeMounts:
            - name: host-time#时区
              mountPath: /etc/localtime
          ports:
            - containerPort: 8000#内部映射端口
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
      imagePullSecrets:
        - name: 镜像仓库凭证 如果有的话

 

 14.

持续集成关于K8S的编排命令,因为我的镜像是基于jenkins job的构建编号做的tag,所以直接把lasted改成对应的邮件编号就行了,并且直接通过kuberctl运行起来

 sed \'s#镜像:latest#\'镜像:$BUILD_NUMBER\'#\' jenkins-deployment.yaml|kubectl apply -f -

 

workloads就完成配置了,但现在镜像却并没有提供对外的端口,接下来就是吧服务开放出去

 django+uwsgi+docker+k8s+jenkins

 

 

15.点击到服务发现里面,添加一个dns记录,点击创建(非必须步骤)

django+uwsgi+docker+k8s+jenkins

取个服务名,选下命名空间,选择刚创建的workloads

django+uwsgi+docker+k8s+jenkins

 

16.创建负载均衡和对外链接

django+uwsgi+docker+k8s+jenkins

 取个名字,选择命名空间,决定下生成后的访问域名(貌似怎么都是HTTPS的),选择服务或者workloads(这里如果选workloads,上一步就可以不做)

django+uwsgi+docker+k8s+jenkins

17生成链接以后点击就可以访问打开啦