jinkens+gitlab针对k8s集群实现CI/CD

一、环境准备

  • k8s集群环境(我这里是三台的K8s集群);
  • 单独一台docker服务器,主要用于向私有仓库上传镜像,Jenkins和gitlab也部署在这台服务器;
  • 上述环境共计服务器4台,均指向同一个私有仓库,以便共享docker镜像;
  • 服务器IP依次为192.168.20.2、20.3、20.4、20.5(前三个IP为K8s集群中的节点)

Jenkins采用war包的方式部署,需要用到tomcat环境,自行参考博文,进行部署;
其他环境部署可以参考以下博文:
Tomcat安装及优化配置
Docker的安装详细配置
K8s(Kubernetes)简介及安装部署

注:以下用到的所有包文件,都可以从我的网盘链接中下载

二、部署registry私有仓库

任意可以运行docker容器的节点部署即可。这里我选择在192.168.20.5这台主机。

1、运行私有仓库容器

[[email protected] ~]# docker run -tid --name registry --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry registry

2、配置各个服务器指向私有仓库

#选择任意一个节点进行以下操作
[[email protected] ~]# vim /usr/lib/systemd/system/docker.service
#修该下面的配置项,以便指定其私有仓库的监听地址
ExecStart=/usr/bin/dockerd -H unix:// --insecure-registry 192.168.20.5:5000
#将修改后的配置文件发送到其他节点
[[email protected] ~]# scp /usr/lib/systemd/system/docker.service   192.168.20.2:/usr/lib/systemd/system/
[[email protected] ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.3:/usr/lib/systemd/system/
[[email protected] ~]# scp /usr/lib/systemd/system/docker.service 192.168.20.4:/usr/lib/systemd/system/

3、每个节点依次重启docker服务,使更改生效

以下操作,需要在每个节点依次进行配置。

[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker

三、部署Jenkins服务并启动

在部署Jenkins之前,自行部署tomcat服务,参考博文:Tomcat安装及优化配置

部署Jenkins所需要的源码包及插件,可以从我的网盘链接中下载

[[email protected] src]# cd /usr/local/tomcat/webapps/
#删除原来的网页目录下所有内容(根据实际情况来定,最好做个备份)
[[email protected] webapps]# rm -rf *
[[email protected] webapps]# rz       #上传Jenkins的war包
[[email protected] webapps]# ls
jenkins.war
#指定Jenkins的家目录
[[email protected] 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
[[email protected] webapps]# cd ../bin/
[[email protected] bin]# ./catalina.sh start
#确定端口在监听
[[email protected] bin]# netstat -anpt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      58560/java          

四、配置Jenkins服务

要想实现Jenkins的CI/CD,必须有GitLab、GitLab HOOK、Git Lab Authentication这三个插件,国内不太好下载这几个插件,在我上面的网盘链接中有打包好的插件,直接解压到对应目录即可。

1、配置Jenkinsweb界面

浏览器访问以下tomcat服务的IP+端口/Jenkins,如:192.168.20.5:8080/jenkins,即可看到如下界面(访问前最好先断掉外网,否则在输入密码后,会让在线安装插件,比较慢,而且很有可能安装失败):

自行根据提示查看密码并粘贴到相应位置,如下,查看密码:

[[email protected] webapps]# cat /data/jenkins/secrets/initialAdminPassword
ed0a933859e0470f9095680a2059c19a

输入密码后,等待片刻,然后点击如下:

创建相应用户:

登录成功后,如下:

现在关闭浏览器页面,对Jenkins添加插件:

2、配置所需插件

[[email protected] src]# rm -rf /data/jenkins/plugins/   #删除原来的空目录
[[email protected] src]# tar zxf plugins.tar.gz -C /data/jenkins/
#重启tomcat以便生效
[[email protected] src]# /usr/local/tomcat/bin/catalina.sh stop
[[email protected] src]# /usr/local/tomcat/bin/catalina.sh start

再次访问Jenkins的web界面:

可以看到已经变成了中文页面,说明插件配置生效,如下:

五、部署gitlab服务

想了想,还是懒得再截图写了,参考我之前的博文来部署gitlab吧,我也是看那个博文部署的(在安装gitlab后,先别接着操作,需要看下面的注意事项,进行更改监听端口),最后保证可以将远端的库克隆到本地即可,我这里将gitlab和Jenkins部署在同一台服务器。参考博文:持续集成之Gitlab安装与应用

注意事项!!!

在安装gitlab后,需要更改其监听端口(防止端口冲突),如下:

[[email protected] 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端口)。

最后保证本地有克隆的库即可,如下:

[[email protected] ~]# ls -d teset01/
teset01/

六、配置Jenkins创建一个任务

将以下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 [email protected] kubectl delete deployment nginx
ssh [email protected] kubectl apply -f /root/nginx.yaml

脚本填写后,如下:

脚本填写后,先别保存,根据以下操作复制一下Jenkins的地址,如下:

七、开启Jenkins的匿名访问权限

八、回到gitlab上开启允许向自己发送web hook

以下操作,在新建的库中进行,我忘了截切换到新建库的那一步的图了:

保存后,下拉页面,即可看到新添加的web-hook,点击如下,进行测试:

返回状态码200,则表示配置无误,如下:

九、配置Jenkins免密登录k8s群集的master节点

jenkins服务器配置如下:

[[email protected] ~]# ssh-copy-id [email protected]
#上面的IP为K8s群集中master节点IP

九、测试持续CI/CD效果

1、k8s群集中运行nginx资源对象

#向私有仓库上传所需镜像
[[email protected] ~]# docker tag nginx:latest 192.168.20.5:5000/nginx:latest
[[email protected] ~]# docker push 192.168.20.5:5000/nginx:latest
#在master节点上面运行nginx资源对象
[[email protected] ~]# 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
[[email protected] ~]# kubectl apply -f nginx.yaml     #执行yaml文件
[[email protected] ~]# kubectl get pod | grep nginx    #确定容器运行正常
nginx-76645bc84f-rbgtl   1/1     Running   0          68s
nginx-76645bc84f-s6xp6   1/1     Running   0          68s

2、客户端访问nginx

3、在gitlab进行版本的更新迭代测试

#在克隆到本地的库中上传文件到gitlab
[[email protected] ~]# cd teset01/
[[email protected] teset01]# git config --global user.name "test"
[[email protected] teset01]# git config --global user.email "[email protected]"
[[email protected] teset01]# echo "test ....." > index.html
[[email protected] teset01]# git add *
[[email protected] teset01]# git commit -m "Test CI/CD"
[[email protected] teset01]# git push origin master 

在进行上述操作后,即可在Jenkins新建的任务中,看到构建成功的信息,如下:

再次访问nginx首页,发现已经变成了我们在gitlab上提交的内容,如下:

测试完成。

原文地址:https://blog.51cto.com/14154700/2455283

时间: 2024-08-30 06:17:41

jinkens+gitlab针对k8s集群实现CI/CD的相关文章

使用kubeadm部署k8s集群01-初始化

使用kubeadm部署k8s集群01-初始化 2018/1/3 节点配置 master x3 OS version: centos7 swapoff ### 阿里云默认:off hosts ### 每个节点上配置: [[email protected] ~]# cat /etc/hosts ### k8s master @envDev 10.10.9.67 tvm-00 10.10.9.68 tvm-01 10.10.9.69 tvm-02 Docker version: latest(17.0

【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像

本文将介绍如何使用kubectl列举K8S集群中运行的Pod内的容器镜像. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同. 0x00 准备工作 需要有一个K8S集群,并且配置好了kubectl命令行工具来与集群通信.如果未准备好集群,那么你可以使用Minikube创建一个K8S集群,或者你也可以使用下面K8S环境二者之一: Katacoda Play with Kubernetes 如果需要查看K8S版本信息,可以输入指令kubectl version. 在本练习中,我们将使

使用kubeadm部署k8s集群00-缓存gcr.io镜像

使用kubeadm部署k8s集群00-缓存gcr.io镜像 2018/2/7 原因:kubeadm init 时,需要下载一些镜像,但国内网络原因,大家懂的,不容易下载,此时,只能去绕过它.备注:官方在 1.5 收到阿里一位童鞋的 PR 来允许指定一个第三方的 registry 来解决上述问题,但因为时间所限,并未找到具体的操作方法. [在国外节点上操作] 镜像来源 针对下述镜像: gcr.io/google_containers/kube-apiserver-amd64:v1.9.0 gcr.

K8S集群中部署jenkins

本文介绍在k8s环境中进行jenkins server的部署和配置.Jenkins是一个开源的.功能强大的持续集成和持续构建工具,采用master和salve架构,我们通过将jenkins集成环境部署在k8s集群中,可以实现jenkins slave按需创建.动态的伸缩.同时也提供了在k8s环境中应用的持续部署解决方案. 一.准备docker镜像文件 1.编译jenkins server docker镜像,默认的jenkis镜像已包含jdk,版本为1.8.0_171 # cat dockerfi

kubernetes系列03—kubeadm安装部署K8S集群

1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm 安装kubernetes(本文演示的就是此方法) 优点:你只要安装kubeadm即可:kubeadm会帮你自动部署安装K8S集群:如:初始化K8S集群.配置各个插件的证书认证.部署集群网络等.安装简易. 缺点:不是自己一步一步安装,可能对K8S的理解不会那么深:并且有那一部分有问题,自己不好修正. 1.3.2 方法2:二进制安装部署k

kubernetes生态--交付prometheus监控及grafana炫酷dashboard到k8s集群

由于docker容器的特殊性,传统的zabbix无法对k8s集群内的docker状态进行监控,所以需要使用prometheus来进行监控: 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本. 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prom

同一k8s集群中多nginx ingress controller

同一k8s集群中多nginx ingress controller同一k8s集群中,若有多个项目(对应多个namespace)共用一个nginx ingress controller,因此任意注册到ingress的服务有变更都会导致controller配置重载,当更新频率越来越高时,此controller压力会越来越大,理想的解决方案就是每个namespace对应一个nginx ingress controller,各司其职. NGINX ingress controller提供了ingress

k8s集群之kubernetes-dashboard和kube-dns组件部署安装

说明 最好先部署kube-dns,有些组合服务直接主机用hostname解析,例如redis主从,heapster监控组件influxdb.grafana之间等. 参考文档 https://greatbsky.github.io/KubernetesDoc/kubernetes1.5.2/cn.html 安装集群文档见: http://jerrymin.blog.51cto.com/3002256/1898243 安装PODS文档见: http://jerrymin.blog.51cto.com

k8s集群之日志收集EFK架构

参考文档 http://tonybai.com/2017/03/03/implement-kubernetes-cluster-level-logging-with-fluentd-and-elasticsearch-stack/ https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch https://t.goodrain.com/t/k8s/242 http://logz