64. Gitlab 的安装使用

Gitlab官方提供了 Helm 的方式在 Kubernetes 集群中来快速安装,但是在使用的过程中发现 Helm 提供的 Chart 包中有很多其他额外的配置,所以我们这里使用自定义的方式来安装,也就是自己来定义一些资源清单文件。

Gitlab主要涉及到3个应用:Redis、Postgresql、Gitlab 核心程序,实际上我们只要将这3个应用分别启动起来,然后加上对应的配置就可以很方便的安装 Gitlab 了,我们这里选择使用的镜像不是官方的,而是 Gitlab 容器化中使用非常多的一个第三方镜像:sameersbn/gitlab,基本上和官方保持同步更新,地址:http://www.damagehead.com/docker-gitlab/

如果我们已经有可使用的 Redis 或 Postgresql 服务的话,那么直接配置在 Gitlab 环境变量中即可,如果没有的话就单独部署。

首先部署需要的 Redis 服务,对应的资源清单文件如下:(gitlab-redis.yaml)

  1. apiVersion: apps/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: redis
  5. namespace: kube-ops
  6. labels:
  7. name: redis
  8. spec:
  9. template:
  10. metadata:
  11. name: redis
  12. labels:
  13. name: redis
  14. spec:
  15. containers:
  16. - name: redis
  17. image: sameersbn/redis
  18. imagePullPolicy: IfNotPresent
  19. ports:
  20. - name: redis
  21. containerPort: 6379
  22. volumeMounts:
  23. - mountPath: /var/lib/redis
  24. name: data
  25. livenessProbe:
  26. exec:
  27. command:
  28. - redis-cli
  29. - ping
  30. initialDelaySeconds: 30
  31. timeoutSeconds: 5
  32. readinessProbe:
  33. exec:
  34. command:
  35. - redis-cli
  36. - ping
  37. initialDelaySeconds: 5
  38. timeoutSeconds: 1
  39. volumes:
  40. - name: data
  41. emptyDir: {}
  42. ---
  43. apiVersion: v1
  44. kind: Service
  45. metadata:
  46. name: redis
  47. namespace: kube-ops
  48. labels:
  49. name: redis
  50. spec:
  51. ports:
  52. - name: redis
  53. port: 6379
  54. targetPort: redis
  55. selector:
  56. name: redis

然后是数据库 Postgresql,对应的资源清单文件如下:(gitlab-postgresql.yaml)

  1. apiVersion: apps/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: postgresql
  5. namespace: kube-ops
  6. labels:
  7. name: postgresql
  8. spec:
  9. template:
  10. metadata:
  11. name: postgresql
  12. labels:
  13. name: postgresql
  14. spec:
  15. containers:
  16. - name: postgresql
  17. image: sameersbn/postgresql:10
  18. imagePullPolicy: IfNotPresent
  19. env:
  20. - name: DB_USER
  21. value: gitlab
  22. - name: DB_PASS
  23. value: passw0rd
  24. - name: DB_NAME
  25. value: gitlab_production
  26. - name: DB_EXTENSION
  27. value: pg_trgm
  28. ports:
  29. - name: postgres
  30. containerPort: 5432
  31. volumeMounts:
  32. - mountPath: /var/lib/postgresql
  33. name: data
  34. livenessProbe:
  35. exec:
  36. command:
  37. - pg_isready
  38. - -h
  39. - localhost
  40. - -U
  41. - postgres
  42. initialDelaySeconds: 30
  43. timeoutSeconds: 5
  44. readinessProbe:
  45. exec:
  46. command:
  47. - pg_isready
  48. - -h
  49. - localhost
  50. - -U
  51. - postgres
  52. initialDelaySeconds: 5
  53. timeoutSeconds: 1
  54. volumes:
  55. - name: data
  56. emptyDir: {}
  57. ---
  58. apiVersion: v1
  59. kind: Service
  60. metadata:
  61. name: postgresql
  62. namespace: kube-ops
  63. labels:
  64. name: postgresql
  65. spec:
  66. ports:
  67. - name: postgres
  68. port: 5432
  69. targetPort: postgres
  70. selector:
  71. name: postgresql

