在Kubernetes上部署Gitlab

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
简介: kubernetes系列

上一篇,简单的从Gitlab CI/CD方法论中探索实践中大致了解Gitlab在CI/CD功能的基本介绍,现在我们通过在K8s集群内安装GitlabGitlab Runner来为深入探索Gitlab持续集成做好前期准备,首先我们要在集群内安装Gitlab.

集群环境

K8s的集群版本为1.11.5,CNI使用的是Flannel, DNS为KubeDNS

☸️  ACK🔥 devops  ~  🐳 👉 k cluster-info
Kubernetes master is running at https://192.168.99.128:6443
Heapster is running at https://192.168.99.128:6443/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://192.168.99.128:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
monitoring-influxdb is running at https://192.168.99.128:6443/api/v1/namespaces/kube-system/services/monitoring-influxdb/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
☸️  ACK🔥 devops  ~  🐳 👉 k get nodes
NAME                 STATUS   ROLES    AGE   VERSION
cn-beijing.i-2ze01   Ready    master   1y    v1.11.5
cn-beijing.i-2ze02   Ready    master   1y    v1.11.5
cn-beijing.i-2ze03   Ready    master   1y    v1.11.5
cn-beijing.i-2ze04   Ready    <none>   1y    v1.11.5
cn-beijing.i-2ze05   Ready    <none>   1y    v1.11.5

通过学习Github上一个开源项目Dockerized GitLab在kubernetes上进行GitLab-CE的安装部署,在部署Gitlab的之前,我们需要先部署其依赖的RedisPostgreSQL,然后才能正常的运行gitlab. 这个开源项目中资源配置清单使用的是ReplicationController,这里我将修改使用Deployment控制器:

配置Redis服务

以为redis服务是提供给Gitlab服务使用,并不需要暴露在集群外部,因此我们在gitlab<->redis之间调用的时候,采用内部通信的方式,准备redis的配置清单redis.deployment.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: gitlab-redis # deployment的名字
  namespace: devops # 部署在devops namespace里面
  labels:
    name: gitlab-redis
spec:
  replicas: 1
  template:
    metadata:
      name: gitlab-redis # 约定gitlab-redis的deployment的模板名
      labels:
        name: gitlab-redis
    spec:
      containers:
      - name: redis # pod内redis的容器名
        image: redis:5.0.9 #也可以使用sameersbn的redis镜像,此处我们使用官方的镜像
        imagePullPolicy: IfNotPresent # 镜像的拉取策略
        ports:
        - name: redis
          containerPort: 6379
        volumeMounts:
        - mountPath: /var/lib/redis # 需要持久化的数据目录
          name: data
        livenessProbe: # 进行存活性监测
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 30 # 在启动存活性探测之前等待的秒数
          timeoutSeconds: 5 # 探测的超时时长
        readinessProbe:
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: data
        emptyDir: {}

---
apiVersion: v1
kind: Service
metadata:
  name: gitlab-redis-svc
  namespace: devops
  labels:
    name: gitlab-redis-svc
spec:
  ports:
    - name: redis
      port: 6379
      targetPort: redis
  selector:
    name: gitlab-redis

配置postgresql服务

与redis服务一样,我们准备postgresql服务的配置清单postgresql.deployment.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: postgresql
  namespace: devops
  labels:
    name: postgresql
spec:
  template:
    metadata:
      name: postgresql
      labels:
        name: postgresql
    spec:
      containers:
      - name: postgresql
        image: sameersbn/postgresql # latest
        imagePullPolicy: IfNotPresent
        env:
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: gitlab_postgresql
        - name: DB_NAME
          value: gitlab_production
        - name: DB_EXTENSION
          value: pg_trgm
        ports:
        - name: postgres
          containerPort: 5432
        volumeMounts:
        - mountPath: /var/lib/postgresql
          name: data
        livenessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: devops
  labels:
    name: postgresql
spec:
  ports:
    - name: postgres
      port: 5432
      targetPort: postgres
  selector:
    name: postgresql

配置Gitlab服务

gitlab服务的部署就相对复杂一些,要添加正确的redis和postgresql的链接信息,同时为了在集群外部访问gitlab,我们需要给gitlab配置一个ingress,我们使用的环境是ACK,所以最后的时候我们需要给gitlab的服务分配一个ACK上绑定的测试域名,假设我们这里ACK的测试域名为*.cloudnativecosystem.cn-beijing.alicontainer.com,准备gitlab服务的配置清单gitlab.deployment.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: gitlab
  namespace: devops
  labels:
    name: gitlab
