使用 KubeSphere 与极狐GitLab 打造云原生持续交付系统

极狐GitLab 简介

极狐GitLab 是一个一体化的 DevOps 平台,可以简单理解为 GitLab 在国内的“发行版”。是由极狐(GitLab)公司推出的产品(极狐(GitLab)公司是以“中外合资3.0”模式成立的公司,在国内独立运营,为国内用户提供适合本土化的 DevOps 平台以及支持服务)。

极狐GitLab 是开源的,任何人都可以参与开源共建,代码托管在极狐GitLab SaaS 上:https://jihulab.com/gitlab-cn/gitlab。其提供的一体化 DevOps 能力覆盖软件开发全生命周期(从计划到运维),同时内置了安全功能,能够利用开箱即用的安全能力构建 DevSecOps 体系。

更重要的一点是,极狐GitLab 支持自建(私有部署)和 SaaS 两种服务。在私有部署的时候,支持多种安装方式,其中就包括云原生的安装方式,因此,结合 KubeSphere 和极狐GitLab,可以打造出一个适应云原生时代的持续交付系统。

KubeSphere 简介

Kubernetes 是一个非常复杂的容器编排平台,学习成本非常高,KubeSphere 所做的事情就是高度产品化和抽象了底层 Kubernetes,是一个面向云原生的操作系统。讲得再通俗一点,Kubernetes 屏蔽了底层容器运行时的差异,而 KubeSphere 则屏蔽了底层 Kubernetes 集群的差异,它解决了 K8s 使用门槛高和云原生生态工具庞杂的痛点。你可以在可视化界面上点几下鼠标即可将 Pod 调度到集群的不同节点中,无需编写 YAML。

上面是 KubeSphere 的功能架构,可以看到 KubeSphere 包含了非常多的应用场景,比如微服务、DevOps、应用管理、可观测性和安全等,每一个场景生态下面都包含了很多对研发和运维人员比较友好的组件,而且所有的组件都是可插拔的,用户可以根据自己的意愿自由选择启用哪个组件。

从 v4.0 开始,KubeSphere 会提供前后端可插拔的架构和框架,任何第三方合作伙伴和 ISV 都可以基于 KubeSphere 4.0 开放框架,开发扩展自己想要的功能插件,这些功能插件与 KubeSphere 有完全一致的 UI 体验,形成更强大的应用生态。这就好比 Mac OS 和 App Store 之间的关系一样,任何企业或团队都可以发布自己开发的插件到应用商店,灵活满足各类用户的需求,在社区与 KubeSphere 合作互利共赢。

在 KubeSphere 上安装极狐GitLab 和 Runner

目前在 KubeSphere 上部署极狐GitLab 非常便利,只需要利用 KubeSphere 的应用商店即可一键部署。

应用商店与应用全生命周期管理是 KubeSphere 独有的特色,KubeSphere 为用户提供了一个基于 Helm 的应用商店,用于应用生命周期管理。而且从 3.2.0 版本开始,KubeSphere 新增了 “动态加载应用商店” 的功能,合作伙伴可申请将应用的 Helm Chart 集成到KubeSphere 应用商店,相关的 Pull Request 被合并后,KubeSphere 应用商店即可动态加载应用,不再受到 KubeSphere 版本的限制。目前极狐 Gitlab 就是通过动态加载的方式将其 Helm Chart 上架到了 KubeSphere 的应用商店。

安装极狐GitLab

直接选择下图红色方框中的 jh-gitlab 即可开始部署。

下一步需要修改一些参数,即 Helm Chart 中的 values。

大家需要根据自己的实际情况修改,我的私有环境不需要 Ingress,可以通过 Cluster IP 直连,所以才将域名全部设置成了 Service Name。除此之外,还需要取消安装 Runner,后续再单独安装。其他参数可以自己酌情修改,比如我取消了 Certmanager 和 Ingress-Nginx。

查看创建好的工作负载:

部署完成后,就可以通过设置好的域名访问极狐GitLab。

添加图片注释,不超过 140 字(可选)

默认用户名是 root,初始密码可以通过以下命令获取:

