Jenkins+GitLba针对k8s集群持续集成
持续集成概念持续集成Continuous Integration持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并进程自动化测试持续交付Continuous Delivery持续交付指的是在持续集成的环境基础之上,将代码部署到预生产环境持续部署Continuous Deployment在持续交付的基础上,把部署到生产环境的过程自动化,持续部署和持续交...
持续集成概念
持续集成Continuous Integration
持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并进程自动化测试
持续交付Continuous Delivery
持续交付指的是在持续集成的环境基础之上,将代码部署到预生产环境
持续部署Continuous Deployment
在持续交付的基础上,把部署到生产环境的过程自动化,持续部署和持续交付的区别就是最终部署到生产环境是自动化的
环境准备
k8s集群环境,三台服务器,IP分别为:192.168.1.70(master)、50(node01)、40(node02)
Jenkins+GitLab部署在一台Docker服务器上(192.168.1.30),主要用于向仓库上传私有镜像
环境一共4台服务器,全部指向一个私有仓库,共享Docker镜像
实验所用到的软件都可以在网盘下载: 下载地址
提取码:trv8
验证k8s集群没有问题
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 64d v1.15.0
node01 Ready <none> 64d v1.15.0
node02 Ready <none> 64d v1.15.0
首先我们需要做一个registry私有仓库,可以选择任意一台服务器都可以,这里我们选择kubernetes-master作为registry私有仓库
Harbor也是可以的
[root@master ~]# docker run -d --restart=always -p 5000:5000 registry:2
[root@master ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.70:5000
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
#将nginx镜像上传到私有仓库
[root@master ~]# docker pull nginx
[root@master ~]# docker tag nginx:latest 192.168.1.70:5000/nginx:v1
[root@master ~]# docker push 192.168.1.70:5000/nginx:v1
node01、node02加入私有仓库,并拉去镜像
#注意实在那台机器上操作
[root@master ~]# scp /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
[root@master ~]# scp /usr/lib/systemd/system/docker.service node02:/usr/lib/systemd/system
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl restart docker
[root@node02 ~]# systemctl daemon-reload
[root@node02 ~]# systemctl restart docker
[root@node01 ~]# docker pull 192.168.1.70:5000/nginx:v1
[root@node02 ~]# docker pull 192.168.1.70:5000/nginx:v1
建立yaml配置文件让k8s自己控制容器集群,用来模拟我们部署的服务
[root@master ~]# vim nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: 192.168.1.70:5000/nginx:v1
imagePullPolicy: Always
ports:
- containerPort: 80
[root@master ~]# kubectl apply -f nginx.yaml
deployment.extensions/nginx created
[root@master ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 61s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-57b9fd468d-dn2v7 1/1 Running 0 29s
nginx-57b9fd468d-q5qm6 1/1 Running 0 29s
容器的ip只能在容器本机上访问,集群内的其他主机和集群外的主机都没办法访问,这个时候就需要将容器的端口映射到服务器上的端口了,所以需要做一个service的模板。service 模板可以将容器的端口映射到服务器的端口上,并且可以固定映射在服务器上的端口
[root@master ~]# vim nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 31234
selector:
name: nginx
[root@master ~]# kubectl apply -f nginx-svc.yaml
service/nginx created
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 64d
nginx NodePort 10.105.100.181 <none> 80:31234/TCP 6s
浏览器访问测试:192.168.1.70:31234
kubernetes完毕,开始配hijenkins+gitlab联动
基本环境准备
[root@localhost ~]# hostnamectl set-hostname autoweb
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]# vim /etc/selinux/config
SELINUX=disabled
[root@localhost ~]# bash
#加入私有仓库
[root@autoweb ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.70:5000
[root@autoweb ~]# systemctl daemon-reload
[root@autoweb ~]# systemctl restart docker
首先安装jenkins
#配置java环境
[root@autoweb ~]# tar zxf jdk-8u231-linux-x64.tar.gz
[root@autoweb ~]# mv jdk1.8.0_231 /usr/java #注意这里的位置,不要多一个“/”
#配置环境变量
[root@autoweb ~]# vim /etc/profile
#在最后一行添加以下内容
export JAVA_HOME=/usr/java
export JRE_HOME=/usr/java/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
#使环境变量生效
[root@autoweb ~]# source /etc/profile
#验证环境变量
[root@autoweb ~]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
部署tomcat,将jenkins的包放进tomcat里
[root@autoweb ~]# tar zxf apache-tomcat-7.0.54.tar.gz
[root@autoweb ~]# mv apache-tomcat-7.0.54 /usr/tomcat7
[root@autoweb ~]# cd /usr/tomcat7/webapps/
[root@autoweb webapps]# rm -rf *
[root@autoweb webapps]# cp /root/jenkins.war .
#修改tomcat的字符集
[root@autoweb webapps]# vim /usr/tomcat7/conf/server.xml
#在72行左右追加
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
#修改启动脚本,添加jenkins的家目录,这个很重要
[root@autoweb webapps]# cd /usr/tomcat7/bin/
[root@autoweb bin]# vim 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@autoweb bin]# ./catalina.sh start
[root@autoweb bin]# netstat -anput | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 6266/java
浏览器访问:192.168.1.30:8080/jenkins开始配置安装jenkins
根据提示查看密码并输入
[root@autoweb bin]# cat /data/jenkins/secrets/initialAdminPassword
7ea904846c9c4cfbb19d3e31d22f889f
左边是自动安装, 右边是自定义安装,如果不是这个画面则说明网络很卡或者没有网,网速可以的就选择左边的
由于网络问题,下载插件会非常慢,这里我就不下载,回到上一步,断网之后再点继续,跳过插件安装
断网之后,它会等待网络连接,过程有点慢,但是比自动下载插件快多了
在创建用户名密码的时候就可以联网了
然后一路默认就行
因为没有安装,所以就导入插件
插件存放目录:/data/jenkins/plugins
#将原来的插件目录删除
[root@autoweb jenkins]# rm -rf plugins/
#导入下载好的插件,并解压
[root@autoweb jenkins]# tar zxf plugins.tar.gz
#重新运行jenkins,让它自动识别新导入的插件
[root@autoweb bin]# ./catalina.sh stop
[root@autoweb bin]# ./catalina.sh start
使用浏览器重新访问
因为很多插件需要翻墙才可以继续下载,Jenkins还提供了代理的设置
设置插件的国内下载地址
在Jenkins插件管理-高级设置界面,定位到页面最底部中的【升级站点】模块,将对应URL输入框中的url的https修改为http,即http://updates.jenkins.io/update-center.json
,然后点击【提交】保存修改项
往下拉,找到插件管理
点击高级
还需要安装三个插件
因为在我导入的插件里就有这三个,所以不需要安装,如果选择推荐安装的可以搜索并安装这三个插件
点击可选插件,搜索GitLab就能找到,然后直接安装即可(搜索的时候注意大小写区分)
jenkis安装完成以后,再去安装gitlab
[root@autoweb ~]# yum -y install curl policycoreutils openssh-server openssh-clients postfix git
[root@autoweb ~]# systemctl enable sshd
[root@autoweb ~]# systemctl start sshd
[root@autoweb ~]# systemctl enable postfix
[root@autoweb ~]# systemctl start postfix
安装gitlab-ce
[root@autoweb ~]# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
因为网络问题,就不使用这种方式,国内的用户,使用清华大学的镜像进行安装
#编写yum源
[root@autoweb ~]# vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key
#将gitlab源加入yum
[root@autoweb ~]# yum makecache
#下载安装gitlab,这个软件包有点大,需要点时间
[root@autoweb ~]# yum -y install gitlab-ce
修改端口防止端口冲突,默认是80端口,unicorn默认是8080 也是tomcat的端口
[root@autoweb ~]# vim /etc/gitlab/gitlab.rb
#在29行左右的地方进行修改和追加
external_url 'http://192.168.1.30:90'
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 3000
启动gitlab,这个过程可能会有点慢
[root@autoweb ~]# gitlab-ctl reconfigure
浏览器访问:192.168.1.30:90
设置密码登录gitlab
默认用户名是root
jenkins:工具集成平台
gitlab:软件托管平台
部署这两个服务的联动,需要经过ssh验证
首先我们需要在gitlab上绑定jenkins服务器的ssh公钥,因为是在同一台服务器上,所以就自己给自己绑定,这里我们使用的是root用户的公私钥,切记生产环境是不允许随便用root的
[root@autoweb ~]# ssh-keygen -t rsa #一路回车即可
#复制公钥
[root@autoweb ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0PGtK/uFWejdLYfEqEGiimWrpndlkMZMNyvMisdCvWYU2E2UKxpr/h/QCZQpgpe7uAPZpivnsu3XZ4pE4qe7WG4iKEqF6oVmJL9JjmNh86vOUDGttOU3aZJnLp95yoYczBUSObNsSAzkHIMR2u0Zk5nFW2Roe2FHNUyj0e2qM/Zm5+M5EVgpHd9UG5A4Z/Loid/got6Xaufoen1hSFY+S18QPuheN1auaTfnyA0wwf+rlWjqwCLJeUBl0PgOgNNyZ27++U6QBUPNwgC3SVdhbJMCFE9/H2+0aMnjVqnakfJmt95UI/QOJAmnrusps/XPbqdnxZ5u89i97QxuogAgL root@autoweb
在gitlab上导入公钥
新建一个代码仓库
输入一个仓库的名字 权限选择公共的(public)然后直接点击创建
点击新建一个new.file
写入代码,起一个名字然后保存
将项目克隆到本地测试是否可用
[root@autoweb ~]# git clone git@192.168.1.30:root/test.git
[root@autoweb ~]# cd test/
[root@autoweb test]# ls
index.html
[root@autoweb test]# cat index.html
print: "hello world!!!"
测试没有问题
打开jenkins,新建任务
地址粘贴进去后没有报错则没错
下面的这个插件很重要,就是他实现自动化更新的webhook插件,安装过了就会有这条,然后点击这条下面出来的这些东西保持默认就行。同时注意复制
这个里面写的是jenkins构建时候会执行的shell脚本,这个是最重要的,就是他实现了下端kubernetes自动更新容器的操作
代码内容
#!/bin/bash
backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER"
mkdir -p $backupcode
chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*
rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode
echo From 192.168.1.70:5000/nginx:v1 > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/share/nginx/html/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 192.168.1.70:5000/nginx:v1
docker build -t 192.168.1.70:5000/nginx:v1 /"$JENKINS_HOME"/workspace/.
docker push 192.168.1.70:5000/nginx:v1
ssh root@192.168.1.70 kubectl delete deployment nginx
ssh root@192.168.1.70 kubectl apply -f /root/nginx.yaml
复制地址去gitlab上绑定webhook
保存,登录gitlab,点击下图这个设置
将复制的地址粘贴
往下拉,去掉ssh验证,添加webhook
出现报错,提示本地连接不了,因为gitlab默认设置不允许想自己发送web hook
解决办法
保存之后重试,成功的如下图所示
测试jenkins与gitlab连通
403报错的,解决办法
回到Jenkins开启匿名访问权限
点击全局安全配置
保存之后再点击系统设置
去掉勾选
保存之后,回到gitlab上再次测试
出现蓝条说明jenkins已经连通gitlab
jenkins和gitlab 都已经互相的ssh通过了,然后我们最后需要做的一个ssh是关于jenkins
这里是从autoweb向master节点做免密登录
[root@autoweb ~]# ssh-copy-id root@192.168.1.70
环境全部部署完毕!!!开始测试
立即构建
构建完成之后查看网页的变化
回到Gitlab更新代码测试
通过web hook这个插件会自动识别代码的更新,然后自动构建保证实时同步,持续集成
再次查看网页的变化
构建的历史版本的存放目录:/data/backcode/test
[root@autoweb test]# pwd
/data/backcode/test
[root@autoweb test]# ls
1 2 3 4 5
#还有一个关键的目录,这个目录下是将新代码构建成镜像的关键,他和上个目录实时同步
[root@autoweb workspace]# pwd
/data/jenkins/workspace
[root@autoweb workspace]# ls
Dockerfile test
构建的历史版本的存放目录:/data/backcode/test
[root@autoweb test]# pwd
/data/backcode/test
[root@autoweb test]# ls
1 2 3 4 5
#还有一个关键的目录,这个目录下是将新代码构建成镜像的关键,他和上个目录实时同步
[root@autoweb workspace]# pwd
/data/jenkins/workspace
[root@autoweb workspace]# ls
Dockerfile test
测试完成
关于 kubernetes 还有好几种集群管理方法,我们这次用的 deployment模板 就是其中之一, 其他的还有pod 模板 和 rc 模板, 这些都是功能很强大的集群调度模板。 还有更多功能待开发
更多推荐
所有评论(0)