k8s集群部署nfs+gitlab+Jenkins持续集成

一.概述

GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运行各种自动化构建、测试或部署任务。所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率自动运行测试、构建和部署的任务,帮组开发团队更高效的集成和发布代码。
在这里插入图片描述
下面是我最近安装GitLab+Jenkins环境的一个过程,记录下来,以备日后参考。

另外,这篇文章虽然很长,讲得很琐碎,但是仍有未能描述清楚的地方,如果按照这篇文章未能搭建成功,请耐心分析,也可从官方文档找找灵感,继续下去总会成功的。

环境
操作系统ip地址角色访问地址
centos 7.6192.168.1.240Jenkinshttp://192.168.1.240:9000
centos 7.6192.168.1.251GitIabhttp://192.168.1.240:9000

Jenkins 安装教程,请参考链接
https://blog.csdn.net/m0_46168595/article/details/108335403

二.部署GitLab

1.为什么搭建nfs服务器?

因为我们要使用nfs作为持久化存储,创建的pv后端存储时需要nfs,所以需要搭建nfs服务。

2.安装nfs服务

选择自己的任意一台机器,我选择k8s的master1节点,对应的机器ip是192.168.0.6,在192.168.0.6上执行如下步骤,大家在自己环境找一台k8s节点的机器安装就可以了~

(1) 安装nfs
yum install nfs-utils -y
systemctl start nfs
chkconfig nfs on
(2)在master1上创建一个nfs共享目录
mkdir  /data/v3   -p
mkdir  /data/v4
mkdir  /data/v5

vim  /etc/exports
/data/v3     192.168.1.0/24(rw,no_root_squash)
/data/v4     192.168.1.0/24(rw,no_root_squash)
/data/v5     192.168.1.0/24(rw,no_root_squash)

exportfs -arv   #使配置文件生效
systemctl restart nfs
(3)k8s的各个node节点也需要安装nfs
yum install nfs-utils -y
systemctl start nfs
chkconfig nfs on

创建安装gitlab需要的pv和pvc

1.创建一个名称空间

kubectl create ns kube-ops

2.创建gitlab需要的pv和pvc

vim pv_pvc_gitlab.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlabt
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Delete
  nfs:
    server: 192.168.1.251  #这个就是nfs服务端的机器ip,也就是k8s的master1节点ip
    path: /data/v5
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: gitlabt
  namespace: kube-ops
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

通过kubectl apply更新yaml文件

kubectl apply -f pv_pvc_gitlab.yaml

查看pv和pvc是否绑定

kubectl get pvc -n kube-ops

显示如下,说明绑定成功了

NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data      Bound    data      20Gi       RWX                           4h14m
3.创建postsql的pv和pvc
vim pv_pvc_postsql.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: postsql
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Delete
  nfs:
    server: 192.168.1.251
    path: /data/v4
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postsql
  namespace: kube-ops
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

通过kubectl apply更新yaml文件

kubectl apply -f pv_pvc_postsql.yaml

查看pv和pvc是否绑定

kubectl get pvc -n kube-ops

显示如下,说明postsql的pvc和pv绑定成功了

NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
gitlabt   Bound    gitlabt     10Gi         RWX                      4h17m
postsql   Bound    postsql     10Gi         RWX                      4h15m
4.创建redis的pv和pvc
vim  pv_pvc_redis.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: data
spec:
  capacity:
    storage: 20Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Delete
  nfs:
    server: 192.168.1.251
    path: /data/v3
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: data
  namespace: kube-ops
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi

通过kubectl apply更新yaml文件

kubectl apply -f  pv_pvc_redis.yaml

查看pv和pvc是否绑定

kubectl get pvc -n kube-ops

显示如下,说明gitlab的pvc和pv绑定成功了

NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data      Bound    data      20Gi       RWX                           4h14m
gitlabt   Bound    gitlabt   10Gi       RWX                           4h17m
postsql   Bound    postsql   10Gi       RWX                           4h15m

安装postgresql服务

vim  gitlab-postgresql.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql
  namespace: kube-ops
  labels:
    name: postgresql