然后就是我们最核心的 Gitlab 的应用,对应的资源清单文件如下:(gitlab.yaml)

  1. apiVersion: apps/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: gitlab
  5. namespace: kube-ops
  6. labels:
  7. name: gitlab
  8. spec:
  9. template:
  10. metadata:
  11. name: gitlab
  12. labels:
  13. name: gitlab
  14. spec:
  15. containers:
  16. - name: gitlab
  17. image: sameersbn/gitlab:11.8.1
  18. imagePullPolicy: IfNotPresent
  19. env:
  20. - name: TZ
  21. value: Asia/Shanghai
  22. - name: GITLAB_TIMEZONE
  23. value: Beijing
  24. - name: GITLAB_SECRETS_DB_KEY_BASE
  25. value: long-and-random-alpha-numeric-string
  26. - name: GITLAB_SECRETS_SECRET_KEY_BASE
  27. value: long-and-random-alpha-numeric-string
  28. - name: GITLAB_SECRETS_OTP_KEY_BASE
  29. value: long-and-random-alpha-numeric-string
  30. - name: GITLAB_ROOT_PASSWORD
  31. value: admin321
  32. - name: GITLAB_ROOT_EMAIL
  33. value: 517554016@qq.com
  34. - name: GITLAB_HOST
  35. value: git.qikqiak.com
  36. - name: GITLAB_PORT
  37. value: "80"
  38. - name: GITLAB_SSH_PORT
  39. value: "22"
  40. - name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
  41. value: "true"
  42. - name: GITLAB_NOTIFY_PUSHER
  43. value: "false"
  44. - name: GITLAB_BACKUP_SCHEDULE
  45. value: daily
  46. - name: GITLAB_BACKUP_TIME
  47. value: 01:00
  48. - name: DB_TYPE
  49. value: postgres
  50. - name: DB_HOST
  51. value: postgresql
  52. - name: DB_PORT
  53. value: "5432"
  54. - name: DB_USER
  55. value: gitlab
  56. - name: DB_PASS
  57. value: passw0rd
  58. - name: DB_NAME
  59. value: gitlab_production
  60. - name: REDIS_HOST
  61. value: redis
  62. - name: REDIS_PORT
  63. value: "6379"
  64. ports:
  65. - name: http
  66. containerPort: 80
  67. - name: ssh
  68. containerPort: 22
  69. volumeMounts:
  70. - mountPath: /home/git/data
  71. name: data
  72. livenessProbe:
  73. httpGet:
  74. path: /
  75. port: 80
  76. initialDelaySeconds: 180
  77. timeoutSeconds: 5
  78. readinessProbe:
  79. httpGet:
  80. path: /
  81. port: 80
  82. initialDelaySeconds: 5
  83. timeoutSeconds: 1
  84. volumes:
  85. - name: data
  86. emptyDir: {}
  87. ---
  88. apiVersion: v1
  89. kind: Service
  90. metadata:
  91. name: gitlab
  92. namespace: kube-ops
  93. labels:
  94. name: gitlab
  95. spec:
  96. ports:
  97. - name: http
  98. port: 80
  99. targetPort: http
  100. - name: ssh
  101. port: 22
  102. targetPort: ssh
  103. selector:
  104. name: gitlab
  105. ---
  106. apiVersion: extensions/v1beta1
  107. kind: Ingress
  108. metadata:
  109. name: gitlab
  110. namespace: kube-ops
  111. annotations:
  112. kubernetes.io/ingress.class: traefik
  113. spec:
  114. rules:
  115. - host: git.qikqiak.com
  116. http:
  117. paths:
  118. - backend:
  119. serviceName: gitlab
  120. servicePort: http

要注意我们这里应用数据没有做数据持久化,只是使用的emptyDir: {}类型的 volume,Pod 挂掉后,对应的数据也就没有了,所以要在正式的环境中使用一定要做数据的持久化,比如添加 PV/PVC 或者 StorageClass。

要注意的是其中 Redis 和 Postgresql 相关的环境变量配置,另外,我们这里添加了一个 Ingress 对象,来为我们的 Gitlab 配置一个域名git.qikqiak.com,这样应用部署完成后,我们就可以通过该域名来访问了,然后直接部署即可:

  1. $ kubectl create -f gitlab-redis.yaml gitlab-postgresql.yaml gitlab.yaml

