前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【腾讯云容器服务】在 TKE 上自建 Gitlab 代码仓库

【腾讯云容器服务】在 TKE 上自建 Gitlab 代码仓库

原创
作者头像
imroc
修改于 2022-08-03 02:29:27
修改于 2022-08-03 02:29:27
2.9K0
举报

摘自 Kubernetes 实践指南

本文介绍如何在腾讯云容器服务上部署 Gitlab 代码仓库。

前提条件

准备 chart

Gitlab 官方提供了 helm chart,可以下载下来:

代码语言:shell
AI代码解释
复制
helm repo add gitlab https://charts.gitlab.io/
helm fetch gitlab/gitlab --untar
helm fetch gitlab/gitlab-runner --untar

参考 Gitlab 官方文档: Deployment Guide

不过要愉快的部署到腾讯云容器服务,要修改的配置项较多:

  • 如果存储使用默认的云硬盘(cbs),容量必须是 10Gi 的倍数,官方 chart 有一些 8Gi 的定义,会导致 pvc 一直 pending,pod 也一致 pending,需要修改一下配置。
  • gitlab 相关组件的容器镜像地址使用的是 gitlab 官方的镜像仓库,在国内拉取可能会失败,需要同步到国内并修改镜像地址。
  • 很多组件和功能可能用不到,建议是最小化安装,不需要的通通禁用,如 nginx-ingress, cert-manager, prometheus 等。
  • 服务暴露方式和 TLS 证书管理,不同平台差异比较大,建议是单独管理,helm 安装时只安装应用本身,ingress 和 tls 相关配置禁用掉。

修改这些配置比较繁琐,我已经维护了一份 Gitlab 适配腾讯云容器服务的 chart 包,相关 gitlab 镜像也做了同步,可以实现一键安装。可以通过 git 拉下来:

代码语言:shell
AI代码解释
复制
git clone https://github.com/tke-apps/gitlab.git
cd gitlab

StorageClass 注意事项

像 gitaly, minio 这些组件,是需要挂载持久化存储的,在腾讯云容器服务,默认使用的是云硬盘(CBS),块存储,通常也建议使用这种,不过在使用之前,建议确保默认 StorageClass 支持磁盘容量在线扩容,这个特性需要确保集群版本在 1.18 以上,且安装了 CBS CSI 插件(Out-of-Tree),新版本集群默认会安装。

然后找到默认 StorageClass,通常名为 "cbs":

编辑 yaml:

先确保以下两点,如果不满足,可以删除重建:

  • 默认 StorageClass 的 is-default-class 注解为 true。
  • provisioner 是 com.tencent.cloud.csi.cbs

如果满足,添加字段 allowVolumeExpansion: true 并保存。

另外,也可以通过 kubectl 修改,先查询 default StorageClass:

然后使用 kubectl edit sc <NAME> 进行修改。

部署 Gitlab

准备配置

创建 gitlab.yaml 配置,分享一下我的配置:

代码语言:yaml
AI代码解释
复制
redis:
  install: true
  master:
    nodeSelector: 
      node.kubernetes.io/instance-type: eklet
    persistence:
      enabled: false
postgresql:
  install: false
minio:
  persistence:
    enabled: true
    volumeName: gitlab-minio
    accessMode: ReadWriteMany
    size: '100Gi'
gitlab:
  gitaly:
    persistence:
      enabled: true
      volumeName: 'gitlab-gitaly'
      accessMode: ReadWriteMany
      size: 100Gi
global:
  hosts:
    domain: imroc.cc
    https: true
    gitlab:
      name: gitlab.imroc.cc
      https: true
  nodeSelector: 
    node.kubernetes.io/instance-type: eklet
  psql:
    password:
      useSecret: true
      secret: gitlab-psql-password-secret
      key: password
    host: 'pgsql-postgresql.db'
    port: 5432
    username: gitlab
    database: gitlab
  • redis 作为缓存,不想持久化数据,降低成本。
  • postgresql 使用现有的数据库,不安装,配置上数据库连接信息(数据库密码通过secret存储,提前创建好)。
  • minio 和 gitaly 挂载的存储,使用了 NFS,提前创建好 pv,在 persistence 配置里指定 volumeName 来绑定 pv。
  • 我的集群是标准集群,有普通节点和超级节点,我希望 gitlab 所有组件都调度到超级节点,global 和 redis 与 minio 里指定 nodeSelector,强制调度到超级节点。
  • 服务暴露方式我用的 istio-ingressgateway,证书也配到 gateway 上的,对外访问方式是 https,在 global.hosts 下配置对外访问域名,https 置为 true(用于页面内的连接跳转,避免https页面跳到http链接)。

