持续集成概念

持续集成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 模板, 这些都是功能很强大的集群调度模板。 还有更多功能待开发

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