spec:
  selector:
    matchLabels:
       name: postgresql
  template:
    metadata:
      name: postgresql
      labels:
        name: postgresql
    spec:
      containers:
      - name: postgresql
        image: sameersbn/postgresql:10
        imagePullPolicy: IfNotPresent
        env:
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: passw0rd
        - name: DB_NAME
          value: gitlab_production
        - name: DB_EXTENSION
          value: pg_trgm
        ports:
        - name: postgres
          containerPort: 5432
        volumeMounts:
        - mountPath: /var/lib/postgresql
          name: data
        livenessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: postsql
---
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: kube-ops
  labels:
    name: postgresql
spec:
  ports:
    - name: postgres
      port: 5432
      targetPort: postgres
  selector:
    name: postgresql

通过kubectl apply更新yaml文件

 kubectl apply -f gitlab-postgresql.yaml

查看postgresql是否部署成功

kubectl get pods -n kube-ops

显示如下,说明postgresql部署成功

NAME                          READY   STATUS    RESTARTS   AGE
postgresql-79f85cdfb4-klfb7   1/1     Running   0          4h20m

安装gitlab需要的redis服务

vim  gitlab-redis.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: kube-ops
  labels:
    name: redis
spec:
  selector:
    matchLabels:
      name: redis
  template:
    metadata:
      name: redis
      labels:
        name: redis
    spec:
      containers:
      - name: redis
        image: sameersbn/redis
        imagePullPolicy: IfNotPresent
        ports:
        - name: redis
          containerPort: 6379
        volumeMounts:
        - mountPath: /var/lib/redis
          name: data
        livenessProbe:
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: kube-ops
  labels:
    name: redis
spec:
  ports:
    - name: redis
      port: 6379
      targetPort: redis
  selector:
    name: redis

通过kubectl apply更新yaml文件

 kubectl apply -f gitlab-redis.yaml

查看postgresql是否部署成功

kubectl get pods -n kube-ops

显示如下,说明redis部署成功

NAME                          READY   STATUS    RESTARTS   AGE
postgresql-79f85cdfb4-klfb7   1/1     Running   0          4h20m
redis-56c8dc76cd-pr22g        1/1     Running   0          4h17m

安装gitlab服务

vim  gitlab.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gitlab
  namespace: kube-ops
  labels:
    name: gitlab
spec:
  selector:
    matchLabels:
        name: gitlab
  template:
    metadata:
      name: gitlab
      labels:
        name: gitlab
    spec:
      containers:
      - name: gitlab
        image: sameersbn/gitlab:11.8.1
        imagePullPolicy: IfNotPresent
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: GITLAB_TIMEZONE
          value: Beijing
        - name: GITLAB_SECRETS_DB_KEY_BASE
          value: long-and-random-alpha-numeric-string
        - name: GITLAB_SECRETS_SECRET_KEY_BASE
          value: long-and-RANDOM-ALPHA-NUMERIc-string
        - name: GITLAB_SECRETS_OTP_KEY_BASE
          value: long-and-random-alpha-numeric-string
        - name: GITLAB_ROOT_PASSWORD
          value: admin321
        - name: GITLAB_ROOT_EMAIL
          value: 19xxxxxxxx@qq.com
        - name: GITLAB_HOST
          value: 192.168.0.6
        - name: GITLAB_PORT
          value: "30852"
        - name: GITLAB_SSH_PORT
          value: "32353"
        - name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
          value: "true"
        - name: GITLAB_NOTIFY_PUSHER
          value: "false"
        - name: GITLAB_BACKUP_SCHEDULE
          value: daily
        - name: GITLAB_BACKUP_TIME
          value: 01:00
        - name: DB_TYPE
          value: postgres
        - name: DB_HOST
          value: postgresql
        - name: DB_PORT
          value: "5432"
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: passw0rd
        - name: DB_NAME
          value: gitlab_production
        - name: REDIS_HOST
          value: redis
        - name: REDIS_PORT
          value: "6379"
        ports:
        - name: http
          containerPort: 80
        - name: ssh
          containerPort: 22
        volumeMounts:
        - mountPath: /home/git/data
          name: data
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 180
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: gitlabt
---
apiVersion: v1
kind: Service
metadata:
  name: gitlab
  namespace: kube-ops
  labels:
    name: gitlab