gitlab-psql-password-secret.yaml(存 postgresql 密码的 secret):

代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: Secret
metadata:
  name: gitlab-psql-password-secret
  namespace: gitlab
type: Opaque
stringData:
  password: '123456'

gitaly 和 minio 挂载的存储我使用 NFS,提前创建好 CFS 实例和相应的文件夹路径,并 chmod 0777 <DIR> 修改目录权限,避免因权限问题导致 pod 启动失败。以下分别是它们的 pv yaml 定义:

minio-nfs-pv.yaml:

代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-minio
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 100Gi
  nfs:
    path: /gitlab/minio
    server: 10.10.0.15
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem
  storageClassName: 'cbs'

gitaly-nfs-pv.yaml:

代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-gitaly
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 100Gi
  nfs:
    path: /gitlab/gitaly
    server: 10.10.0.15
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem
  storageClassName: 'cbs'
  • storageClassName 我使用默认的 StorageClass 名称,因为部署配置里没指定 storageClass 会自动给 pvc 加上默认的,如果 pv 跟 pvc 的 storageClassName 不匹配,会导致调度失败。

上述 pv 和 secret 是 gitlab 应用依赖的,需要在部署 gitlab 之前先 apply 到集群:

代码语言:shell
AI代码解释
复制
kubectl apply -f gitlab-psql-password-secret.yaml
kubectl apply -f minio-nfs-pv.yaml
kubectl apply -f gitaly-nfs-pv.yaml

安装 gitlab

使用 helm 安装:

代码语言:shell
AI代码解释
复制
helm upgrade -n gitlab --install gitlab -f gitlab.yaml ./gitlab

检查 gitlab 组件是否正常运行:

代码语言:shell
AI代码解释
复制
$ kubectl -n gitlab get pod
NAME                                          READY   STATUS      RESTARTS   AGE
gitlab-gitaly-0                               1/1     Running     0          8m
gitlab-gitlab-exporter-7bc89d678-d4c7h        1/1     Running     0          8m
gitlab-gitlab-shell-77d99c8b45-kbfmd          1/1     Running     0          8m
gitlab-kas-549b4cf77c-thjrv                   1/1     Running     0          8m
gitlab-migrations-1-2pnx7                     0/1     Completed   0          8m
gitlab-minio-7b57f77ccb-g9mqb                 1/1     Running     0          8m
gitlab-minio-create-buckets-1-hvz9g           0/1     Completed   0          6m
gitlab-redis-master-0                         2/2     Running     0          6m
gitlab-sidekiq-all-in-1-v2-5f8c64987f-jhtv9   1/1     Running     0          8m
gitlab-toolbox-66bbb6d4dc-qff92               1/1     Running     0          8m
gitlab-webservice-default-868fbf9fbc-9cb8g    2/2     Running     0          8m

后续想卸载可使用这个命令: helm -n gitlab uninstall gitlab

暴露 Gitlab 服务

查看 service:

代码语言:shell
AI代码解释
复制
$ kubectl -n gitlab get service
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                               AGE
gitlab-gitaly               ClusterIP   None             <none>        8075/TCP,9236/TCP                     8m
gitlab-gitlab-exporter      ClusterIP   172.16.189.22    <none>        9168/TCP                              8m
gitlab-gitlab-shell         ClusterIP   172.16.251.106   <none>        22/TCP                                8m
gitlab-kas                  ClusterIP   172.16.245.70    <none>        8150/TCP,8153/TCP,8154/TCP,8151/TCP   8m
gitlab-minio-svc            ClusterIP   172.16.187.127   <none>        9000/TCP                              8m
gitlab-redis-headless       ClusterIP   None             <none>        6379/TCP                              8m
gitlab-redis-master         ClusterIP   172.16.156.40    <none>        6379/TCP                              8m
gitlab-redis-metrics        ClusterIP   172.16.196.188   <none>        9121/TCP                              8m
gitlab-webservice-default   ClusterIP   172.16.143.4     <none>        8080/TCP,8181/TCP,8083/TCP            8m

其中带 webservice 的 service 是 Gitlab 访问总入口,需要特别注意的是,端口是 8181,不是 8080 那个。

