最近,我花了一些時間研究如何構建CI / CD管道以自動化測試和部署。由於我正在容器中開發所有東西並使用Kubernetes對其CI運行程序進行管理,因此最近與k8集成似乎是一個不錯的選擇。
在本文中,我將描述在Kubernetes上啟動並運行帶有GitLab Runner的GitLab所需的步驟。
這篇文章中使用的所有清單都可以在這裡找到
更新2017-02-27:您可能對此清單的自動版本感興趣http://blog.lwolf.org/post/fully-automated-gitlab-installation-on-kubernetes-includes-runner-and-registry/
先決條件:
所有配置均假定部署到名稱空間gitlab本文中使用的域名是git.example.com(用於網絡)和ssh-git.example.com(用於ssh)。沒有配置任何持久性存儲的所有Pod。emptyDir: {}到處都改變為持久的東西。大多數與GitLab相關的配置都是在gitlab / gitlab-deployment.yml中設置的,必須進行更改。部署GITLAB
首先,我們將創建一個單獨的命名空間並部署PostgreSQL和Redis實例。
kubectl create -f gitlab-ns.ymlkubectl create -f gitlab/redis-svc.ymlkubectl create -f gitlab/redis-deployment.ymlkubectl create -f gitlab/postgresql-svc.ymlkubectl create -f gitlab/postgresql-deployment.ymlPostgreSQL密碼在postgresql-deployment.yml清單中設置。檢查kubectl get pods --namespace=gitlab並等待所有吊艙就緒。之後,我們可以部署GitLab本身。
kubectl create -f gitlab/gitlab-svc.ymlkubectl create -f gitlab/gitlab-svc-nodeport.ymlkubectl create -f gitlab/gitlab-deployment.yml由於我將其部署在裸機集群上,因此我還沒有任何負載均衡器,這就是為什麼我有第二個服務清單。如果您要在雲端進行操作,則可以跳過的部署gitlab-svc-nodeport.yml。
讓我們測試到目前為止一切正常。要訪問我們的GitLab實例,我們需要知道部署它的節點埠。通常在部署NodePort服務時將其列印出來,如下所示:
> $ kubectl create -f gitlab/gitlab-svc-nodeport.ymlYou have exposed your service on an external port on all nodes in yourcluster. If you want to expose this service to the external internet, you mayneed 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=gitlabName: gitlab-nodeportNamespace: gitlabLabels: name=gitlabSelector: name=gitlabType: NodePortIP: 10.3.0.127Port: ssh 22/TCPNodePort: ssh 30836/TCPEndpoints: 10.2.47.9:22Port: http 80/TCPNodePort: http 31447/TCPEndpoints: 10.2.47.9:80Session Affinity: NoneNo events.現在,我們知道在埠31447上可以使用GitLab的Web界面。將瀏覽器導航到http:// any-of-your-kuberntes-node:31447 /並查看 GitLab。
您可以使用登錄根目錄,密碼根目錄或在部署清單中設置的任何名稱登錄。很棒,下一步是配置入口,使其能夠通過人類可讀的URL訪問它。
入口
入口是允許入站連接到達群集服務的規則的集合。可以將其配置為提供服務外部可訪問的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.ymlkubectl create -f ingress/configmap.ymlkubectl create -f ingress/nginx-ingress-lb.ymlkubectl create -f ingress/gitlab-ingress.yml到位並假設已正確配置DNS之後,我們應該能夠訪問http://git.example.com上的 GitLab 。
現在,讓我們部署一個GitLab Runner來運行測試。
亞搏體育APP RUNNER
GitLab Runner支持多種執行器:virtualbox,docker + machine,docker-ssh + machine,docker,docker-ssh,並行,shell,ssh。不幸的是,對Kubernetes原生執行器的支持目前正在進行中,尚未準備就緒。我花了幾個小時試圖使其無法成功運行。這就是為什麼現在我們將使用簡單的docker executor。
由於大多數手冊 都建議使用minio作為高速緩存伺服器,因此我們來部署一個。
kubectl create -f minio/minio-svc.ymlkubectl create -f minio/minio-deployment.yml讓我們確保pod正在運行:
kubectl get pods --namespace=gitlabgitlab minio-2719559383-y9hl2 1/1 Running 0 1m它啟動並運行後,我們需要檢查日誌以獲取令牌和密碼:
> $ kubectl logs -f minio-2719559383-y9hl2 --namespace=gitlab+ exec app server /exportEndpoint: http://10.2.23.7:9000 http://127.0.0.1:9000AccessKey: 9HRGG3EK2DD0GP2HBB53SecretKey: zr+tKa6fS4/3PhYKWekJs65tRh8pbVl07cQlJfkWRegion: us-east-1Browser Access: http://10.2.23.7:9000 http://127.0.0.1:9000Command-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/3PhYKWekJs65tRh8pbVl07cQlJfkWObject 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,然後導航到admin區域。然後轉到概述->跑步者並複製您的註冊令牌
現在我們需要配置和註冊運行器。我們將為此使用kubectl run命令。它將創建部署,register以交互方式運行帶有參數的默認命令。
> $ kubectl run -it runner-registrator --image=gitlab/gitlab-runner:v1.5.2 --restart=Never -- registerWaiting for pod default/runner-registrator-1573168835-tmlom to be running, status is Pending, pod ready: falseHit enter for command promptPlease enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):http://gitlab.gitlab/ciPlease enter the gitlab-ci token for this runner:_TBBy-zRLk7ac1jZfnPuPlease enter the gitlab-ci description for this runner:[runner-registrator-1573168835-tmlom]: gitlab-docker-runnerPlease enter the gitlab-ci tags for this runner (comma separated):shared,specificRegistering runner... succeeded runner=_TBBy-zRPlease enter the executor: virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh:dockerPlease enter the default Docker image (eg. ruby:2.1):python:3.5.1Runner 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: v1kind: ConfigMapmetadata: name: gitlab-runner-docker namespace: gitlabdata: 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.ymlkubectl create -f gitlab-runner/gitlab-runner-docker-deployment.yml就是這樣,現在我們已經配置了CI並啟動了GitLab並運行了它。為了測試它,我們可以導入測試庫 並運行管道。