前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8S容器环境下GitLab-CI和GItLab Runner 部署记录

K8S容器环境下GitLab-CI和GItLab Runner 部署记录

作者头像
洗尽了浮华
发布2021-04-01 10:25:58
6.8K0
发布2021-04-01 10:25:58
举报
文章被收录于专栏:散尽浮华散尽浮华

一、简单介绍

GitLab-CI

  • GitLab CI/CD是GitLab的一部分,支持从计划到部署具有出色的用户体验。CI/CD是开源GitLab社区版和专有GitLab企业版的一部分。可以根据需要添加任意数量的计算节点,每个构建可以拆分为多个作业,这些作业可以在多台计算机上并行运行。
  • GitLab-CI轻量级,不需要复杂的安装手段。配置简单,与gitlab可直接适配。实时构建日志十分清晰,UI交互体验很好。使用 YAML 进行配置,任何人都可以很方便的使用。GitLabCI 有助于DevOps人员,例如敏捷开发中,开发与运维是同一个人,最便捷的开发方式。
  • 在大多数情况,构建项目都会占用大量的系统资源,如果让gitlab本身来运行构建任务的话,显然Gitlab的性能会大幅度下降。GitLab-CI最大的作用就是管理各个项目的构建状态。因此,运行构建任务这种浪费资源的事情交给一个独立的Gitlab Runner来做就会好很多,更重要的是Gitlab Runner 可以安装到不同的机器上,甚至是我们本机,这样完全就不会影响Gitlab本身了。
  • 从GitLab8.0开始,GitLab-CI就已经集成在GitLab中,我们只需要在项目中添加一个.gitlab-ci.yaml文件,然后运行一个Runner,即可进行持续集成。

GitLab-CI:集成、开源、无缝、可扩展、更快的结果、针对交付进行了优化:

GItLab Runner

  • Gitlab Runner是一个开源项目,用于运行您的作业并将结果发送给gitlab。它与Gitlab CI结合使用,gitlab ci是Gitlab随附的用于协调作用的开源持续集成服务。
  • Gitlab Runner是用Go编写的,可以作为一个二进制文件运行,不需要特定于语言的要求
  • 它皆在GNU/Linux,MacOS和Windows操作系统上运行。另外注意:如果要使用Docker,Gitlab Runner要求Docker 至少是v1.13.0版本才可以。

Kubernetes Gitlab CICD 演示图:

二、基于Kubernetes Gitlab CICD 容器化部署记录

  • Gitlab官方提供了Helm的方式在Kubernetes集群中来快速安装,但是在使用的过程中发现Helm提供的Chart包中有很多其他额外的配置。所以这里我采用K8S自定义的方式来安装。
  • Gitlab主要涉及3个应用:Redis、Postgresql、Gitlab核心程序。
  • 本案例中使用的Gitlab-ce镜像部署,镜像中的Gitlab版本是13.7.4。
  • 本案例中使用NFS作为持久化存储方式。除此之外,还可以选择HostPath本地持久化存储、NAS云端持久化存储、Ceph分布式持久化存储等。

注意:本示例部署所涉及到的image镜像均导入到Harbor私有私仓(172.16.60.230) 。

1)使用NFS作为持久化存储

在NFS服务器端(172.16.60.238)创建Redis、Postgresql、Gitlab核心程序容器的持久化挂载目录

2)部署Gitlab

可以先创建一个命名空间

配置三个核心程序的容器化部署的yaml文件

gitlab-postgresql.yaml 文件内容:

gitlab-redis.yaml 文件内容:

gitlab.yaml 文件内容:

创建并启动gitlab相关容器进程:

稍微等一会儿(由于程序启动顺序原因,pod可能会出现重启次数,不过最终都会启动成功),

查看pod状态:

查看svc:

3)访问 Gitlab

  • 这里采用NodePort的方式,通过 http://任意node节点ip:30004 地址访问Gitlab
  • Gitlab登录用户名:root,密码:admin321
  • Gitlab登录密码可以在yaml文件里修改

这里容器化部署后的Gitlab版本是13.7.4

4)创建演示项目

接下来顺便创建一个项目,用于演示:

接下来在服务器上git clone,进行代码提交演示:

git clone地址是 http://gitlab-5b887894d5-ntxzj/root/kevin-test.git

地址中的gitlab-5b887894d5-ntxzj是pod名称,在容器外部访问不了,需要修改为对应的nodeport地址,故git clone地址可以是:http://172.16.60.234:30004/root/kevin-test.git