$ kubectl -n jh-gitlab get secret jh-gitlab-gitlab-initial-root-password -o go-template --template='{{.data.password}}' | base64 -D

登录之后可以先创建一个项目,下面安装 Runner 和演示 Demo 的章节都会用到。

安装极狐GitLab Runner

极狐GitLab Runner 只是极狐GitLab 的其中一个组件,所以不能再通过应用商店来安装。KubeSphere 除了应用商店之外,还可以通过应用仓库和应用模板来安装应用。所谓应用仓库,就是一个宽松版的应用商店,应用商店是所有用户共用的,应用仓库只是个人版的应用商店,不需要审批,只会存在于你自己的集群中。只需将相关应用 Helm Chart 的 URL 导入,即可变成应用仓库中的一个应用。这里我们选择导入极狐GitLab 的 Helm Chart。

然后在『应用』中点击『创建』。

然后选择『从应用模板』,在弹出面板的下拉框中选择 GitLab。

选择 gitlab-runner,然后设置应用名称,继续点击下一步,开始修改部署参数。

其中,gitlabUrl 的值为极狐GitLab 的可视化界面地址,runnerRegistrationToken的值可以设置为想要使用该 Runner 的项目的 CI/CD Specific runners 的 registration token,例如:

同时还需要开启 RBAC:

rbac:
  create: true
  rules: []
  clusterWideAccess: false
  podSecurityPolicy:
    enabled: false
    resourceNames:
      - gitlab-runner

其他参数可根据实际情况酌情修改,修改完成后点击下一步开始安装。安装完成后,可以进入 Pod 查看注册情况:

$ kubectl -n jh-gitlab get pod -l release=gitlab-runner
NAME                                          READY   STATUS        RESTARTS   AGE
gitlab-runner-gitlab-runner-c7c999dfc-wgg56   1/1     Running       0          61s

$ kubectl -n jh-gitlab exec -it gitlab-runner-gitlab-runner-c7c999dfc-wgg56 -- bash
Defaulted container "gitlab-runner-gitlab-runner" out of: gitlab-runner-gitlab-runner, configure (init)
bash-5.0$ gitlab-runner list
Runtime platform                                    arch=amd64 os=linux pid=106 revision=f761588f version=14.10.1
Listing configured runners                          ConfigFile=/home/gitlab-runner/.gitlab-runner/config.toml
gitlab-runner-gitlab-runner-c7c999dfc-wgg56         Executor=kubernetes Token=dSz6WoJzpD5bjkDhP5xN URL=https://jihulab.com/
bash-5.0$

可以看到 Pod 里面已经内置了 gitlab-runner 命令,且有注册成功的 Runner 实例 gitlab-runner-gitlab-runner-c7c999dfc-wgg56,而这就是刚刚用应用模板安装的 Runner。在极狐GitLab 的 Web 页面也可以看到注册成功的 Runner。

CI/CD Demo 演示

接下来我们通过一个简单的流水线示例来演示极狐GitLab 的 CI/CD 流水线工作原理。演示流水线之前,先来了解几个基本概念。

极狐GitLab 流水线包含两个核心组件:

  • Job : 描述需要执行的任务;
  • Stage : 定义 Job 执行的顺序。

而流水线(Pipeline)则是一组运行在各个 Stage 中的 Job 集合,可以包含多个流程:编译、测试、部署等等,任何提交或 Merge Request 都能触发流水线。

负责执行 Job 的就是 Runner,Runner 的本体,是运行在某台机器上的守护进程,类似于 Jenkins agent。在 Runner 自己看来,没有类型的区别,它只是根据 Token 和 URL,注册到指定的极狐GitLab 而已。

讲完了基础概念,直接来看示例仓库。

这个示例应用是用 Go 写的 HTTP Server,代码很简单,我就不解释了。

package main

import (
    "fmt"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello this is kubesphere")
}

func main() {
    http.HandleFunc("/ks", handler)
    log.Fatal(http.ListenAndServe(":9999", nil))
}

流水线编排文件是 .gitlab-ci.yml,内容如下:

