我最近花了一些時間研究如何構建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。爲了測試它,我們可以導入測試庫 並運行管道。