在其中一个node节点上进行代码提交演示:

如何解决 "每次输入用户名和密码" 的问题?

在代码目录.git/config文件内[remote "origin"]的url的gitlab域名前添加gitlab注册时的"用户名:密码@"

接着再次尝试提交内容,就不需要手动输入用户名和密码了:

代码上传后,gitlab上展示效果如下:

进入该项目下,左侧栏CICD里有三种方式:Pipelines、Jobs、Schedules

5)Gitlab Runner 安装和注册

gitlab runner支持多种方式安装,我这里就采取在k8s中安装。

官方文档地址: https://docs.gitlab.com/runner/install/

打开gitlab,如下图所示,左边代表runner状态,右边是配置runner信息。

注意右边栏的token信息,后面注册runner的时候会用到:

接下来进行配置gitlab runner资源清单 (runner-configmap.yaml)

需要注意:

  • CI_SERVER_URL 这个地址是gitlab的地址,如果gitlab在宿主机直接写宿主机的ip即可,容器是格式为:svc名称.命名空间.svc.cluster.local (如果都按照我的文档来进行安装不需要修改别的配置了)。
  • 如果定义的gitlab域名并不是通过外网DNS解析,而是通过/etc/hosts进行映射,那么我们需要在Runner的Pod中去添加对应的hosts,需要通过--pre-clone-script参数来指定一段脚本来添加hosts信息,也就是在ConfigMap中添加环境变量RUNNER_PRE_CLONE_SCRIPT的值:

本案例,这里gitlab地址我是使用node节点的ip+port方式。 如果使用gitlab域名方式,且不是外网DNS解析,比如域名地址是http://gitlab.kevin.com 则需要在上面的ConfigMap中添加环境变量RUNNER_PRE_CLONE_SCRIPT的值: RUNNER_PRE_CLONE_SCRIPT = "echo 'xx.xx.xxx.xx git.i4t.com' >> /etc/hosts" 其中xx.xx.xxx.xx 为node节点ip地址

另外记住:在ConfigMap添加新选项后,需要删除Gitlab ci Runner Pod

因为这里我是使用envFrom来注入上面的这些环境变量而不是直接使用env(envfrom 通过将环境变量放置到ConfigMaps或Secrets来帮助减小清单文件)

如果我们想添加其他选项,那么可以在等到后面的gitlab-ci-runner的Pod容器启动成功后,登录gitlab-ci-runner的pod容器内部运行gitlab-ci-multi-runner register --help 命令来查看所有可使用的选项,只需要为配置的标志添加env变量即可:

创建资源清单的configmap

此时,还需要配置一个用于注册、运行和取消gitlab ci runner的小脚本。只有当Pod正常通过K8S (TERM信号)的终止流程时,才会触发注销注册。如果强行终止Pod(SIGKILL信号),Runner将不会自己注销自身。必须手动完成对这种Runner的清理 (注意:只有如这里在k8s集群里安装GitLan Runner才这样操作,二进制安装非K8s上安装则不受这个影响)

创建此脚本的configmap

接着需要创建一个GITLAB_CI_TOKEN,然后使用gitlab ci runner token来创建一个Kubernetes secret对象。需要提前对token进行base64转码:

特意注意:这里的token就是我们gitlab runner上截图的地方,base64只有在k8s环境上需要!

登录Gitlab,Runner右边栏token信息 如下图:

使用上面的token创建一个Sercret对象 (gitlab-ci-token-secret.yaml)

创建这个Secret

接下来创建真正运行Runner的控制器镜像,这里使用Statefulset,在开始运行的时候,尝试取消注册所有的同名Runner,当节点丢失时(即NodeLost事件),这尤其有用,然后再尝试注册自己并开始运行。在正常停止Pod的时候,Runner将会运行unregister命令来尝试取消自己,所以gitlab就不能再使用这个Runner,这个则是通过kubernetes Pod生命周期中的hooks来完成的:

编译gitlab runner的pod部署的yaml文件内容:

上面我们命名了一个gitlab-ci的serviceAccount,这里要新建一个rbac文件 (runner-rbac.yaml)

创建gitlab runner

接下来我们检查我们创建的资源信息:

此时,在登录Gitlab,查看Runner信息,发现就已经将这2个pod节点添加进来了:

这里我们也可以更改Runner的一些配置,比如添加tag标签等:

6)Gitlab Runner 配置使用

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档