stages:
  - build
  - deploy

build:
  image: 
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  stage: build
  tags: 
    - kubernetes
  script:
    - mkdir -p /kaniko/.docker
    - echo "{"auths":{"${CI_REGISTRY}":{"auth":"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')"}}}" > /kaniko/.docker/config.json
    - >-
      /kaniko/executor
      --context "${CI_PROJECT_DIR}"
      --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
      --destination "${CI_REGISTRY_IMAGE}:1.0.0"

deploy:
  image: bitnami/kubectl:latest
  stage: deploy
  tags: 
    - kubernetes
  variables:
    KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: jh-gitlab
  only:
    - main
  script:
    - kubectl -n jh-gitlab apply -f deployment.yaml

由于最新版的 Kubernetes 无情地抛弃了 Docker,推荐使用 Containerd 作为运行时,所以就没法使用 Docker 来构建镜像啦,我们可以选择使用 Kaniko。Kaniko 是谷歌开源的一款用来构建容器镜像的工具。与 Docker 不同,Kaniko 并不依赖于 Docker Daemon 进程,完全是在用户空间根据 Dockerfile 的内容逐行执行命令来构建镜像,这就使得在一些无法获取 Docker Daemon 进程的环境下也能够构建镜像,比如在标准的 Kubernetes 集群上。

这个流水线总共包含两个阶段:构建和部署。部署阶段需要注意的是,默认情况下 Kubernetes 中的 Pod 是没有权限创建工作负载的,所以我们需要创建一个新的 ServiceAccount,将其绑定到具有权限的 ClusterRole 上面。

# rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jh-gitlab
  namespace: jh-gitlab
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gitlab-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: jh-gitlab
    namespace: jh-gitlab


$ kubectl apply -f rbac.yaml

最后再让 Runner 使用这个新的 ServiceAccount,即:

  variables:
    KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: jh-gitlab

但是这样还不行,默认情况下流水线没有权限修改 Runner 的 ServiceAccount,需要修改 Runner 的部署清单,赋予其修改权限。

注意图中右侧的高亮部分,表示允许 jh-gitlab 这个 namespace 下面的 Pod 更改其 ServiceAccount。修改完毕后点击更新即可。

这是我的完整配置,供大家参考:

imagePullPolicy: IfNotPresent
gitlabUrl: 'https://jihulab.com/'
runnerRegistrationToken: GR1348941fycCAhY3_LnRFPqy3DL4
terminationGracePeriodSeconds: 3600
concurrent: 10
checkInterval: 30
sessionServer:
  enabled: false
rbac:
  create: true
  rules: []
  clusterWideAccess: false
  podSecurityPolicy:
    enabled: false
    resourceNames:
      - gitlab-runner
metrics:
  enabled: false
  portName: metrics
  port: 9252
  serviceMonitor:
    enabled: false
service:
  enabled: false
  type: ClusterIP
runners:
  config: |
    [[runners]]
      [runners.kubernetes]
        namespace = "{{.Release.Namespace}}"
        image = "ubuntu:16.04"
  privileged: true
  tags: "kubernetes"
  cache: {}
  builds: {}
  services: {}
  helpers: {}
securityContext:
  runAsUser: 100
  fsGroup: 65533
resources: {}
affinity: {}
nodeSelector: {}
tolerations: []
envVars:
  - name: KUBERNETES_SERVICE_ACCOUNT_OVERWRITE_ALLOWED
    value: jh-gitlab
hostAliases: []
podAnnotations: {}
podLabels: {}
secrets: []
configMaps: {}

现在随便修改仓库中的文件(比如 README)来触发流水线。

可以看到流水线被成功触发并执行成功。最后我们来看看构建好的镜像有没有被成功部署。

从 KubeSphere 可视化界面里可以看到应用被成功部署了。最后可以测试一下这个 HTTP Server 是否正常工作:

$ kubectl -n jh-gitlab get pod -l app=cicd-demo -owide
NAME                         READY   STATUS    RESTARTS   AGE     IP             NODE           NOMINATED NODE   READINESS GATES
cicd-demo-86d7fb797c-428xs   1/1     Running   0          4m40s   10.233.65.81   k3s-worker02   <none>           <none>

