如何在KUBERNETES上轻松部署GITLAB
我最近花了一些时间研究如何构建CI / CD管道以自动化测试和部署。因为我正在用容器开发所有东西并使用Kubernetes来管理它的CI跑步者GitLab和最近与k8s的集成似乎是一个不错的选择。
在这篇文章中,我将介绍使用GitLab Runner获取GitLab所需的步骤,并在Kubernetes之上运行。
这篇文章中使用的所有清单都可以在这里找到
先决条件:
- 所有配置都假设部署到命名空间gitlab
- 此帖子中使用的域名是web的git.example.com和ssh的ssh-git.example.com。
- 所有pod都配置为没有任何持久存储。
emptyDir: {}
到处改变持久的东西。 - 大多数GitLab相关配置都是在gitlab / gitlab-deployment.yml中设置的,必须进行更改。
部署GITLAB
首先,我们将创建一个单独的命名空间并部署PostgreSQL和Redis实例。
-
kubectl create -f gitlab-ns.yml
-
-
kubectl create -f gitlab/redis-svc.yml
-
kubectl create -f gitlab/redis-deployment.yml
-
-
-
kubectl create -f gitlab/postgresql-svc.yml
-
kubectl create -f gitlab/postgresql-deployment.yml
-
PostgreSQL密码在postgresql-deployment.yml清单中设置。检查kubectl get pods --namespace=gitlab
并等待所有豆荚准备就绪。在此之后,我们可以部署GitLab本身。
-
kubectl create -f gitlab/gitlab-svc.yml
-
kubectl create -f gitlab/gitlab-svc-nodeport.yml
-
kubectl create -f gitlab/gitlab-deployment.yml
由于我在裸机群集上部署它,我还没有任何负载均衡器,这就是为什么我有第二个服务清单。如果您在云中执行此操作 - 您可以跳过部署gitlab-svc-nodeport.yml
。
让我们测试到目前为止一切正常。要访问我们的GitLab实例,我们需要知道部署它的节点端口。它通常在您部署NodePort服务时打印:
-
> $ kubectl create -f gitlab/gitlab-svc-nodeport.yml
-
You have exposed your service on an external port on all nodes in your
-
cluster. If you want to expose this service to the external internet, you may
-
need to set up firewall rules for the service port(s) (tcp:30836,tcp:31447) to serve traffic.
-
-
See http://releases.k8s.io/release-1.3/docs/user-guide/services-firewalls.md for more details.
-
service "gitlab-nodeport" created
-
如果您没有在某处写下来,您始终可以检查已部署的服务:
-
> $ kubectl describe svc gitlab-nodeport --namespace=gitlab
-
Name: gitlab-nodeport
-
Namespace: gitlab
-
Labels: name=gitlab
-
Selector: name=gitlab
-
Type: NodePort
-
IP: 10.3.0.127
-
Port: ssh 22/TCP
-
NodePort: ssh 30836/TCP
-
Endpoints: 10.2.47.9:22
-
Port: http 80/TCP
-
NodePort: http 31447/TCP
-
Endpoints: 10.2.47.9:80
-
Session Affinity: None
-
No events.
现在我们知道GitLab的Web界面在端口3144上可用。将浏览器导航到http:// any-of-your-kuberntes-node:31447 /并且看看 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实例的入口规则
-
kubectl create -f ingress/default-backend.yml
-
kubectl create -f ingress/configmap.yml
-
kubectl create -f ingress/nginx-ingress-lb.yml
-
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作为缓存服务器,因此我们可以部署一个。
-
kubectl create -f minio/minio-svc.yml
-
kubectl create -f minio/minio-deployment.yml
让我们确保pod正在运行:
-
kubectl get pods --namespace=gitlab
-
-
gitlab minio-2719559383-y9hl2 1/1 Running 0 1m
它启动并运行后,我们需要检查日志以获取令牌和秘密:
-
> $ kubectl logs -f minio-2719559383-y9hl2 --namespace=gitlab
-
+ exec app server /export
-
-
Endpoint: http://10.2.23.7:9000 http://127.0.0.1:9000
-
AccessKey: 9HRGG3EK2DD0GP2HBB53
-
SecretKey: zr+tKa6fS4/3PhYKWekJs65tRh8pbVl07cQlJfkW
-
Region: us-east-1
-
-
Browser Access:
-
http://10.2.23.7:9000 http://127.0.0.1:9000
-
-
Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
-
$ mc config host add myminio http://10.2.23.7:9000 9HRGG3EK2DD0GP2HBB53 zr+tKa6fS4/3PhYKWekJs65tRh8pbVl07cQlJfkW
-
-
Object API (Amazon S3 compatible):
-
Go: https://docs.minio.io/docs/golang-client-quickstart-guide
-
Java: https://docs.minio.io/docs/java-client-quickstart-guide
-
Python: https://docs.minio.io/docs/python-client-quickstart-guide
-
JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
-
我们需要复制AccessKey
并SecretKey
从此响应中保存。以后需要填充我们的跑步者。还有一件事需要用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的存储桶。
在我们实际部署我们的跑步者之前,我们需要在GitLab中注册它。我发现首先注册它然后将令牌保存到configmap更方便。
对于注册,我们需要获取GitLab自己的令牌。要获取它,请以root用户身份登录GitLab,然后导航到管理区域。然后转到Overview - > Runners并复制您的注册令牌
现在我们需要配置和注册跑步者。我们将使用kubectl run
命令。它将创建部署,register
在交互模式下使用参数运行默认命令。
-
> $ kubectl run -it runner-registrator --image=gitlab/gitlab-runner:v1.5.2 --restart=Never -- register
-
Waiting for pod default/runner-registrator-1573168835-tmlom to be running, status is Pending, pod ready: false
-
-
Hit enter for command prompt
-
-
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
-
http://gitlab.gitlab/ci
-
Please enter the gitlab-ci token for this runner:
-
_TBBy-zRLk7ac1jZfnPu
-
Please enter the gitlab-ci description for this runner:
-
[runner-registrator-1573168835-tmlom]: gitlab-docker-runner
-
Please enter the gitlab-ci tags for this runner (comma separated):
-
shared,specific
-
Registering runner... succeeded runner=_TBBy-zR
-
Please enter the executor: virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh:
-
docker
-
Please enter the default Docker image (eg. ruby:2.1):
-
python:3.5.1
-
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
-
Session ended, resume using 'kubectl attach runner-registrator-1573168835-tmlom -c runner-registrator -i -t' command when the pod is running
-
-
> kubectl delete deployment/runner-registrator
-
-
回答完所有问题后,您应该在管理区域的跑步者列表中找到您的跑步者。单击它并复制生成的令牌并将其粘贴到gitlab-runner/gitlab-runner-docker-configmap.yml
另外,您需要填写有关您的minio安装的信息。
-
apiVersion: v1
-
kind: ConfigMap
-
metadata:
-
name: gitlab-runner-docker
-
namespace: gitlab
-
data:
-
config.toml: |
-
concurrent = 4
-
check_interval = 1
-
-
[[runners]]
-
name = "gitlab-docker-runner"
-
url = "http://gitlab.gitlab/ci"
-
token = <GENERATED TOKEN>
-
executor = "docker"
-
[runners.docker]
-
tls_verify = false
-
image = "python:3.5"
-
privileged = true
-
disable_cache = false
-
volumes = ["/cache"]
-
[runners.cache]
-
Type = "s3"
-
ServerAddress = "minio.gitlab"
-
AccessKey = <YOUR MINIO ACCESS KEY>
-
SecretKey = <YOUR MINIO SECRET KEY>
-
BucketName = "runner"
-
最后一步是实际部署GitLab Runner本身。
-
kubectl create -f gitlab-runner/gitlab-runner-docker-configmap.yml
-
kubectl create -f gitlab-runner/gitlab-runner-docker-deployment.yml
就是这样,现在我们已经配置了GitLab并运行CI。为了测试它,我们可以导入测试库 并运行管道。