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

news2024/10/3 2:18:10

极狐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.coloradmin.cn/o/1377887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VLAN 详解二(VLAN 基础配置)

VLAN 详解二&#xff08;VLAN 基础配置&#xff09; VLAN 配置其实是非常简单的&#xff0c;但是想要学得比较精还是需要花费一些功夫的&#xff0c;根据不同的 VLAN 划分方式用不同的配置方法&#xff0c;但其实配置方法基本上都大同小异。 下面就以在实际网络中最常用的基于…

fiddler筛选请求并修改参数

一、筛选请求 使用过滤&#xff0c;需勾选User Filter才会生效&#xff0c;运行当前的过滤规则&#xff0c;需点击Run Filterset now Hosts&#xff1a;主机过滤之局域网过滤 No Zone Filter&#xff1a;默认选项&#xff0c;不设置区域过滤器show only Intranet Hosts&…

HarmonyOS——ArkUI状态管理

一、状态管理 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染&…

大模型在游戏行业的应用分析

文章目录 一、大模型作用1&#xff09;节省美术成本2&#xff09;模仿用户肖像&#xff0c;精准投放3&#xff09;买量流程的自动化4&#xff09;缩短视频素材制作周期5&#xff09;例如新营销形式宣传&#xff08;图生图&#xff09;5&#xff09;故事设计6&#xff09;辅助代…

Linux操作系统----实用工具Git(配实操图)

绪论​ “针对问题 解决问题 针对问题&#xff01;”&#xff0c;本章主要讲解的是Git是什么以及Git的如何搭建仓库和如何在Linux环境下通过指令的形式提交自己的代码到远程仓库。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 1.Git的来源以…

模拟开关灯

1&#xff0e;  实验任务 如图所示&#xff0c;监视开关K1&#xff08;接在P3.0端口上&#xff09;&#xff0c;用发光二极管L1&#xff08;接在单片机P1.0端口上&#xff09;显示开关状态&#xff0c;如果开关合上&#xff0c;L1亮&#xff0c;开关打开&#xff0c;L1熄灭。…

ChatGLM3在windows上部署

1 项目地址 https://github.com/THUDM/ChatGLM3 简介&#xff1a;ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。 2 本机配置 台式机&#xff1a; CPU&#xff1a; Intel(R) Core(TM) i7-10700F RAM&#xff1a; 32G GPU&#xff1a; NV…

pytorch学习笔记(七 )

池化类似压缩 最大池化-上采样 例如给一个3的话就会生成一个33的窗口&#xff08;生成相同的高和宽&#xff09;&#xff0c;给一个tuple就会给出一个相同的池化核。stride默认值就是核的大小 dilation 在卷积dialation设置之后每一个会和另外的差一个&#xff0c;空洞卷积 …

大模型在广告ctr预估中的应用

背景 预训练大模型在ctr预估方面取得了不错的效果&#xff0c;但是应用大模型方面还主要停留在提取离线预训练&#xff0c;然后使用大模型的打分结果或者中间的embedding向量&#xff0c;这种级联的应用方式相对灵活方便。但是这种使用大模型提取特征的方式存在自身的问题&…

使用知行之桥EDI系统的HTTP签名身份验证

本文简要概述了如何在知行之桥EDI系统中使用 HTTP 签名身份验证&#xff0c;并将使用 CyberSource 作为该集成的示例。 API 概述 API 是”应用编程接口”的缩写。这听起来可能很复杂&#xff0c;但它的真正含义是一种允许两个不同实体相互通信的软件。自开发以来&#xff0c;…

x-cmd pkg | tsx - Node.js 的直接替代品

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 tsx 代表 “TypeScript execute”&#xff0c;由 TypeScript 编写&#xff0c;内部使用由 Go 语言编写的 esbuild 核心二进制实现超快的 TypeScript 编译&#xff0c;旨在增强 Node.js 以无缝运行 TypeScript / ESM /…

利用Wireshark分析IP协议

实验.利用Wireshark分析IP协议 一&#xff0e;实验目的 1.掌握Wireshark软件简单的过滤语法 2.掌握IP数据报的组成格式 3.掌握IP分片的计算方法 4.学会利用Wireshark抓包分析IP协议 二&#xff0e;实验环境 1.Wireshark软件 2.Windows 计算机 三&#xff0e;实验预备知识 1.IP…

便捷好用的iOS文件管理App

便捷好用的iOS文件管理App 摘要 本文介绍了一款功能强大、免费的iOS文件管理App——克魔助手。通过使用克魔助手&#xff0c;用户可以轻松管理手机存储空间&#xff0c;清理垃圾文件&#xff0c;整理文件&#xff0c;并进行文件传输和截图操作。本文将详细介绍克魔助手的各项…

html+css实现子元素完全居中常见方案

详细过程 查看公众号文章 htmlcss实现子元素完全居中常见方案 获取更多内容&#xff0c;请关注微信公众号。搜索“码圈小橙子”&#xff0c;或扫描下方二维码获取关注

轻量化的yolov8部署到安卓Android手机端

一、pytorch环境配置和yolov8源码安装 首先在电脑上需要配置好pytorch环境&#xff0c;和yolov8源码的下载 然后针对yolov8做自己的轻量化改进 二、下载Android Studio和ncnn-android-yolov8 1. Android Studio官网链接&#xff1a; 下载 Android Studio 和应用工具 - And…

预训练中文GPT2(包括重新训练tokenizer)

训练数据 1.json后缀的文件 2.数据是json line格式&#xff0c;一行一条json 3. json结构如下 {"content": "①北京和上海户籍的游客可获得韩国多次签证&#xff1b;②“整容客”可以不经由韩国使领馆、直接在网上申请签证&#xff1b;③中泰免签的实施日期…

屏幕截图编辑工具Snagit中文

Snagit是一款优秀的屏幕、文本和视频捕获与转换程序。它能够捕获屏幕、窗口、客户区窗口、最后一个激活的窗口或用鼠标定义的区域&#xff0c;并支持BMP、PCX、TIF、GIF或JPEG格式的保存。Snagit还具有自动缩放、颜色减少、单色转换、抖动等功能&#xff0c;并能将捕获的图像转…

【Linux】:Linux中的Git分支管理

本章开始介绍 Git 的杀⼿级功能之⼀&#xff08;注意是之⼀&#xff0c;也就是后⾯还有之⼆&#xff0c;之三……&#xff09;&#xff1a;分⽀。分⽀就是科幻电影⾥⾯的平⾏宇宙&#xff0c;当你正在电脑前努⼒学习 C 的时候&#xff0c;另⼀个你正在另⼀个平⾏宇宙⾥努⼒学习…

x3daudio1_7.dll如何恢复,这6个方法都能修复x3daudio1_7.dll丢失问题

x3daudio1_7.dll文件缺失”。那么&#xff0c;什么是x3daudio17.dll文件&#xff1f;它的作用和影响又是什么呢&#xff1f;本文将详细介绍x3daudio17.dll文件的定义、作用和影响&#xff0c;并提供6个修复方法来解决这个问题。 一、x3daudio1_7.dll是什么&#xff1f; x3dau…

高级分布式系统-第6讲 分布式系统的容错性--可靠的组通信

可靠的组通信 组内通信最好是每个进程之间都建立点到点的通信&#xff0c; 但实际中这样的组织结构不是有效的&#xff0c; 因为会浪费很大的通信带宽。 在平等组中&#xff0c; 多播是主要的组织结构。 但多播是具有同步性质的容错结构&#xff0c; 并不适用拜占庭模型。 多…