$ curl http://10.233.65.81:9999/ks
Hello this is kubesphere

总结

本文给大家介绍了 KubeSphere 和极狐GitLab 以及各自的优势,并探讨了如何结合 KubeSphere 和极狐GitLab 来打造一个云原生时代的持续交付系统,最后通过一个流水线示例来展示极狐 GiLab 流水线的工作原理。

从最后的示例可以看出,CD(即部署阶段)的过程还是比较麻烦的,比如需要安装配置额外工具(kubectl),还需要 Kubernetes 对其进行授权,如果 Kubernetes 部署在云平台中,还需要云平台对其授权。最重要的是,它无法感知部署的状态,部署完了之后无法获知该工作负载是否正常提供服务。

那么这个问题有没有解决办法呢?我将在下一篇文章中给大家介绍如何通过 GitOps 来解决这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/295934.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS 实现两个圆圈重叠部分颜色不同

这是期望实现的效果&#xff0c;由图可知&#xff0c;圆圈底图透明度是0.4&#xff0c;左侧要求重叠部分透明度是0.7&#xff0c;所以不能通过简单的透明度叠加来实现最右侧的效果。 这就需要另外新建一个图层来叠加在两个圆圈重叠上方。 直接看代码 .circle_hight {width: 1…

模版匹配历劫之路1-匹配点太多如何解决

1测试图片 2初步推测是否是提取的点太多而导致匹配时间很长 2.1通过canny的算法来提取检测点 import numpy as np import cv2 import time import matplotlib.pyplot as pltclass GeoMatch:def __init__(self):self.noOfCordinates0 # 坐标数组中元素的个数self.cordinates…

2024年某书最新x-s-common签名算法分析以及点赞api接口测试nodejs(2024-01-05)

2024年某书又更新了x-s-common算法&#xff0c;现在的版本是&#xff1a;3.6.8。这个签名算法现在是越来越重要了&#xff0c;许多接口都要用到。比如&#xff1a;评论&#xff0c;点赞等接口&#xff0c;没有这个算法采集不到数据。 一、chrome逆向x-s-common算法 1、x-s-comm…

开启Android学习之旅-3-Android Activity

Android Activity 本文总结《第一行代码 Android》第3版的内容 环境&#xff1a; Android Studio Giraffe | 2022.3.1 Patch 3 Activity 是什么&#xff1f; Activity 简单将就是UI界面&#xff0c;包含两部分 Activity 类 和应用布局文件&#xff0c;如果是 Compose 则另说&…

1.4 SPEEDING UP REAL APPLICATIONS

我们从并行化应用程序中可以期待什么样的速度&#xff0c;这取决于应用程序中可以并行化的部分。如果可并行化部分所花费时间的百分比为30%&#xff0c;则并行部分的100倍加速将使执行时间减少不超过29.7%。整个应用程序的加速速度将仅为1.4倍左右。事实上&#xff0c;即使在并…

云渲染电脑可以关吗?瑞云渲染能断开网络吗?

随着技术的发展&#xff0c;网络速度从4G到5G的提升&#xff0c;也给云渲染行业对于渲染文件的传输上变的更加快速。且随着云服务商对于硬件的升级&#xff0c;高性能的渲染配置越发强大。云渲染在渲染速度上变得更加的快速。对于刚刚接触云渲染的新手小白有着不少的疑问。下面…

硬盘检测软件 SMART Utility mac功能特色

SMART Utility for mac是一款苹果电脑上磁盘诊断工具&#xff0c;能够自动检测磁盘的状态和错误情况&#xff0c;分析并提供错误报告,以直观的界面让用户可明确地知道自己的磁盘状况。SMART Utility 支持普通硬盘HDD和固态硬盘SSD&#xff0c;能够显示出详细的磁盘信息&#xf…

Qt6入门教程 2:Qt6下载与安装

