如何在KUBERNETES上轻松部署GITLAB

我最近花了一些时间研究如何构建CI / CD管道以自动化测试和部署。因为我正在用容器开发所有东西并使用Kubernetes来管理它的CI跑步者GitLab和最近与k8s的集成似乎是一个不错的选择。

在这篇文章中,我将介绍使用GitLab Runner获取GitLab所需的步骤,并在Kubernetes之上运行。

这篇文章中使用的所有清单都可以在这里找到

先决条件:

  1. 所有配置都假设部署到命名空间gitlab
  2. 此帖子中使用的域名是web的git.example.com和ssh的ssh-git.example.com。
  3. 所有pod都配置为没有任何持久存储。emptyDir: {}到处改变持久的东西。
  4. 大多数GitLab相关配置都是在gitlab / gitlab-deployment.yml中设置的,必须进行更改。

部署GITLAB

首先,我们将创建一个单独的命名空间并部署PostgreSQL和Redis实例。

  1. kubectl create -f gitlab-ns.yml
  2. kubectl create -f gitlab/redis-svc.yml
  3. kubectl create -f gitlab/redis-deployment.yml
  4. kubectl create -f gitlab/postgresql-svc.yml
  5. kubectl create -f gitlab/postgresql-deployment.yml

PostgreSQL密码在postgresql-deployment.yml清单中设置。检查kubectl get pods --namespace=gitlab并等待所有豆荚准备就绪。在此之后,我们可以部署GitLab本身。

  1. kubectl create -f gitlab/gitlab-svc.yml
  2. kubectl create -f gitlab/gitlab-svc-nodeport.yml
  3. kubectl create -f gitlab/gitlab-deployment.yml

由于我在裸机群集上部署它,我还没有任何负载均衡器,这就是为什么我有第二个服务清单。如果您在云中执行此操作 - 您可以跳过部署gitlab-svc-nodeport.yml

让我们测试到目前为止一切正常。要访问我们的GitLab实例,我们需要知道部署它的节点端口。它通常在您部署NodePort服务时打印:

  1. > $ kubectl create -f gitlab/gitlab-svc-nodeport.yml
  2. You have exposed your service on an external port on all nodes in your
  3. cluster. If you want to expose this service to the external internet, you may
  4. need to set up firewall rules for the service port(s) (tcp:30836,tcp:31447) to serve traffic.
  5. See http://releases.k8s.io/release-1.3/docs/user-guide/services-firewalls.md for more details.
  6. service "gitlab-nodeport" created

如果您没有在某处写下来,您始终可以检查已部署的服务:

  1. > $ kubectl describe svc gitlab-nodeport --namespace=gitlab
  2. Name: gitlab-nodeport
  3. Namespace: gitlab
  4. Labels: name=gitlab
  5. Selector: name=gitlab
  6. Type: NodePort
  7. IP: 10.3.0.127
  8. Port: ssh 22/TCP
  9. NodePort: ssh 30836/TCP
  10. Endpoints: 10.2.47.9:22
  11. Port: http 80/TCP
  12. NodePort: http 31447/TCP
  13. Endpoints: 10.2.47.9:80
  14. Session Affinity: None
  15. No events.

现在我们知道GitLab的Web界面在端口3144上可用。将浏览器导航到http:// any-of-your-kuberntes-node:31447 /并且看看 GitLab。

如何在KUBERNETES上轻松部署GITLAB

您可以使用登录,密码root或您在部署清单中设置的任何内容登录。真棒,下一步是配置入口,以便能够通过人类可读的URL访问它。

入口

Ingress是一组规则,允许入站连接到达群集服务。它可以配置为提供外部可访问的URL,负载平衡流量,终止SSL,提供基于名称的虚拟主机等服务。

我的配置主要基于kubernetes / contrib的官方示例 所有与入口相关的清单都位于ingress目录中。基本上,它只是几个文件:

  • default-backend.yml - 任何入口规则未处理DNS记录时提供的容器。
  • configmap.yml - 配置映射,包含我们要处理的端口和目标列表。
  • nginx-ingress-lb.yml - 基于Nginx的实际入口控制器,用于处理端口80,443,22上的流量
  • gitlab-ingress.yml - 我们的GitLab实例的入口规则
  1. kubectl create -f ingress/default-backend.yml
  2. kubectl create -f ingress/configmap.yml
  3. kubectl create -f ingress/nginx-ingress-lb.yml
  4. kubectl create -f ingress/gitlab-ingress.yml

在此之后并假设DNS已正确配置,我们应该能够访问http://git.example.com上的 GitLab 。

现在,让我们部署一个GitLab Runner来运行测试。

GITLAB RUNNER

GitLab Runner支持多个执行程序:virtualbox,docker + machine,docker-ssh + machine,docker,docker-ssh,parallels,shell,ssh。不幸的是,对本地Kubernetes执行器的支持现在正在进行中,尚未准备好。我花了几个小时试图让它工作没有成功。这就是为什么我们现在要使用简单的docker执行器。

由于大多数手册 都建议使用minio作为缓存服务器,因此我们可以部署一个。

  1. kubectl create -f minio/minio-svc.yml
  2. kubectl create -f minio/minio-deployment.yml

