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

本文介绍了如何在已有Kubernetes集群上搭建GitLab服务,包括选择合适的gitlab-ce镜像,创建数据卷以持久化数据,编写部署脚本,设置服务和路由脚本以配置域名访问,并讨论了登录及配置GitLab的过程。此外,还提到了GitLabAPI的使用注意事项以及业务微服务上传代码时遇到的域名识别问题和解决方案。
摘要由CSDN通过智能技术生成

搭建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中指定域名为your-host.com.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.10.5.5 your-host.com.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属性。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祺稷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值