spec:
  ports:
    - name: http
      port: 80
      targetPort: http
      nodePort: 30852
    - name: ssh
      port: 22
      nodePort: 32353
      targetPort: ssh
  selector:
    name: gitlab
  type: NodePort

通过kubectl apply更新yaml文件

kubectl apply -f gitlab.yaml

查看postgresql是否部署成功

NAME                          READY   STATUS    RESTARTS   AGE
gitlab-7d5f6bb557-bdkf9       1/1     Running   0          37m
postgresql-79f85cdfb4-klfb7   1/1     Running   0          4h20m
redis-56c8dc76cd-pr22g        1/1     Running   0          4h17m

查看gitlab在宿主机暴露的端口

kubectl get svc -n kube-ops

显示如下:

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                     AGE
gitlab       NodePort    10.0.0.130   <none>        80:30852/TCP,22:32353/TCP   4h3m
postgresql   ClusterIP   10.0.0.119   <none>        5432/TCP                    4h24m
redis        ClusterIP   10.0.0.20    <none>        6379/TCP                    4h21m

我们在浏览器访问k8s的master1节点的IP:30852即可访问到gitlab web界面
在这里插入图片描述
第一次登陆,我们需要点击注册Registry
在这里插入图片描述
完成注册并登陆显示如下:
在这里插入图片描述

3.安装Git
1.移除旧版本git centos自带Git,7.x版本自带git 1.8.3.1(应该是,也可能不是),

安装新版本之前需要使用yum remove git卸载(安装后卸载也可以)。

git --version    ## 查看自带的版本git version 1.8.3.1
yum remove git   ## 移除原来的版本
2.安装所需软件包
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel 

gcc-c++ perl-ExtUtils-MakeMaker
3.下载git的压缩包并进行解压

git安装包下载地址
https://mirrors.edge.kernel.org/pub/software/scm/git/

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.5.tar.gz

tar xf git-2.7.3.tar.gz
4.配置编译安装
cd git-2.19.5

make configure

./configure --prefix=/usr/git ##配置目录

make profix=/usr/git

make install
5.加入环境变量
echo "export PATH=$PATH:/usr/git/bin" >> /etc/profile

source /etc/profile
6.检查版本
git --version

三.GitLab+Jenkins持续集成

1.使用GitLab创建一个项目

点击 Create a project
在这里插入图片描述
创建 test 项目
在这里插入图片描述
添加 README 文件
在这里插入图片描述
输入内容,点击确定
在这里插入图片描述
效果如下:
在这里插入图片描述

2.创建jenkins用户

点击扳手按钮
在这里插入图片描述
点击 User
在这里插入图片描述
添加 jenkins 用户,点击最下面的Create user按钮。
在这里插入图片描述
点击编辑
在这里插入图片描述

修改密码,这里我定义的是 admin321
在这里插入图片描述

3.设置jenkins 用户ssh秘钥

点击 Impersonate ,表示冒充jenkins 用户
在这里插入图片描述
点击设置
在这里插入图片描述
左侧点击 ssh keys
在这里插入图片描述
登录到jenkins服务器,生成秘钥

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

查看公钥

cat /root/.ssh/id_rsa.pub

将公钥内容复制到网页,点击添加秘钥
在这里插入图片描述

4.创建Access Tokens

点击左侧的Access Tokens,输入用户 jenkins,勾选权限,点击创建
在这里插入图片描述
复制token,待会 jenkins 设置时,会用到。Zzis8ALsiYuytsg2GH-5
在这里插入图片描述
点击退出
重新登录root用户,点击test

点击设置-成员
在这里插入图片描述
添加jenkins 用户,这样就可以访问项目了
在这里插入图片描述

5.jenkins 安装Git,GitLab插件

由于 jenkins安装时,勾选了推荐安装的插件,因此包含了git插件。

现在只需要安装gitlab插件即可

点击 Manage Jenkins --> Manage Plugins -->可选插件,搜索gitlab

勾选gitlab,点击直接安装
在这里插入图片描述
等待十几分钟
在这里插入图片描述
提示安装完成
在这里插入图片描述
点击 Manage Jenkins --> Global Tool Configuration–> Git
在这里插入图片描述

