安装要求

  1. k8s环境: 使用kubeadm快速部署k8s
  2. nginx-ingress-controller:k8s的ingress介绍和nginx-ingress的部署
  3. 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 gaoyang
ENV 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/v1
kind: Deployment
metadata:
name: testdj-rc
spec:
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页面配置

  1. 新建流水线任务
  2. 配置流水线 为了从git拉取镜像,需要配置Credentials

构建任务

点击立即构建,等待流水线构建完成。

可能遇见的问题

  1. 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
  1. 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