我使用 istio-ingressgateway,Gateway 本身已提前监听好 443 并挂好证书:

代码语言:shell
AI代码解释
复制
kubectl -n external get gw imroc -o yaml
代码语言:yaml
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: imroc
  namespace: external
spec:
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: HTTPS-443-pp0c
      protocol: HTTPS
    hosts:
    - imroc.cc
    - "*.imroc.cc"
    tls:
      mode: SIMPLE
      credentialName: imroc-cc-crt-secret

只需创建一个 VirtualService,将 gitlab 服务与 Gateway 绑定,暴露出去。

gitlab-vs.yaml:

代码语言:yaml
AI代码解释
复制
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: gitlab-imroc-cc
  namespace: gitlab
spec:
  gateways:
  - external/imroc
  hosts:
  - 'gitlab.imroc.cc'
  http:
  - route:
    - destination:
        host: gitlab-webservice-default
        port:
          number: 8181 # 注意这里端口是 8181,不是 8080

执行创建:

代码语言:shell
AI代码解释
复制
kubectl apply -f gitlab-vs.yaml

除了暴露 https,如果需要通过 ssh 协议来 push 或 pull 代码,需要暴露 22 端口,使用单独的 Gateway 对象来暴露(绑定同一个 ingressgateway),shell-gw.yaml:

代码语言:yaml
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: shell
  namespace: external
spec:
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  servers:
  - port:
      number: 22
      name: shell
      protocol: TCP
    hosts:
    - "*"

创建 Gateway:

代码语言:shell
AI代码解释
复制
kubectl apply -f shell-gw.yaml

为 22 端口创建 VirtualService 并绑定 Gateway,gitlab-shell-vs.yaml:

代码语言:yaml
AI代码解释
复制
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: gitlab-shell
  namespace: gitlab
spec:
  gateways:
  - external/shell
  hosts:
  - '*'
  tcp:
  - match:
    - port: 22
    route:
    - destination:
        host: gitlab-gitlab-shell
        port:
          number: 22

创建 VirutalService:

代码语言:shell
AI代码解释
复制
kubectl apply -f gitlab-shell-vs.yaml

获取 root 初始密码并登录

服务暴露出来之后,确保 DNS 也正确配置,解析到网关的 IP,我这里则是 istio-ingressgateway 对应的 CLB 的外网 IP。

在浏览器中打开 gitlab 外部地址:

自动跳转到登录页面,管理员用户名为 root,密码可通过自动生成的 secret 获取:

代码语言:shell
AI代码解释
复制
$ kubectl -n gitlab get secret | grep initial-root-password
gitlab-gitlab-initial-root-password   Opaque                                1      38m
$ kubectl -n gitlab get secret gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 -d
kxe***********************************************************k5

拿到密码后输入然后登录即可。

部署并注册 gitlab-runner

Gitlab 有很强大的 CI 功能,我们可以在集群中也部署一下 gitlab-runner,如果为代码仓库设置了 CI 流程,可以自动将任务分发给 gitlab-runner 去执行 CI 任务,每个任务再创建单独的 Pod 去运行:

下面介绍 gitlab-runner 的部署与注册方法。

获取注册 token

在【Admin】-【Overview】-【Runners】 复制注册 token:

也可以通过 kubectl 获取 secret 得到 token:

代码语言:shell
AI代码解释
复制
$ kubectl -n gitlab get secret gitlab-gitlab-runner-secret -o jsonpath='{.data.runner-registration-token}' | base64 -d
AF************************************************************kF

准备配置

gitlab-runner.yaml:

代码语言:yaml
AI代码解释
复制
runnerRegistrationToken: AF************************************************************kF
gitlabUrl: 'https://gitlab.imroc.cc'
runners:
  locked: false
  config: |
    [[runners]]
      [runners.kubernetes]
      image = "ubuntu:20.04"

注意:

  • runnerRegistrationToken 替换为上一步获取到的 token。
  • gitlabUrl 替换为 gitlab 访问地址。

安装 gitlab-runner

使用 helm 安装:

代码语言:shell
AI代码解释
复制
helm upgrade -n gitlab --install gitlab-runner -f gitlab-runner.yaml ./gitlab-runner

检查 runner 是否正常运行:

代码语言:shell
AI代码解释
复制
$ kubectl -n gitlab get pod | grep runner
gitlab-runner-6fb794bb6b-s6n5h                1/1     Running     0          2m17s