spec:
  template:
    metadata:
      name: gitlab
      labels:
        name: gitlab
    spec:
      containers:
      - name: gitlab
        image: sameersbn/gitlab:11.8.1
        imagePullPolicy: IfNotPresent
        env:
        - name: TZ # 容器时区
          value: Asia/Shanghai
        - name: GITLAB_TIMEZONE # 配置gitlab的时区
          value: Beijing
        - name: GITLAB_SECRETS_DB_KEY_BASE # 用于加密数据库中的CI机密变量以及导入凭据。如果丢失或旋转了此机密,则将无法使用现有的CI机密
          value: PjqzXnqkv9rjKWnTqhmgKLhtbM3sCKVH9bhHrmKRpnHXttd3hRjF4zXNjxztKKsC # 可以使用`pwgen -Bsv1 64`生成随机的字符串给变量
        - name: GITLAB_SECRETS_SECRET_KEY_BASE # 用于密码重置链接和其他“标准”身份验证功能。如果丢失或旋转了此机密,电子邮件中的密码重置令牌将重置。
          value: 3Tgk4WgqcK4JFn3gwMjNcgzTwkfhpTrL4wvmwhcmTRcPwqHzT4pcmgfsTvfpzpLV
        - name: GITLAB_SECRETS_OTP_KEY_BASE # 用于加密数据库中的2FA机密。如果您丢失或旋转了此机密,则您的所有用户都将无法使用2FA登录
          value: CdM9VprWKpqsdmw4V3tmcFwkzNVmHV9Kc3pLR7WtpVgHtFKmfCkMfJMW9TNw7pf7
        - name: GITLAB_ROOT_PASSWORD
          value: P@ssw0rd
        - name: GITLAB_ROOT_EMAIL
          value: cloudnativecosystem@******.cn-beijing.alicontainer.com
        - name: GITLAB_HOST
          value: code.******.cn-beijing.alicontainer.com
        - name: GITLAB_PORT
          value: "80"
        - name: GITLAB_SSH_PORT
          value: "30003"
        - name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
          value: "true"
        - name: GITLAB_NOTIFY_PUSHER
          value: "false"
        - name: GITLAB_BACKUP_SCHEDULE # 更多变量信息参考https://github.com/sameersbn/docker-gitlab#quick-start
          value: daily
        - name: GITLAB_BACKUP_TIME
          value: 01:00
        - name: DB_TYPE
          value: postgres
        - name: DB_HOST
          value: postgresql
        - name: DB_PORT
          value: "5432"
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: P@ssw0rd
        - name: DB_NAME
          value: gitlab_production
        - name: REDIS_HOST
          value: gitlab-redis-svc
        - name: REDIS_PORT
          value: "6379"
        ports:
        - name: http
          containerPort: 80
        - name: ssh
          containerPort: 22
        volumeMounts:
        - mountPath: /home/git/data
          name: data
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 180
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
          - name: data
            emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: gitlab
  namespace: devops
  labels:
    name: gitlab
spec:
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: ssh
      port: 22
      targetPort: 30003
  selector:
    name: gitlab

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/service-weight: ''
  name: gitlab
  namespace: devops
spec:
  rules:
    - host: code.******.cn-beijing.alicontainer.com
      http:
        paths:
          - backend:
              serviceName: gitlab
              servicePort: 80
            path: /
status:
  loadBalancer: {}

在准备完成所有相关的配置清单文件之后,我们就可以直接创建服务了

☸️  ACK🔥 devops  ~/v1.11.5/gitlab  🐳 👉 ls -al
total 24
drwxr-xr-x   7 marionxue  staff   224 Oct 24 16:34 .
drwxr-xr-x   5 marionxue  staff   160 Oct 24 20:22 ..
-rw-r--r--   1 marionxue  staff  3631 Oct 24 21:14 gitlab.deployment.yaml
-rw-r--r--   1 marionxue  staff  1460 Oct 24 21:12 postgresql.deployment.yaml
-rw-r--r--   1 marionxue  staff  1397 Oct 24 20:47 redis.deployment.yaml
☸️  ACK🔥 devops  ~/v1.11.5/gitlab  🐳 👉 k apply -f .
deployment.apps/gitlab created
service/gitlab created
ingress.extensions/gitlab created
deployment.apps/postgresql created
service/postgresql created
deployment.apps/gitlab-redis created
service/gitlab-redis-svc created
☸️  ACK🔥 devops  ~/v1.11.5/gitlab  🐳 👉 k get pods
NAME                            READY   STATUS              RESTARTS   AGE
gitlab-7c565f7845-vxzrw         0/1     ContainerCreating   0          12s
gitlab-redis-5d86f5cf95-pr8dp   1/1     Running             0          11s
postgresql-64d79556cf-prqn5     1/1     Running             0          11s

