软件环境: Jenkins + Kubernetes + Git + Maven + Harbor
工做流程:手动/自动构建 -> Jenkins 调度 K8S API ->动态生成 Jenkins Slave pod -> Slave pod 拉取 Git 代码/编译/打包镜像 ->推送到镜像仓库 Harbor -> Slave
工做完成,Pod 自动销毁 ->部署到测试或生产 Kubernetes平台 。java
https://192.168.1.25/harbornode
192.168.1.25nginx
Jenkins-Slave:做用是缓解master上的负载压力git
master 分派任务(job)给Jenkins-Slave 完成工做github
参考文档:https://github.com/jenkinsci/docker-jnlp-slavedocker
[root@docker jenkins-salve]# ls
dockerfile-jenkins-slave jenkins-slave settings.xml slave.jarshell
settings.xml:maven的配置文件,获取jar包的地址变为阿里云,原先的apache地址下载很慢apache
一、[root@docker jenkins-salve]# docker build -t test.com/library/jenkins-salve -f dockerfile-jenkins-slave .
二、docker push test.com/library/jenkins-salve:latestjson
首先要建立pv --》managed-nfs-storage
一、kubectl apply -f rbac.yaml
1)必需要让k8s认证仓库,即master上建立获取镜像的权限
生成密钥:参考 https://blog.csdn.net/xukangkang1hao/article/details/80839834
二、[root@docker jenkins]# kubectl apply -f jenkins.yml
端口:30009 是node的端口
50000 是slave用到的端口
initialDelaySeconds 60 能够设置为系统彻底启动起来所需的最少时间,这里是1分钟,60秒
1)查看下pvc有无建立
2)查看下pod有无启动
3)访问-->能够看到这个pod分配在了哪一个node上
http://192.168.1.24:30009
三、slave须要凭据来管理Kubernetes,由于slave来进行部署上线的,这样就会分配pod
而slave是分配在了node上,这就须要node管理Kubernetes
参考如下生成的admin证书
http://blog.itpub.net/28624388/viewspace-2151773/
1)[root@docker master-ca]# pwd
/data/k8s/master-ca
2)[root@docker master-ca]# cat admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo":"rsa",
"size":2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
3)生成 admin 证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
4)拷贝admin.pem admin-key.pem 到/root/k8s-cert 下
5)[root@docker k8s-cert]# sh kubeconfig.sh
6)将如下拷贝到任意一个主机node上
scp /opt/kubernetes/bin/kubectl config 192.168.1.23:~
7)登陆到192.1681.23上
[root@docker ~]# ./kubectl get nodes --kubeconfig=config ;./kubectl get pods --kubeconfig=config
8)受权成功
9)这个配置文件要放到jenkins上集成
四、设置jenkins
1)在系统管理---》插件管理--》Advanced--》更改成http
http://updates.jenkins.io/update-center.json
2)安装插件
Kubernetes Continuous Deploy
Kubernetes
3)安装完成后,系统管理---》系统设置---》Cloud
Kubernetes 地址 :https://kubernetes.default #这个就是dns解析,根据svc匹配
必定要测试是否成功
4)保存
五、搭建git仓库
1)先登陆到192.168.1.24 下载源码
[root@docker ~]# git clone https://github.com/lizhenliang/tomcat-java-demo.git
2)登陆到192.168.1.25建立git仓库
3)192.168.1.24 更改git提交仓库,再将代码提交到这个仓库中
4)192.168.1.24 上 执行:git push origin master
5)在192.168.1.23上拉去代码
git clone git@192.168.1.25:/home/git/java-demo
六、jenkins上建立项目--》pipeline
1)准备好2个文件
deploy.yaml
Jenkinsfile
2)Repository URL :git仓库地址 git@192.168.1.25:/home/git/java-demo
3)须要在node上建立一个认证,这个只是jenkins自己链接仓库获取jenkinsfile的,只在任意一台node上认证就能够
ssh-keygen
ssh-copy-id git@192.168.1.25
ssh git@192.168.1.25
4)添加 Credentials
cat /root/.ssh/id_rsa --》私钥
5)保存
七、更改凭据
1)更改credentialsId 、url git仓库
2)添加jenkins部署发布到k8s的凭据
将以上生成的id更改成pipeline上的id
更改下管理k8s的id:
提交到git仓库,并打Tag
[root@docker java-demo]# git add .
[root@docker java-demo]# git commit -m 'deploy'
[root@docker java-demo]# git tag 1.0
[root@docker java-demo]# git push origin 1.0
[root@docker java-demo]# git push origin master #必需要推送到master上,由于在jenkins上定义的是master分支的
八、安装插件
Extended Choice Parameter
Git Parameter
九、jenkins配置参数化构建
1)这个要开启,如果禁用则连不上slave
TCP port for JNLP agents 50000 ,就是jenkins链接 slave的默认端口
2)设置tag的变量
3)构建发布
4)由于这种是每次自动启一个slave的pod分配job,因此每次maven编译都要下载jar包,这里就耽误了几分钟时间,建议slave用物理机单独部署,缓存jar包,就不用每次都下载jar包
5)initialDelaySeconds 60 启动还须要等待一分钟,后续能够改小一点
6)还能够设置命名空间
选择后会在(Jenkinsfile)pipeline上用到
十、回滚
#查看发布历史
kubectl rollout history deployment/nginx
#查看指定版本对应的Deployment的API对象细节
kubectl rollout history deployment/nginx --to-revision=3
#回滚到上一个版本
kubectl rollout undo deployment/nginx
#回滚到指定版本号
kubectl rollout undo deployment/nginx --to-revision=3
#查看部署状态
kubectl rollout status deployment/nginx
十一、jenkins上建立回滚的job
一、建立
二、须要将jenkins中的pod ssh 192.168.1.13上
1)ssh-keygen
2)ssh-copy-id root@192.168.1.13
3)ssh root@192.168.1.13 'kubectl get pods'
4)更改matser 192.168.1.13上的
三、执行shell脚本
echo $project && echo $Namespace
ssh root@192.168.1.13 "kubectl rollout undo deployment $project -n $Namespace"
四、回滚到上一个版本