gitlab+jenkins+docker+k8s,CI/CD持续集成方案
阅读原文时间:2021年04月21日阅读:1

此处不阐述gitlab jenkins k8s harbor 安装过程

jenkins和gitlab相互关联

jenkins:工具集成平台
gitlab: 软件管理平台

部署这两个服务的联动,需要经过ssh验证。

1、首先我们需要在gitlab上绑定jenkins服务器的ssh公钥,这里我们使用的是root用户的公私钥,切记生产环境是不允许随便用root的

(1)jenkins

[root@jenkins ~]# ssh-keygen -t rsa 

//然后不输入只回车会生成一对公私钥
默认在/root/.ssh/目录里

[root@jenkins ~]# cat /root/.ssh/id_rsa.pub 
//查看公钥并复制
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMA4+je3NsxZrF2v8TPLXJp1ejwy1YokXipEFyGVNo5IbtkiBDwBLOAl5i7yromY8YGgoNNriE2g89IM/44BGC5UDCokQ69Ze9Ta9Kynv3/1PDFXIABJJG0f6LsUqt0nKFaFoGz3ZuYAnl6AzLpXEic8DBDrsFk+UGrxvMfSEqHlYO2b7jRXE1HGRnqI/IcVB190cLT1kmBKi7hSqUNBc1cY6t3a6gGiBpp9tc8PW4r/RcLblhAL1LKx8x37NOZkqox8IMh3eM/wtWwAVFlI8XU+sz9akzJOVmd1ArT5Q4w8WA/uVHCDUGVI/fli/ZRv+mNZyF3EH26runctb5LkCT root@jenkins

(2)gitlab


在这里放刚才拷贝的公钥保存就行了。

我们先在gitlab上创建一个代码仓库 点击 new project

输入一个仓库的名字,权限选择私有的(Private)然后直接点击创建

点击新建一个new.file

写入代码,起一个名字然后保存

创建好了,然后在本地测试一下是否可用

使用git clone git@youIP:guohs/tomcat.git

(3)自动构建

安装插件
先进入到之前查看插件的地方
系统设置----插件管理—可用插件—搜索安装需要的插件gitlab-oauth、gitlab-plugin、 windows-slaves、ruby-runt ime、gitlab-hook

(4)打开jenkins 点击新建


地址粘贴进去以后没有报错则没错

如有类似报错 是因为密钥认证关系

在gitlab的主机上生成ssh密钥对

[root@jenkins ~]# ssh-keygen -t rsa 
//然后不输入只回车会生成一对公私钥
[root@jenkins ~]# cat /root/.ssh/id_rsa   
//查看密钥并复制




下面的这个插件很重要,就是他实现自动化更新的webhook插件,安装过了就会有这条,然后点击这条下面出来的这些东西保持默认就行。同时注意复制

这个里面写的是jenkins构建时候会执行的shell脚本,这个是最重要的,就是他实现了下端kubernetes自动更新容器的操作。