让我们确保pod正在运行:

  1. kubectl get pods --namespace=gitlab
  2. gitlab minio-2719559383-y9hl2 1/1 Running 0 1m

它启动并运行后,我们需要检查日志以获取令牌和秘密:

  1. > $ kubectl logs -f minio-2719559383-y9hl2 --namespace=gitlab
  2. + exec app server /export
  3. Endpoint: http://10.2.23.7:9000 http://127.0.0.1:9000
  4. AccessKey: 9HRGG3EK2DD0GP2HBB53
  5. SecretKey: zr+tKa6fS4/3PhYKWekJs65tRh8pbVl07cQlJfkW
  6. Region: us-east-1
  7. Browser Access:
  8. http://10.2.23.7:9000 http://127.0.0.1:9000
  9. Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
  10. $ mc config host add myminio http://10.2.23.7:9000 9HRGG3EK2DD0GP2HBB53 zr+tKa6fS4/3PhYKWekJs65tRh8pbVl07cQlJfkW
  11. Object API (Amazon S3 compatible):
  12. Go: https://docs.minio.io/docs/golang-client-quickstart-guide
  13. Java: https://docs.minio.io/docs/java-client-quickstart-guide
  14. Python: https://docs.minio.io/docs/python-client-quickstart-guide
  15. JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide

我们需要复制AccessKeySecretKey从此响应中保存。以后需要填充我们的跑步者。还有一件事需要用minio完成。我们需要创建一个桶。

要做到这一点,我们有2个选择。

首先是直接在文件系统上创建目录,如下所示:

kubectl exec -it minio-2719559383-y9hl2 --namespace=gitlab -- bash -c 'mkdir /export/runner'

其次是通过Web界面完成。为此,我们首先需要将minio移植到我们的机器上

kubectl port-forward minio-2719559383-y9hl2 9000:9000 --namespace=gitlab

然后将浏览器导航到http:// localhost:9000,使用我们拥有的**和密码登录,并创建一个名为runner的存储桶。

如何在KUBERNETES上轻松部署GITLAB

在我们实际部署我们的跑步者之前,我们需要在GitLab中注册它。我发现首先注册它然后将令牌保存到configmap更方便。

对于注册,我们需要获取GitLab自己的令牌。要获取它,请以root用户身份登录GitLab,然后导航到管理区域。然后转到Overview - > Runners并复制您的注册令牌

如何在KUBERNETES上轻松部署GITLAB

现在我们需要配置和注册跑步者。我们将使用kubectl run命令。它将创建部署,register在交互模式下使用参数运行默认命令。

  1. > $ kubectl run -it runner-registrator --image=gitlab/gitlab-runner:v1.5.2 --restart=Never -- register
  2. Waiting for pod default/runner-registrator-1573168835-tmlom to be running, status is Pending, pod ready: false
  3. Hit enter for command prompt
  4. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
  5. http://gitlab.gitlab/ci
  6. Please enter the gitlab-ci token for this runner:
  7. _TBBy-zRLk7ac1jZfnPu
  8. Please enter the gitlab-ci description for this runner:
  9. [runner-registrator-1573168835-tmlom]: gitlab-docker-runner
  10. Please enter the gitlab-ci tags for this runner (comma separated):
  11. shared,specific
  12. Registering runner... succeeded runner=_TBBy-zR
  13. Please enter the executor: virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh:
  14. docker
  15. Please enter the default Docker image (eg. ruby:2.1):
  16. python:3.5.1
  17. Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
  18. Session ended, resume using 'kubectl attach runner-registrator-1573168835-tmlom -c runner-registrator -i -t' command when the pod is running
  19. > kubectl delete deployment/runner-registrator

回答完所有问题后,您应该在管理区域的跑步者列表中找到您的跑步者。单击它并复制生成的令牌并将其粘贴到gitlab-runner/gitlab-runner-docker-configmap.yml 另外,您需要填写有关您的minio安装的信息。

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: gitlab-runner-docker
  5. namespace: gitlab
  6. data:
  7. config.toml: |
  8. concurrent = 4
  9. check_interval = 1
  10. [[runners]]
  11. name = "gitlab-docker-runner"
  12. url = "http://gitlab.gitlab/ci"
  13. token = <GENERATED TOKEN>
  14. executor = "docker"
  15. [runners.docker]
  16. tls_verify = false
  17. image = "python:3.5"
  18. privileged = true
  19. disable_cache = false
  20. volumes = ["/cache"]
  21. [runners.cache]
  22. Type = "s3"
  23. ServerAddress = "minio.gitlab"
  24. AccessKey = <YOUR MINIO ACCESS KEY>
  25. SecretKey = <YOUR MINIO SECRET KEY>
  26. BucketName = "runner"

最后一步是实际部署GitLab Runner本身。

  1. kubectl create -f gitlab-runner/gitlab-runner-docker-configmap.yml
  2. kubectl create -f gitlab-runner/gitlab-runner-docker-deployment.yml

就是这样,现在我们已经配置了GitLab并运行CI。为了测试它,我们可以导入测试库 并运行管道。