kubernetes搭建GitLab并提供本地域名服务及业务微服务接口集成GitLab

news2024/9/30 1:37:40

目录

  • 搭建GitLab服务
    • 镜像准备
    • 数据卷脚本
    • 部署脚本
    • 服务脚本
    • 路由脚本
    • 登录及配置
  • GitLab接口及业务微服务上传代码
    • GitLab接口注意事项
    • 业务微服务上传代码注意事项

搭建GitLab服务

        业务管理平台需要将本地的代码上传并进行版本管理,选择搭建gitlab私服较为合理,下面就介绍下在已有kubernetes集群上如何搭建gitlab私服及配置域名提供服务过程。

镜像准备

        选择gitlab-ce镜像,登录dockerhub 搜索 gitlab/gitlab-ce,选择合适版本,这里需要注意的是,由于我们后续要使用gitlab的api集成,在使用api中需要用到access_token,而据官方文档说明,创建永久token能力在15.4之后已不推荐使用,并计划在16.0删除。我们考虑集成的方便性,可能要用到永久的token能力,所以这里选择了15.11.6-ce.0 。可以直接使用dockerhub,考虑拉取速度也可以pull到本地并上传harbor私库。在从dockerhub拉取本地时,如果速度过慢,可以注册阿里云账号,添加加速器,详情参考 Docker镜像加速。
        准备好镜像之后,就可以编写kubernetes脚本了,我们要把gitlab的数据和配置进行持久化保存,所以需要创建两个持久卷PVC,分别为gitlab-data和gitlab-config。

数据卷脚本

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: gitlab-data
  namespace: gitlab
  annotations:
    kubesphere.io/creator: aaaaaa
    pv.kubernetes.io/bind-completed: 'yes'
    pv.kubernetes.io/bound-by-controller: 'yes'
    volume.beta.kubernetes.io/storage-provisioner: dev-nfs-storage
  finalizers:
    - kubernetes.io/pvc-protection
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  volumeName: pvc-15d9ceca-0416-4fa0-a78c-72cc349ff4ea
  storageClassName: managed-nfs-storage
  volumeMode: Filesystem
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: gitlab-config
  namespace: gitlab
  annotations:
    kubesphere.io/creator: aaaaaa
    pv.kubernetes.io/bind-completed: 'yes'
    pv.kubernetes.io/bound-by-controller: 'yes'
    volume.beta.kubernetes.io/storage-provisioner: dev-nfs-storage
  finalizers:
    - kubernetes.io/pvc-protection
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  volumeName: pvc-d7a420ff-6220-49ff-863b-8dfc04cee692
  storageClassName: managed-nfs-storage
  volumeMode: Filesystem

部署脚本

创建部署时,把容器中gitlab的数据(/var/opt/gitlab)和配置(/etc/gitlab)分别挂载到卷 gitlab-data 和 gitlab-config上。同时需要注意的是通过环境变量 GITLAB_ROOT_PASSWORD 来指定默认的root账号登录密码,密码不能含有常见词汇及连续数字,否则创建会失败。gitlab比较耗内存,建议使用8G。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: gitlab15
  namespace: gitlab
  labels:
    app: gitlab15
  annotations:
    deployment.kubernetes.io/revision: '32'
    kubesphere.io/creator: aaaaaa
    kubesphere.io/description: 15.11.6-ce.0
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gitlab15
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: gitlab15
      annotations:
        kubesphere.io/restartedAt: '2023-07-28T02:45:21.829Z'
    spec:
      volumes:
        - name: gitlab-data
          persistentVolumeClaim:
            claimName: gitlab-data
        - name: gitlab-config
          persistentVolumeClaim:
            claimName: gitlab-config
      containers:
        - name: container-rc2xwo
          image: gitlab/gitlab-ce:15.11.6-ce.0 # 这里可以指定上边准备的harbor私库
          ports:
            - name: http-1
              containerPort: 80
              protocol: TCP
          env:
            - name: GITLAB_ROOT_PASSWORD
              value: Xxx@12axxfadfafeetx  #这里是默认密码
          resources:
            limits:
              cpu: '4'
              memory: 8Gi
              nvidia.com/gpu: '0'
            requests:
              nvidia.com/gpu: '0'
          volumeMounts:
            - name: gitlab-data
              mountPath: /var/opt/gitlab
            - name: gitlab-config
              mountPath: /etc/gitlab
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      imagePullSecrets:
        - name: harbor-secret
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

服务脚本

        服务中通过标签gitlab15选择上述部署。

kind: Service
apiVersion: v1
metadata:
  name: gitlab-service
  namespace: gitlab
  labels:
    app: gitlab-service
  annotations:
    kubesphere.io/creator: aaaaaa
spec:
  ports:
    - name: http-1
      protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: gitlab15
  clusterIP: xx.xx.xxx.xx  #会自动生成
  clusterIPs:
    -  xx.xx.xxx.xx
  type: ClusterIP
  sessionAffinity: None
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack

路由脚本

        创建Ingress,关联上述服务及端口,Ingress中指定域名为ai-gitlab.qm.cn。配置之后登陆时即访问该域名。

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: ai-gitlab
  namespace: gitlab
  annotations:
    kubesphere.io/creator: aaaaaa
    nginx.ingress.kubernetes.io/proxy-body-size: 60M
    nginx.ingress.kubernetes.io/proxy-connect-timeout: '300'
    nginx.ingress.kubernetes.io/proxy-read-timeout: '300'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '300'
spec:
  rules:
    - host: your-host.com.cn  #你的域名
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: gitlab-service
                port:
                  number: 80

        由于your-host.com.cn是本地域名,需要配置hosts(C:\Windows\System32\drivers\etc\hosts)文件才能访问。hosts文件中添加 集群节点ip和域名的对应关系,如:10.140.56.5 ai-gitlab.qm.cn

        另外Ingress中要指定请求的body-size,否则上传文件时会报错(Error writing request body to server)。

登录及配置

        上述脚本运行后,正常启动,就可以访问域名http://your-host.com.cn/来登录gitlab了。输入默认用户root和部署时指定的默认密码,即可登录。
在这里插入图片描述
        登录后,我们创建项目,发现项目的clone地址为服务名+部署pod名,而不是我们指定的域名,这时我们需要修改gitlab的配置,登录到docker内部,这里我们直接从集群连接终端即可。找到/etc/gitlab下的gitlab.rb文件,vi gitlab.rb 进行编辑,找到 external_url 取消注释并修改值为 我们的域名 http://your-host.com.cn。这样再次查看项目的下载地址,就已经变更为我们指定的域名了。至此我们在本地(配置了hosts)和gitlab交互(clone,pull,push)都已OK。

GitLab接口及业务微服务上传代码

GitLab接口注意事项

        业务微服务需要通过接口在gitlab上创建用户、组、项目等,需要调用gitlab的API。这里主要注意的是:

  1. 所有api都要使用access_token进行认证。

  2. 创建用户的时候,必须要管理员账号才有权限。(详情参考官网 Users API
    | GitLab)

  3. access_token 有有效期,且在16.0及以后的版本,不支持永久有效。(详情参考官网 Project
    access tokens | GitLab)

  4. api的地址为域名/api/version/xxx, 如
    http://your-host.com.cn/api/v4/projects (详情参考官网 REST API | GitLab)

业务微服务上传代码注意事项

        上述我们讲到过在本地(即配置了hosts的机器)可以正常操作gitlab本地私库(your-host.com.cn),但是我们在微服务上传和下载代码时,实际是在微服务后端,即微服务所在的pod容器中,那么问题也就来了,这个容器会识别your-host.com.cn吗,肯定是不会的(实际验证也报了错误 java.net.UnknownHostException: your-host.com.cn),那我们怎么让容器能识别呢,也就是怎么能类似在容器的etc/hosts中添加 your-host.com.cn呢?这里我们可以通过kubernetes中的 HostAliases 来添加。在与container同级下增加 HostAliases属性。

在这里插入图片描述

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

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

相关文章

windows 删除无法删除的文件

有两种原因: 文件被占用文件无权限 解决方案 通用解决方案是进入安全模式进行删除 安全模式: 不会启动非必要的进程有最高的系统权限 进入系统配置 安全引导,重启 删除文件 修改系统配置为正常启动 重启

Springer独立出版 | 2023年触觉与虚拟现实国际会议(ICHVR 2023)

会议简介 Brief Introduction 2023年触觉与虚拟现实国际会议(ICHVR 2023) 会议时间:2023年12月15日-17日 召开地点:中国北海 大会官网:www.ichvr.org 2023年触觉与虚拟现实国际会议(ICHVR 2023)由东南大学、上海交通大学联合主办;…

Mybatis 新增/批量新增, 拿到返回的自增主键ID

单个新增 &#xff1a; /** * 插入菜单 * param menuInfo * return */ int insertMenuInfo(MenuInfo menuInfo); xml&#xff1a; <insert id"insertMenuInfo" parameterType"com.XXXX..MenuInfo" keyProperty"id&quo…

MyBatis 快速入门【下】

&#x1f600;前言 本篇博文是一些功能的实现和实现日志输出&#xff0c;希望能够帮到你&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是…

SpringBoot 对接微信公众号模板消息通知

效果图见测试结果&#xff0c;有问题评论 模板消息 开通模板消息功能 登录微信公众平台开通模板消息功能 (未开通时) 添加模板消息 审核通过后&#xff0c;登录微信公众平台&#xff0c;点击 广告与服务 --> 模板消息公众号如果未设置服务类目&#xff0c;则需要先设置服…

安卓抓包神奇黄鸟HttpCanary安装配置及使用教程

