- k8s集群环境(我这里是三台的K8s集群);
- 单独一台docker服务器,主要用于向私有仓库上传镜像,Jenkins和gitlab也部署在这台服务器;
- 上述环境共计服务器4台,均指向同一个私有仓库,以便共享docker镜像;
- 服务器IP依次为192.168.20.二、20.三、20.四、20.5(前三个IP为K8s集群中的节点)
Jenkins采用war包的方式部署,须要用到tomcat环境,自行参考博文,进行部署;
其余环境部署能够参考如下博文:
Tomcat安装及优化配置;
Docker的安装详细配置;
K8s(Kubernetes)简介及安装部署。html
注:如下用到的全部包文件,均可以从个人网盘连接中下载。java
任意能够运行docker容器的节点部署便可。这里我选择在192.168.20.5这台主机。node
[root@jenkins ~]# docker run -tid --name registry --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry registry
#选择任意一个节点进行如下操做 [root@jenkins ~]# vim /usr/lib/systemd/system/docker.service #修该下面的配置项,以便指定其私有仓库的监听地址 ExecStart=/usr/bin/dockerd -H unix:// --insecure-registry 192.168.20.5:5000 #将修改后的配置文件发送到其余节点 [root@jenkins ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.2:/usr/lib/systemd/system/ [root@jenkins ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.3:/usr/lib/systemd/system/ [root@jenkins ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.4:/usr/lib/systemd/system/
如下操做,须要在每一个节点依次进行配置。nginx
[root@jenkins ~]# systemctl daemon-reload [root@jenkins ~]# systemctl restart docker
在部署Jenkins以前,自行部署tomcat服务,参考博文:Tomcat安装及优化配置。git
部署Jenkins所须要的源码包及插件,能够从个人网盘连接中下载。web
[root@jenkins src]# cd /usr/local/tomcat/webapps/ #删除原来的网页目录下全部内容(根据实际状况来定,最好作个备份) [root@jenkins webapps]# rm -rf * [root@jenkins webapps]# rz #上传Jenkins的war包 [root@jenkins webapps]# ls jenkins.war #指定Jenkins的家目录 [root@jenkins webapps]# vim ../bin/catalina.sh #编辑此文件 #!/bin/sh #在文件开头该行下面添加便可 export CATALINA_OPTS="-DJENKINS_HOME=/data/jenkins" export JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.ClassicPluginStrategy.noBytecodeTransformer=true" #启动tomcat [root@jenkins webapps]# cd ../bin/ [root@jenkins bin]# ./catalina.sh start #肯定端口在监听 [root@jenkins bin]# netstat -anpt | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 58560/java
要想实现Jenkins的CI/CD,必须有GitLab、GitLab HOOK、Git Lab Authentication这三个插件,国内不太好下载这几个插件,在我上面的网盘连接中有打包好的插件,直接解压到对应目录便可。docker
浏览器访问如下tomcat服务的IP+端口/Jenkins,如:192.168.20.5:8080/jenkins,便可看到以下界面(访问前最好先断掉外网,不然在输入密码后,会让在线安装插件,比较慢,并且颇有可能安装失败):shell
自行根据提示查看密码并粘贴到相应位置,以下,查看密码:vim
[root@jenkins webapps]# cat /data/jenkins/secrets/initialAdminPassword ed0a933859e0470f9095680a2059c19a
输入密码后,等待片刻,而后点击以下:api
建立相应用户:
登陆成功后,以下:
如今关闭浏览器页面,对Jenkins添加插件:
[root@jenkins src]# rm -rf /data/jenkins/plugins/ #删除原来的空目录 [root@jenkins src]# tar zxf plugins.tar.gz -C /data/jenkins/ #重启tomcat以便生效 [root@jenkins src]# /usr/local/tomcat/bin/catalina.sh stop [root@jenkins src]# /usr/local/tomcat/bin/catalina.sh start
再次访问Jenkins的web界面:
能够看到已经变成了中文页面,说明插件配置生效,以下:
想了想,仍是懒得再截图写了,参考我以前的博文来部署gitlab吧,我也是看那个博文部署的(在安装gitlab后,先别接着操做,须要看下面的注意事项,进行更改监听端口),最后保证能够将远端的库克隆到本地便可,我这里将gitlab和Jenkins部署在同一台服务器。参考博文:持续集成之Gitlab安装与应用
注意事项!!!
在安装gitlab后,须要更改其监听端口(防止端口冲突),以下:
[root@jenkins src]# vim /etc/gitlab/gitlab.rb #更改以下 external_url 'http://192.168.20.5:90' unicorn['listen'] = '192.168.20.5' #本机IP unicorn['port'] = 3000
更改完成监听端口后,再按照那个博文进行接下来的操做便可(可是端口和那篇博文已经不同了,好比查询端口有没有再监听,应该看的是90端口而不是80端口了,访问浏览器页面也是,须要加90端口)。
最后保证本地有克隆的库便可,以下:
[root@jenkins ~]# ls -d teset01/ teset01/
将如下shell脚本内容粘贴到web界面,脚本以下:
#脚本中的IP,192.168.20.5为私有仓库的IP,192.168.20.2为k8s集群中master的IP地址 #!/bin/bash backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER" #这里引用了Jenkins的默认变量 mkdir -p $backupcode chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/* rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode echo From 192.168.20.5:5000/nginx > "$JENKINS_HOME"/workspace/Dockerfile echo COPY ./"$JOB_NAME"/* /usr/share/nginx/html/ >> "$JENKINS_HOME"/workspace/Dockerfile docker rmi 192.168.20.5:5000/nginx docker build -t 192.168.20.5:5000/nginx /"$JENKINS_HOME"/workspace/. docker push 192.168.20.5:5000/nginx ssh root@192.168.20.2 kubectl delete deployment nginx ssh root@192.168.20.2 kubectl apply -f /root/nginx.yaml
脚本填写后,以下:
脚本填写后,先别保存,根据如下操做复制一下Jenkins的地址,以下:
如下操做,在新建的库中进行,我忘了截切换到新建库的那一步的图了:
保存后,下拉页面,便可看到新添加的web-hook,点击以下,进行测试:
返回状态码200,则表示配置无误,以下:
jenkins服务器配置以下:
[root@jenkins ~]# ssh-copy-id root@192.168.20.2 #上面的IP为K8s群集中master节点IP
#向私有仓库上传所需镜像 [root@jenkins ~]# docker tag nginx:latest 192.168.20.5:5000/nginx:latest [root@jenkins ~]# docker push 192.168.20.5:5000/nginx:latest #在master节点上面运行nginx资源对象 [root@master ~]# vim nginx.yaml #编写yaml文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx spec: replicas: 2 template: metadata: labels: name: nginx spec: containers: - name: nginx image: 192.168.20.5:5000/nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: labels: name: nginx name: nginx spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 31234 selector: name: nginx [root@master ~]# kubectl apply -f nginx.yaml #执行yaml文件 [root@master ~]# kubectl get pod | grep nginx #肯定容器运行正常 nginx-76645bc84f-rbgtl 1/1 Running 0 68s nginx-76645bc84f-s6xp6 1/1 Running 0 68s
#在克隆到本地的库中上传文件到gitlab [root@jenkins ~]# cd teset01/ [root@jenkins teset01]# git config --global user.name "test" [root@jenkins teset01]# git config --global user.email "test@test.com" [root@jenkins teset01]# echo "test ....." > index.html [root@jenkins teset01]# git add * [root@jenkins teset01]# git commit -m "Test CI/CD" [root@jenkins teset01]# git push origin master
在进行上述操做后,便可在Jenkins新建的任务中,看到构建成功的信息,以下:
再次访问nginx首页,发现已经变成了咱们在gitlab上提交的内容,以下:
测试完成。
附加:历史版本内容存放路径以下:
[root@jenkins data]# pwd #肯定当前路径 /data [root@jenkins data]# tree backcode/ #这个目录下记录的是历史版本的代码 backcode/ └── test-01 ├── 1 │ └── README.md ├── 2 │ ├── a.html │ └── README.md ├── 3 │ └── README.md ├── 4 │ ├── a.html │ └── README.md ├── 5 │ └── README.md └── 6 ├── index.html └── README.md [root@jenkins workspace]# pwd #再次肯定当前路径 /data/jenkins/workspace [root@jenkins workspace]# ls #此目录下是将新代码构建成镜像的关键所在,Dockersfile就在这个目录下 Dockerfile test-01