#!/bin/bash
backupcode="/data/$JOB_NAME/$BUILD_NUMBER"  
mkdir -p $backupcode     #jenkins创建上述目录
chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*
rsync -acP   "$JENKINS_HOME"/workspace/"$JOB_NAME"/*  $backupcode #$JENKINS_HOME和$JOB_NAME同步最新消息
#ssh root@200.200.100.71 sed -i 's/v1/v2/g' /data/deploy.yaml #更改镜像版本
echo From  tomcat/jdk:8 > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/local/apache-tomcat-8.5.38/webapps/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 200.200.100.83/web/tomcat:v1
docker build -t 200.200.100.83/web/tomcat:v1 /"$JENKINS_HOME"/workspace/.
docker push 200.200.100.83/web/tomcat:v1


为k8s集成项目

$JOB_NAME:项目名称

$BUILD_NUMBER:第几次构建

$JENKINS_HOME:jenkins的家目录

完事以后先别保存,首先复制一下上面的jenkins地址,然后去gitlab上绑定webhook


保存,登陆gitlab,点击下图这个设置




测试显示下图 的蓝条说明jenkins 已经连通了gitlab

好了,jenkins和gitlab 都已经互相的ssh通过了,然后我们最后需要做的一个ssh是关于jenkins
///注意,这里是从git和jenkins向master节点做免密登录。

配置私有库地址

这个参数只能在docker.service或者daemon.json其中一个配置文件中。

vim /usr/lib/systemd/system/docker.service

 vim /etc/docker/daemon.json

添加"insecure-registries":[“200.200.100.83”]中harbor主机设置的登录域名,这里的insecure参数如果是写在/usr/lib/systemd/system/docker.service中,如上面harbor主机那样,那么就直接修改/usr/lib/systemd/system/docker.service中该项配置即可,

systemctl daemon-reload
systemctl restart docker
docker-compose start    //启动harbor服务

创建secret文件

刚开始完k8s,总会遇到很多坑,因为是开源项目,版本总在更新,所以要时刻关注自己使用的版本有哪些不一样的命令和参数。
本次采坑是想让k8s可以在建立pod时可以到私库中拉取镜像。根据官网或网上资料,可以通过创建secret记录私库鉴权信息。具体做法如下:
首先在其中一个node上登录私有仓库(docker 访问私库的配置,这里不做描述)

docker login 200.200.100.83

登录成功后会在/root/.docker目录下生产config.json文件,然后执行如下命令:

cat /root/.docker/config.json | base64 -w 0

该命令会将你的认证信息通过base64编码,生成一个编码之后的字符串。

在kubernetes中的master节点中创建secret.yaml:

apiVersion: v1
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIyMDAuMjAwLjEwMC44MyI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZaM1Z2TkRJNSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTkuMDMuOCAobGludXgpIgoJfQp9
kind: Secret
metadata:
  name: harbor-registry  ##自定义名字后面Deployment中引用
type: kubernetes.io/dockerconfigjson

在kubernetes中的master节点创建secret:

kubectl create -f secret.yaml

查看secret是否创建:

kubectl get secret

之后在创建其他元素的时候指定:imagesPullSecrets即可。
例如:

pod:
apiVersion: v1
kind: Pod
metadata:
name: redis-test
containers:

name: redis-test
image: my.registry/redis
imagePullSecrets:
name: myregistrykey

至此是网上和官网提供的可以让k8s启动pod时访问私库的方法。
很多人也是可以使用,但由于k8s一直在更新版本,网上很多资料都是建立在旧版本基础上进行验证,在新版本中一些参数有变更。
本次采坑就是在于编辑secret元素时type和date参数有变动,从k8s 1.8之后,kubernetes.io/dockercfg就变成kubernetes.io/dockerconfigjson,相对应 .dockercfg也变成.dockerconfigjson,所以在使用k8s 1.8以后版本创建secret时,元素要变成如下:

data:
.dockerconfigjson : ewoJImF1dGhzIjogewoJCSJidXMuZ2EiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2WVdSdGFXNHhOVGszTlRNPSIKCQl9Cgl9Cn0=
type: kubernetes.io/dockerconfigjson

不然在创建完secret后,pod启动会报需要验证或者找不到镜像的错误,而无法正常使用镜像。

创建deployment文件

#vim  deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      imagePullSecrets:
      - name: harbor-registry    ##此处引用上面secret创建的名字
      containers:
      - image: 200.200.100.83/web/tomcat:v1
        imagePullPolicy: Always
        name: web


kubectl apply -f deployment.yaml


创建svc文件

#vim deployment-svc.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    name: web
  name: web
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 31234
  selector:
    name: web


kubectl apply -f deployment-svc.yaml

部署Kubernetes 应用

部署应用的流程

1.编写代码
2.测试
3.编写 Dockerfile
4.构建打包 Docker 镜像
5.推送 Docker 镜像到仓库
6.编写 Kubernetes YAML 文件
7.更改 YAML 文件中 Docker 镜像 TAG
8.利用 kubectl 工具部署应用