在所有的pods的运行状态为Running的时候,就可以访问gitlab了,如果很久没有运行起来,可以通过kubectl describe/logs进行初步排查。

等待之余,gitlab已经运行起来,我们直接可以通过ingress上配置的路由进行访问了

访问Kubernetes上的GitLab(root/P@ssw0rd)

然后进行一个正常的clone上传和下载操作,首先创建一个代码仓库gitlab-ci-demo

创建一个名为<code>gitlab-ci-demo</code>的仓库

☸️  ACK🔥 devops  ~/v1.11.5/gitlab  🐳 👉 git clone http://code.c33a5017db3924e7a86deeeaca6a706b8.cn-beijing.alicontainer.com/root/gitlab-ci-demo.git
Cloning into 'gitlab-ci-demo'...
warning: You appear to have cloned an empty repository.
☸️  ACK🔥 devops  ~/v1.11.5/gitlab  🐳 👉 cd gitlab-ci-demo
☸️  ACK🔥 devops  ~/v1.11.5/gitlab/gitlab-ci-demo   master  🐳 👉 echo "云原生生态圈" > ./README.md
☸️  ACK🔥 devops  ~/v1.11.5/gitlab/gitlab-ci-demo   master  🐳 👉 git add .
☸️  ACK🔥 devops  ~/v1.11.5/gitlab/gitlab-ci-demo   master ✚  🐳 👉 git commit -am "Update README.MD"
[master (root-commit) cc89857] Update README.MD
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
☸️  ACK🔥 devops  ~/v1.11.5/gitlab/gitlab-ci-demo   master  🐳 👉 git push origin master
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'http://code.c33a5017db3924e7a86deeeaca6a706b8.cn-beijing.alicontainer.com/root/gitlab-ci-demo.git/'
☸️  ACK🔥 devops  ~/v1.11.5/gitlab/gitlab-ci-demo   master  🐳 👉 git push origin master
Username for 'http://code.c33a5017db3924e7a86deeeaca6a706b8.cn-beijing.alicontainer.com': root
Password for 'http://root@code.c33a5017db3924e7a86deeeaca6a706b8.cn-beijing.alicontainer.com':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 241 bytes | 241.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To http://code.c33a5017db3924e7a86deeeaca6a706b8.cn-beijing.alicontainer.com/root/gitlab-ci-demo.git
 * [new branch]      master -> master

至此,我们基本上完成了在k8s上运行gitlab的初步需求。下一步就可以准备Gitlab Runner在k8s上的运行和进行持续集成持续部署的实践了。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
存储 弹性计算 运维
阿里云容器服务Kubernetes版(ACK)部署与管理体验评测
阿里云容器服务Kubernetes版(ACK)是一个功能全面的托管Kubernetes服务,它为企业提供了快速、灵活的云上应用管理能力。
67 1
|
10天前
|
Kubernetes 应用服务中间件 nginx
K8s高可用集群二进制部署-V1.20
2.4 部署Etcd集群 以下在节点1上操作,为简化操作,待会将节点1生成的所有文件拷贝到节点2和节点3. 1. 创建工作目录并解压二进制包 mkdir /opt/etcd/{bin,cfg,ssl} -p tar zxvf etcd-v3.4.9-linux-amd64.tar.gz mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
|
13天前
|
Kubernetes Ubuntu Linux
k8s部署grafana beyla实现app应用服务依赖图可观测
k8s部署grafana beyla实现app应用服务依赖图可观测
24 4
|
7天前
|
消息中间件 Kubernetes Android开发
消息队列 MQ产品使用合集之如何在kubernetes环境里面部署
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
9天前
|
前端开发 Devops 测试技术
阿里云云效产品使用问题之更换所部署的环境关联的ACK集群该如何实现
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
10天前
|
Prometheus 监控 Kubernetes
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
18 0
|
10天前
|
Prometheus 监控 Kubernetes
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
21 0
|
10天前
|
Kubernetes Docker 容器
007.Kubernetes二进制部署Flannel
007.Kubernetes二进制部署Flannel
|
10天前
|
运维 Serverless 开发工具
函数计算产品使用问题之通过GitLab仓库来部署代码,该如何配置GitLab仓库
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
17天前
|
Kubernetes 前端开发 微服务
实操教程丨如何在K8S集群中部署Traefik Ingress Controller
实操教程丨如何在K8S集群中部署Traefik Ingress Controller