创建完成后,查看 Pod 的部署状态:

  1. $ kubectl get pods -n kube-ops
  2. NAME READY STATUS RESTARTS AGE
  3. gitlab-7d855554cb-twh7c 1/1 Running 0 10m
  4. postgresql-8566bb959c-2tnvr 1/1 Running 0 17h
  5. redis-8446f57bdf-4v62p 1/1 Running 0 17h

可以看到都已经部署成功了,然后我们可以通过 Ingress 中定义的域名git.qikqiak.com(需要做 DNS 解析或者在本地 /etc/hosts 中添加映射)来访问 Portal:

gitlab portal

使用用户名 root,和部署的时候指定的超级用户密码GITLAB_ROOT_PASSWORD=admin321即可登录进入到首页:

gitlab homepage

Gitlab 运行后,我们可以注册为新用户并创建一个项目,还可以做很多的其他系统设置,比如设置语言、设置应用风格样式等等。

点击Create a project创建一个新的项目,和之前 Github 使用上没有多大的差别:

create gitlab project

创建完成后,我们可以添加本地用户的一个SSH-KEY,这样我们就可以通过 SSH 来拉取或者推送代码了。SSH 公钥通常包含在~/.ssh/id_rsa.pub 文件中,并以ssh-rsa开头。如果没有的话可以使用ssh-keygen命令来生成,id_rsa.pub里面的内容就是我们需要的 SSH 公钥,然后添加到 Gitlab 中。

由于平时使用的 ssh 默认是 22 端口,现在如果用默认的 22 端口去连接,是没办法和 Gitlab 容器中的 22 端口进行映射的,因为我们只是通过 Service 的 22 端口进行了映射,要想通过节点去进行 ssh 链接就需要在节点上一个端口和容器内部的22端口进行绑定,所以这里我们可以通过 NodePort 去映射 Gitlab 容器内部的22端口,比如我们将环境变量设置为GITLAB_SSH_PORT=30022,将 Gitlab 的 Service 也设置为 NodePort 类型:

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: gitlab
  5. namespace: kube-ops
  6. labels:
  7. name: gitlab
  8. spec:
  9. ports:
  10. - name: http
  11. port: 80
  12. targetPort: http
  13. - name: ssh
  14. port: 22
  15. targetPort: ssh
  16. nodePort: 30022
  17. type: NodePort
  18. selector:
  19. name: gitlab

注意上面 ssh 对应的 nodePort 端口设置为 30022,这样就不会随机生成了,重新更新下 Deployment 和 Service,更新完成后,现在我们在项目上面 Clone 的时候使用 ssh 就会带上端口号了:

gitlab ssh

现在就可以使用Clone with SSH的地址了,由于上面我们配置了 SSH 公钥,所以就可以直接访问上面的仓库了:

  1. $ git clone ssh://git@git.qikqiak.com:30022/root/gitlab-demo.git
  2. Cloning into 'gitlab-demo'...
  3. warning: You appear to have cloned an empty repository.
  4. Checking connectivity... done.

然后随便在该项目下面添加一些资源:

  1. $ echo "# hello world" > README.md
  2. $ git add .
  3. $ git commit -m 'hello world'
  4. [master (root-commit) 63de7cb] hello world
  5. 1 file changed, 1 insertion(+)
  6. create mode 100644 README.md
  7. $ git push origin master
  8. Counting objects: 3, done.
  9. Writing objects: 100% (3/3), 224 bytes | 0 bytes/s, done.
  10. Total 3 (delta 0), reused 0 (delta 0)
  11. To ssh://git@git.qikqiak.com:30022/root/gitlab-demo.git
  12. * [new branch] master -> master

然后刷新浏览器,就可以看到刚刚创建的 Git 仓库中多了一个 README.md 的文件:

git commit

到这里就表明我们的 Gitlab 就成功部署到了 Kubernetes 集群当中了。

本文中涉及到的所有资源清单文件参考地址:https://github.com/cnych/kubeapp/tree/master/gitlab

下节课和大家开始介绍基于 Gitlab 的 CI/CD 实现。


点击查看本文视频

扫描下面的二维码(或微信搜索k8s技术圈)关注我们的微信公众帐号,在微信公众帐号中回复 加群 即可加入到我们的 kubernetes 讨论群里面共同学习。

k8s技术圈二维码