如何在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實例。

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。

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

我們需要複製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的存儲桶。

Minio網絡界面

在我們實際部署我們的跑步者之前,我們需要在GitLab中註冊它。我發現首先註冊它然後將令牌保存到configmap更方便。

對於註冊,我們需要獲取GitLab自己的令牌。要獲取它,請以root用戶身份登錄GitLab,然後導航到管理區域。然後轉到Overview - > Runners並複製您的註冊令牌

GitLab亞軍頁面

現在我們需要配置和註冊跑步者。我們將使用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。爲了測試它,我們可以導入測試庫 並運行管道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章