安装要求
k8s环境: 使用kubeadm快速部署k8s
nginx-ingress-controller:k8s的ingress介绍和nginx-ingress的部署
jenkins:Ubuntu上安装Jenkins
Jenkins说明 这里Jenkins是直接装在物理机上的! 由于nginx-ingress
有一个配置controller.nginxStatus.port
,用来检测nginx状态的端口,默认是8080,而我们的nginx-ingress
的配置controller.hostNetwork=true
,共用了物理机的network namespace,所以会和jenkins的默认8080端口冲突。
这里修改jenkins默认端口
1 2 vim /etc/default/jenkins HTTP_PORT=8088
重启jenkins服务。
Django的k8s配置 新建Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 FROM registry.cn-shanghai.aliyuncs.com/lian_ns/python:3.6 MAINTAINER gaoyangENV TZ "Asia/Shanghai" COPY requirements.txt requirements.txt RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY ./test_dj /opt/test_dj WORKDIR /opt/test_dj ENTRYPOINT ["sh" ] CMD ["-h" ] EXPOSE 8000
将代码文件放入到镜像中,并安装pip包,这样方便管理代码版本。
创建Django的deployment资源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 apiVersion: apps/v1kind: Deploymentmetadata: name: testdj-rcspec: selector: matchLabels: name: testdj replicas: 1 template: metadata: labels: name: testdj spec: containers: - name: testdj image: registry.cn-shanghai.aliyuncs.com/lian_ns/test_dj:<BUILD_TAG> ports: - containerPort: 8000 command: ["/bin/sh" ] args: ["-c" , "python manage.py runserver 0.0.0.0:8000" ] env: - name: DEBUG value: '1' volumeMounts: - mountPath: /opt/ test_dj/log name: log volumes: - name: log hostPath: path: /var/ log/k8s/ test_dj
yaml文件说明:
<BUILD_TAG>
是为了在构建时借助git log
来管理版本
这里采用的启动方式是run server启动,后面可以改成uwsgi启动
并且将日志文件挂在出来
创建service资源 1 2 3 4 5 6 7 8 9 apiVersion: v1 kind: Service metadata: name: testdj-svc spec: selector: name: testdj ports: - port: 8000
创建ingress资源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: testdj-ing annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: testdj.codeeper.com http: paths: - path: / backend: serviceName: testdj-svc servicePort: 8000
现在k8s部分就配置完毕,下面来设置Jenkins部分。
Jenkins流水线设置 这里采用流水线工程来构建任务 需要先新建Jenkins文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 node { stage('Prepare' ) { echo 'Prepare...' checkout scm script { build_tag = sh(returnStdout: true , script: 'git rev-parse --short HEAD' ).trim() build_tag = "master-${build_tag} " image_name = "test_dj" } } stage('Test' ) { echo 'Testing...' } stage('Build' ) { echo 'Building...' sh "docker build -t ${image_name} :${build_tag} ." } stage('Deploy' ) { echo 'Deploying...' sh "sed -i 's/<BUILD_TAG>/${build_tag} /' ./k8s/deployment.yaml" sh "kubectl apply -f ./k8s/deployment.yaml --record" sh "kubectl apply -f ./k8s/ingress.yaml --record" sh "kubectl apply -f ./k8s/service.yaml --record" } }
这里将<BUILD_TAG>
替换为git log
获取的提交记录获取的tag,可以用于代码版本的管理,用来回退版本
jenkins页面配置
新建流水线任务
配置流水线
为了从git拉取镜像,需要配置Credentials
构建任务 点击立即构建,等待流水线构建完成。
可能遇见的问题
cannot connect to the Docker daemon. Is ‘docker daemon’ running on this host?: dial unix /var/run/docker.sock: connect: permission denied”
这是因为,Jenkins默认是用jenkins用户来执行命令的,而它没有docker的执行权限,
解决办法 可以将Jenkins加入root用户组:
1 2 gpasswd -a jenkins root service jenkins restart
the server doesn’t have a resource type “pods
解决办法 复制kubernetes的config到Jenkins的kube目录下
1 cp ~/.kube/config /var/lib/jenkins/.kube/
django项目文件 https://github.com/dougaoyang/jenkins_django