1、下载安装包 黄鸟抓包下载地址 2、安装下载的apk 3、证书安装问题 vivo手机我安装时打开黄鸟app&#xff0c;会直接弹出&#xff0c;直接安装即可 其他手机&#xff0c;需要去系统设置中安装 3.1 搜索 证书&#xff0c;选择CA证书 3.2 进行本人操作验证 3.3 安装HttpCa…

MySQL InnoDB死锁原因及改善建议(InnoDB Deadlocks)

死锁是事务型数据库中一种现象&#xff0c;为了在高并发环境下不出错&#xff0c;数据库引入了"锁"这一数据结构来控制资源的并发访问&#xff0c;但也会导致死锁。 目录 一、死锁概念 1.1 死锁的原因 1.2 死锁监测 二、死锁演示 2.1 死锁生成过程 2.2 死锁信息查看 …

cnvd水证书

日常水个证书 本人比较菜&#xff0c;挖cnvd总是挖不倒漏洞&#xff0c;只能从弱口令入手了&#xff0c;一般使用fofa脚本批量跑。 过程&#xff1a; 日常在佛法中我们总是会遇见设备弱口或系统弱口令 一般是看登录成功的特征和口令&#xff0c;写一个对应的弱口令检测脚本…

OceanMind海睿思获评中国信通院“内审数字化产品评测”卓越级(最高级)!

2023年7月27日&#xff0c;由中国内部审计协会、中国通信标准化协会指导&#xff0c;中国信息通信研究院主办的第二届数字化审计论坛在北京成功召开。 大会聚焦内部审计数字化领域先进实践、研究成果、行业发展举措&#xff0c;重磅发布了多项内部审计数字化领域的最新研究和实…

基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

我的MacBook Pro:维护心得与实用技巧

文章目录 我的MacBook Pro&#xff1a;维护心得与实用技巧工作电脑概况&#xff1a;MacBook Pro 2019款 16 寸日常维护措施个人维护技巧其他建议 我的MacBook Pro&#xff1a;维护心得与实用技巧 无论是学习还是工作&#xff0c;电脑都是IT人必不可少的重要武器。一台好电脑除…

优化基于tcp,socket的ftp文件传输程序

原始程序&#xff1a; template_ftp_server_old.py&#xff1a; import socket import json import struct import os import time import pymysql.cursorssoc socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOST 192.168.31.111 PORT 4101 soc.bind((HOST,PORT)) p…

03-树1 树的同构(c++)

03-树1 树的同构 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2&#xff0c;则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的&#xff0c;因为我们把其中一棵树的结点A、B、G的左右孩子互换后&#xff0c;就得到另外一棵树。而图2就不是同构的。 现…

[Linux]线程基本知识

概念 进程 一个正在执行的程序&#xff0c;它是资源分配的最小单位 进程中的事情需要按照一定的顺序逐个进行 进程出现了很多弊端: 一是由于进程是资源拥有者&#xff0c;创建、撤消与切换存在较大的时空开销&#xff0c;因此需要引入轻型进程&#xff1b; 二是由于对称多…

USB3.0之设备检测

1 USB超速SerDes原理介绍 1.1 SerDes Rx.Detect SerDes Rx.Detect的原理比较简单&#xff0c;就是通过一个逻辑电路比较RC时间常数的大小。 当Rx不存在时&#xff0c;RC时间常数较小。当Rx存在时&#xff0c;RC时间常数较大。 下面将详细描述其原理。 Figure 1-1 USB 3.0电缆 …

App 测试工具大全,收藏这篇就够了

随着移动互联网的高速发展&#xff0c;App应用非常火&#xff0c;测试工程师也会接触到各种app应用。除了人工测试之外&#xff0c;也可以通过一些测试工具来提高我们的测试效率&#xff0c;以下对于我用过或听过的app测试工具做了一个统一整理&#xff0c;欢迎补充。 一、APP自…

vue的事件绑定和修饰符

&#x1f600;前言 本片文章是vue系列第3篇整理了vue的事件绑定和修饰符以及注意事项和代码演示 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的…

Java | 继承、多态、抽象类与接口

目录 一、类的继承 二、Object类 2.1 getClass()方法 2.2 toString()方法 2.3 equals()方法 三 、对象类型的转换 3.1 向上转换 3.2 向下转型 四、使用instanceof关键字判断对象类型 五、方法的重载 六、final关键字 6.1 final变量 6.2 final方法 6.3 final类 七…

分冶算法 剑指 07 重建二叉树 排序算法:剑指45 把数组排成最小的数 10-I 斐波那契数列

来记录几个注意事项 1.vector容器里利用find&#xff08;&#xff09;函数 不同于map&#xff08;map有find方法&#xff09;&#xff0c;vector本身是没有find这一方法&#xff0c;其find是依靠algorithm来实现的。 所以要包含头文件 #include <iostream> #include <…

线程字符串传递方式

//扩展作业--参数传递 //思路: 当子线程退出的时候,pthread_exit((void *)88)--->传递给主线程 pthread_join(tid,(void *)&ret1) //函数---参数 #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include …