我最近花了一些时间研究如何构建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。为了测试它,我们可以导入测试库 并运行管道。