Qt6不提供离线安装包&#xff0c;下载和安装实际上是一体的了。 关于Qt简介&#xff0c;详见&#xff1a;Qt6入门教程1&#xff1a;Qt简介 一.下载在线安装器 Qt官网 地址&#xff1a;https://download.qt.io/ 在线下载器地址&#xff1a;https://download.qt.io/archive/on…

RMAN-03002 RMAN-06059 ORA-19625

有个现场经理反馈&#xff0c;每天的rman备份异常&#xff0c;登录系统查看rman的log日志&#xff0c;报错信息如下 RMAN> run{ 2> backup filesperset 50 archivelog all format /backup/ARCHBAK_%d_%T_%s tag arch_bak delete all input; 3> } 4> Starting …

java: 写入数据到HBase

一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…

flutter版本升级后,解决真机和模拟器运行错误问题

flutter从3.3.2升级到3.16.0&#xff0c;项目运行到真机和模拟器报同样的错&#xff0c;错误如下: 解决办法&#xff1a;在android目录下的build.gradle加入下面这行&#xff0c;如下图&#xff1a; 重新运行&#xff0c;正常把apk安装到真机上或者运行到模拟器上

.NET Standard 支持的 .NET Framework 和 .NET Core

.NET Standard 是针对多个 .NET 实现推出的一套正式的 .NET API 规范。 推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。 .NET 5 及更高版本采用不同的方法来建立一致性&#xff0c;这种方法在大多数情况下都不需要 .NET Standard。 但如果要在 .NET Framewo…

密码学(一)

文章目录 前言一、Cryptographic Primitives二、Cryptographic Keys2.1 Symmetric key cryptography2.2 asymmetric key cryptography 三、Confidentiality3.1 Symmetric key encryption algorithms3.2 asymmetric key block ciphers3.3 其他 四、Integrity4.1 symmetric key s…

亲测表白网制作源码,在线制作表白,无数据库上传就能用

在线制作表白网源码 没有数据库上传就能用 后台/admin 账号密码都是admin

Android低功耗蓝牙开发总结

基础使用 权限申请 蓝牙权限在各个版本中略有不同 Android 12 及以上版本&#xff0c;如果不需要通过蓝牙来推断位置的话&#xff0c;蓝牙扫描不需要开启位置权Android 11 及以下版本&#xff0c;蓝牙扫描必须开启位置权限Android 9 及以下版本&#xff0c;蓝牙扫描可开启粗…

Windows BAT脚本 | 定时关机程序

使用说明&#xff1a;输入数字&#xff0c;实现一定时间后自动关机。 单位小时&#xff0c;用后缀 h 或 H。示例 1h 单位分钟&#xff0c;用后缀 m 或 M 或 min。示例 30min 单位秒。用后缀 s 或不用后缀。示例 100s 源码 及 配置方法 桌面新建文本文件&#xff0c;输入下面…

在云服务器ECS上用Python写一个搜索引擎

在云服务器ECS上用Python写一个搜索引擎 一、场景介绍二、搜索引擎的组成2.1 网页的爬取及排序2.2 用户使用搜索引擎进行搜索 三、操作步骤3.1 环境准备3.2 安装Anaconda3.3 安装Streamlit3.4 下载搜索引擎代码3.5 运行搜索引擎 四、常见问题4.1 运行setup.py时可能的问题4.2 如…

java实验室预约管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 实验室预约管理系统是一套完善的java web信息管理系统 系统采用serlvetdaobean&#xff08;mvc模式)&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数 据库&#xff0c;系统主要采用B/S模式开发。开发环境为T…

图像分割实战-系列教程11:U2NET显著性检测实战3

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 U2NET显著性检测实战1 U2NET显著性检测实战2 U2NET显著性检测实战3 6、上采样操作与REBNCONV def…

Python基础知识总结1-Python基础概念搞定这一篇就够了

时隔多年不用忘却了很多&#xff0c;再次进行python的汇总总结。好记性不如烂笔头&#xff01; PYTHON基础 Python简介python是什么&#xff1f;Python特点Python应用场景Python版本和兼容问题解决方案python程序基本格式 Python程序的构成代码的组织和缩进使用\行连接符 对象…