“ Name ”随便填,“ Path to Git executable ”为git的安装路径
在这里插入图片描述
点击 Manage Jenkins --> Configure System -->配置 -->Gitlab
在这里插入图片描述
Connection Name ”随便填,“Git Host URL”填GitLab的访问地址,然后点“Add”——“jenkins”,如下所示:
在这里插入图片描述
选择gitlalb api,输入 jenkins 用户创建的token Zzis8ALsiYuytsg2GH-5
在这里插入图片描述
选择 gitlab api token,点击测试连接,出现 Success,表示成功。
在这里插入图片描述

6.配置Git插件

点击 Manage Jenkins --> Configure System -->配置 -->Git plugin
在这里插入图片描述
设置Git插件的全局配置,然后点击最下面的保存。
在这里插入图片描述

7.创建一个Jenkins Job

在jenkins里,一个任务叫做一个job。一般我们的项目会有多个分支,比如开发分支和产品分支,我们可以对每一个分支都新建一个job,比如,我们对开发分支创建一个测试的job,每次有代码提交就自动运行一次测试,对产品分支创建一个打包的job,每次有代码提交就运行打包任务。

不过在这里,我们只是单纯的创建一个job,来演示jenkins自动运行任务的过程。

首先,点击 新建Item,item name”可以随便起,然后点击“构建一个自由风格的软件项目”,点击Ok
在这里插入图片描述
至此,创建一个Job成功了

由于 jenkins 服务器的ssh秘钥,已经添加到gitlab上面了。那么就可以进行下一步了!

8.配置Job的源码管理

选择“源码管理”,选择“Git”,然后去GitLab中复制项目地址,粘贴到“Repository URL”,然后点击“credentials”后面的“Add”按钮
在这里插入图片描述
类型,选择 SSH Username with private key

Username 填 root

PrivateKey 选择Enter directly,点击add
在这里插入图片描述
登录到jenkins 服务器,查看私钥

cat /root/.ssh/id_rsa

将内容复制到网页上面,点击添加
在这里插入图片描述
在“credentials”里选择我们刚刚创建的认证方式:root
在这里插入图片描述
如果没报错,说明成功了,点击页面底部的“apply”。如果出错了,会在“Repository URL”和“Credentials”之间显示红色的错误信息。

jenkins job默认对master分支进行构建,你也可以自定义分支。这要求你的Gitlab代码仓库中要存在这个分支,一般来说,就是要向代码仓库提交一次更改,请 自行完成(Gitlab项目刚创建时是空的,一个分支也没有,这样的话,自动构建时会出错)
在这里插入图片描述

9.配置Job的构建触发器

选择“构建触发器”,勾选“Pull SCM”,这个选项会每隔一段时间检查一下GitLab仓库中代码是否有更新,有的话就执行构建操作。日程表如何设置,在这个输入框下面有说明。
在这里插入图片描述
扩展阅读:

常见构建触发器、:

Build after other projects are built 当另一个构建任务完成之后触发
Build periodically 周期性的触发
Build when a change is pushed to GitLab. GitLab CI Service URL: http://191.8.2.112:12000/project/test-go-dev 当代码有更新的时候触发,通过GitLab CI
GitHub hook trigger for GITScm polling 通过Github钩子触发
Poll SCM 定期检查代码有无更新,有更新时触发

10.配置Job的构建脚本

在build栏目里,选择“jenkins execute shell”,然后输入你项目的构建命令(这依赖于你的项目,如Maven的maven build,gulp的gulp xxx 等等)
在这里插入图片描述
这里我输入一段测试命令,表示将git项目的代码复制到/tmp/test

\cp -r $WORKSPACE /tmp/test

在这里插入图片描述
点击 可用的环境变量列表,就可以看到很多变量
在这里插入图片描述
其中 WORKSPACE 表示,下载git项目后的路径。

由于git项目为test,因此路径为:/var/lib/jenkins/workspace/test

点击保存

点击 Build Now,点击下面的构建过程
在这里插入图片描述
点击控制台输出,就可以看到完整的cp命令
在这里插入图片描述
登录到jenkins服务器,查看/tmp/test目录,是否有文件存在。

[root@Jenkins bin]# ll /tmp/test/
总用量 4
drwxr-xr-x. 3 root root 35 9月  24 14:08 deom
-rw-r--r--. 1 root root 15 9月  24 09:35 test
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值