后续想卸载可使用这个命令: helm -n gitlab uninstall gitlab-runner

检查是否注册成功

进入 Gitlab 【Admin】-【Overview】-【Runners】页面检查 runner 是否注册成功:

附录

测试场景

如果只是测试下 Gitlab,不长期使用,在不需要的时候可以把所有副本缩为 0 以节约成本:

代码语言:shell
AI代码解释
复制
kubectl get deployments.v1.apps | grep -v NAME | awk '{print $1}' | xargs -I {} kubectl scale deployments.v1.apps/{} --replicas=0
kubectl get sts | grep -v NAME | awk '{print $1}' | xargs -I {} kubectl scale sts/{} --replicas=0

在需要用的时候置为 1:

代码语言:shell
AI代码解释
复制
kubectl get deployments.v1.apps | grep -v NAME | awk '{print $1}' | xargs -I {} kubectl scale deployments.v1.apps/{} --replicas=1
kubectl get sts | grep -v NAME | awk '{print $1}' | xargs -I {} kubectl scale sts/{} --replicas=1

如果使用了 https://github.com/tke-apps/gitlab 这个仓库,可以直接用以下命令缩0:

代码语言:shell
AI代码解释
复制
make scale0

扩到1:

代码语言:shell
AI代码解释
复制
make scale1

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
我的第一个 Python 小项目,开放完整代码
这是4月29日,我发布的第一个Python小项目,文本句子基于关键词的KWIC显示,没看到粉丝朋友可以看看下面介绍,知道的,直接跳到文章的求解分析和代码部分。
double
2021/06/01
6250
我的第一个 Python 小项目,开放完整代码
新手如何发布第一个Python项目开源包?这里有一份详细指南
作者以 SciTime 项目(一个对算法训练时间进行估计的包)的发布为例,详细解释了发布的每个步骤。
机器之心
2019/06/14
8380
新手如何发布第一个Python项目开源包?这里有一份详细指南
我的第五个项目:实现一个文本定位器
查找某目录下所有文件,包含指定查找串的文件。注意,这里不仅仅匹配文件名,而是搜索文件的内容。
double
2022/01/26
3310
循环神经网络教程第二部分-用python,numpy,theano实现一个RNN
作者:徐志强 链接:https://zhuanlan.zhihu.com/p/22289383 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 在本部分,我们将会从头开始用python实现一个完整的循环神经网络,然后hui用Theano(一个可以在GPU上进行运算的库)对实现进行优化。我会跳过一些对理解循环神经网络不是很重要的代码片段,但完整的代码可以在这里找到。
bear_fish
2018/09/19
7250
循环神经网络教程第二部分-用python,numpy,theano实现一个RNN
Python 自然语言处理实用指南:第一、二部分
在本节中,您将在自然语言处理(NLP)的背景下了解 PyTorch 1.x 的基本概念。 您还将学习如何在计算机上安装 PyTorch 1.x,以及如何使用 CUDA 加快处理速度。
ApacheCN_飞龙
2023/04/27
1.4K0
这42个Python小例子,太走心~
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(group)。比如:^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码
double
2019/12/05
9980
建议收藏,22个Python迷你项目(附源码)
目标:创建一个命令行游戏,游戏者可以在石头、剪刀和布之间进行选择,与计算机PK。如果游戏者赢了,得分就会添加,直到结束游戏时,最终的分数会展示给游戏者。
小F
2021/03/01
9830
如何微调GPT-2生成高质量的歌词
生成预训Transformer2 (GPT-2),顾名思义,是基于Transformer 的。它使用注意力机制,这意味着它学会关注与上下文最相关的前一个单词,以便预测下一个单词。
deephub
2021/05/18
1.2K0
【敬初学者】Python基础学完了,该怎么知道自己学的怎么样呢?十个经典实战小项目附源码
初学者要想成功,一句话,大量的实操,大量的练,乍一看我的这个答案似乎有点敷衍,但是这确实是我接触Python以来,总结出的最有价值的经验,接下来分享我自己初学时用来练手的经典实战小项目,适合初学者敲的代码。
全栈程序员站长
2022/08/31
4490
【敬初学者】Python基础学完了,该怎么知道自己学的怎么样呢?十个经典实战小项目附源码
无需训练 RNN 或生成模型,快速编写一个 AI “讲故事”项目
这段日子里,我们都被隔离了,就特别想听故事。然而,我们并非对所有故事都感兴趣,有些人喜欢浪漫的故事,他们肯定不喜欢悬疑小说,而喜欢推理小说的人肯定对浪漫的爱情故事没兴趣。看看周围,还有谁比AI更擅长讲我们喜欢的故事呢?
用户1737318
2020/05/19
1.3K0
无需训练 RNN 或生成模型,快速编写一个 AI “讲故事”项目
Doc2vec预测IMDB评论情感
本文内容源自于国外2015年的一篇博客,中文翻译可以在伯乐在线看到。可以整体了解一些word2vec和doc2vec的使用方法,但是由于时间过去很久了,gensim的api也发生了变化,因此特意重新在源代码基础上做了修改,也回顾一下word2vec和doc2vec的使用 环境要求 python2.7或python3+ gensim numpy matplotlib 情感分析基本原理 情感分析(Sentiment analysis)是自然语言处理(NLP)方法中常见的应用,尤其是以提炼文本情绪内容为目的的分类
听城
2018/04/27
3.2K1
Doc2vec预测IMDB评论情感
Python 自然语言处理实用指南:第三部分
在本节中,我们将使用 PyTorch 中可用的各种自然语言处理(NLP)技术来构建各种实际 -使用 PyTorch 的世界应用。 情感分析,文本摘要,文本分类以及使用 PyTorch 构建聊天机器人应用是本节将介绍的一些任务。
ApacheCN_飞龙
2023/04/27
1.8K0
使用PyTorch建立你的第一个文本分类模型
我总是使用最先进的架构来在一些比赛提交模型结果。得益于PyTorch、Keras和TensorFlow等深度学习框架,实现最先进的体系结构变得非常容易。这些框架提供了一种简单的方法来实现复杂的模型体系结构和算法,而只需要很少的概念知识和代码技能。简而言之,它们是数据科学社区的一座金矿!
磐创AI
2020/03/04
2.2K0
Transformers 4.37 中文文档(一)
下表表示库中对这些模型的当前支持,它们是否有 Python 分词器(称为“slow”)。由🤗 Tokenizers 库支持的“fast”分词器,它们是否在 Jax(通过 Flax)、PyTorch 和/或 TensorFlow 中有支持。
ApacheCN_飞龙
2024/06/26
1.2K0
Transformers 4.37 中文文档(一)
教程 | 在Python和TensorFlow上构建Word2Vec词嵌入模型
选自adventuresinmachinelearning 机器之心编译 参与:李诗萌、刘晓坤 本文详细介绍了 word2vector 模型的模型架构,以及 TensorFlow 的实现过程,包括数据
机器之心
2018/05/09
1.8K0
教程 | 在Python和TensorFlow上构建Word2Vec词嵌入模型
一键式文本纠错工具,整合了BERT、ERNIE等多种模型,让您立即享受纠错的便利和效果
pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正,python3开发。实现了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型的文本纠错,并在SigHAN数据集评估各模型的效果。
汀丶人工智能
2023/08/13
4.7K0
一键式文本纠错工具,整合了BERT、ERNIE等多种模型,让您立即享受纠错的便利和效果
适用于NLP自然语言处理的Python:使用Facebook FastText库
在本文中,我们将研究FastText,它是用于单词嵌入和文本分类的另一个极其有用的模块。
拓端
2020/09/25
9870
用Python从头开始构建一个简单的聊天机器人(使用NLTK)
我相信你一定听说过Duolingo:一款流行的语言学习应用。它以其创新的外语教学风格而广受欢迎,其概念很简单:一天五到十分钟的互动训练就足以学习一门语言。
liuxuewen
2018/10/12
3.9K0
用Python从头开始构建一个简单的聊天机器人(使用NLTK)
实用的AI:使用OpenAI GPT2,Sentence BERT和Berkley选区解析器从任何内容自动生成对或错问题
在本文中,将介绍如何使用最新的AI算法自动生成“对或错”问题,例如您在学校教科书中看到的问题。
代码医生工作室
2020/04/02
9430
RNN示例项目:详解使用RNN撰写专利摘要
我第一次尝试研究RNN时,我试图先学习LSTM和GRU之类的理论。在看了几天线性代数方程之后(头疼的要死),我在Python深度学习中发生了以下这段话:
AiTechYun
2018/12/12
1.8K0
RNN示例项目:详解使用RNN撰写专利摘要
推荐阅读
相关推荐
我的第一个 Python 小项目,开放完整代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档