使用 Kubernetes Helm 安裝 CI

我們知道 CI/CD 是 devops 中最重要的環節,特別是對於現在的雲原生應用,CI/CD 更是不可或缺的部分,對於 CI/CD 工具有很多優秀的開源工具,比如前面我們介紹的 以及 都是非常流行常用的 CI/CD 工具,但是這兩個工具整體使用來說有點陳舊和笨重,本文將為大家介紹一個比較熱門的輕量級 CI/CD 開源工具:Drone,介紹如何將 Drone 和 Kubernetes 進行結合使用。

使用 Kubernetes Helm 安裝 CI/CD 工具:Drone

本篇文章是 Drone 系列文章中的第一篇文章,需要有一定的 Kubernetes 基礎知識,我們將通過 Helm 在 Kubernetes 集群上面安裝 Drone,如果你已經有運行在 K8S 集群上面的 Drone 應用,則可以忽略本文內容。

Drone

Drone 是用 Go 語言編寫的基於 Docker 構建的開源輕量級 CI/CD 工具,可以通過 SaaS 服務和自託管服務兩種方式使用,Drone 使用簡單的 YAML 配置文件來定義和執行 Docker 容器中定義的 Pipeline,Drone 由兩個部分組成:

  • Server端負責身份認證,倉庫配置,用戶、Secrets 以及 Webhook 相關的配置。
  • Agent端用於接受構建的作業和真正用於運行的 Pipeline 工作流。

Server 和 Agent 都是非常輕量級的服務,大概只使用 10~15MB 內存,所以我們也可以很輕鬆的運行在筆記本、臺式機甚至是 Raspberry PI 上面。

要安裝 Drone 是非常簡單的,官方文檔中提供了 Drone 集成 GitHub、GitLab、Gogs 等等的文檔,可以直接部署在單節點、多個節點和 Kubernetes 集群當中。

我們這裡會使用 Helm 來將 Drone 安裝到 Kubernetes 集群當中,如果你對 Kubernetes 還不是很熟悉,可以先去學習下我們的 Kubernetes 進階課程和對應的視頻教程,如果對 Helm 也不是很熟悉的,也可以先去查看下前面的Helm 初體驗文章,這裡關於 Helm 的安裝我們不再細說了。

安裝

這裡我們使用 Helm Chart 官方倉庫中包含的 Chart 包:https://github.com/helm/charts/tree/master/stable/drone,文檔中有詳細的使用說明。由於 Drone 需要和代碼倉庫進行連接,如果沒有配置,則無法啟動,我們這裡將結合 GitHub 和 Drone 使用,首先需要先在 GitHub 中註冊一個新的 OAuth 應用程序,登錄 GitHub,進入頁面https://github.com/settings/applications/new,添加如下信息:

使用 Kubernetes Helm 安裝 CI/CD 工具:Drone

github new oauth application

創建完成後會獲得用於配置 Drone 的 ClientID 和 ClientSecret,記錄這兩個值,然後創建一個名為 drone-values.yaml 的文件,通過覆蓋 values.yaml 中的 values 值來自定義 Drone,內容如下:

ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: 'true'
hosts:
- drone.qikqiak.com
tls:
- secretName: drone-tls
hosts:
- drone.qikqiak.com
sourceControl:
provider: github
github:
clientID: 上面獲得的ClientID值
clientSecretKey: clientSecret
clientSecretValue: 上面獲得的ClientSecret值
server: https://github.com
server:
adminUser: cnych # github 的用戶名
## Configures drone to use kubernetes to run pipelines rather than agents, if enabled
## will not deploy any agents.
kubernetes:
## set to true if you want drone to use kubernetes to run pipelines
enabled: true

persistence:
enabled: true
existingClaim: dronepvc

我們通過 Ingress 對象來暴露 Drone 服務,而且還配置了一個kubernetes.io/tls-acme: 'true'的 annotation,這個是因為我們集群中安裝了 Cert-Manager,所以我們可以自動化 https,同樣可以參考前面的文章使用 Let’s Encrypt 實現 Kubernetes Ingress 自動化 HTTPS,另外設置server.adminUser我們 GitHub 的用戶名,這樣我們登錄後就具有管理員權限了,另外比較重要的server.kubernetes.enabled=true,將該參數設置為 true,則運行 Drone 的任務的時候就是直接使用 Kubernetes 的 Job 資源對象來執行,而不是 Drone 的 agent,這樣設置為 true 後,安裝完成後,就沒有 drone agent 了,最後通過指定 persistence.existingClaim 指定了一個 PVC 來用於數據持久化,所以在安裝之前需要先創建 dronepvc 這個 PVC 對象(volume.yaml):

apiVersion: v1
kind: PersistentVolume
metadata:
name: dronepv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
server: 10.151.30.11
path: /data/k8s
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: dronepvc
namespace: kube-ops
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi

然後通過上面自定義的 values 文件來安裝 Drone:

$ kubectl apply -f volume.yaml
$ helm repo update
$ helm install --name drone \\
--namespace kube-ops \\
-f drone-values.yaml \\
stable/drone
Release "drone" has been installed. Happy Helming!
LAST DEPLOYED: Mon Aug 5 23:35:22 2019
NAMESPACE: kube-ops
STATUS: DEPLOYED
RESOURCES:
==> v1/ServiceAccount
NAME SECRETS AGE
drone-drone-pipeline 1 18d
drone-drone 1 18d
==> v1/RoleBinding
NAME AGE
drone-drone 18d
==> v1beta1/Deployment

NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
drone-drone-server 1 1 1 0 18d
==> v1beta1/Ingress
NAME HOSTS ADDRESS PORTS AGE
drone-drone drone.qikqiak.com 80, 443 18d
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
drone-drone-server-6f66b47dc-69qmf 0/1 ContainerCreating 0 0s
==> v1/Secret
NAME TYPE DATA AGE
drone-drone-source-control Opaque 1 18d
drone-drone Opaque 1 18d
==> v1/ClusterRole
NAME AGE
drone-drone-pipeline 18d
==> v1/ClusterRoleBinding
NAME AGE
drone-drone-pipeline 18d
==> v1/Role
NAME AGE
drone-drone 18d
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
drone-drone ClusterIP 10.105.20.182 <none> 80/TCP 18d
NOTES:
*********************************************************************************
*** PLEASE BE PATIENT: drone may take a few minutes to install ***
*********************************************************************************
From outside the cluster, the server URL(s) are:
http://drone.qikqiak.com
/<none>

注意我們這裡使用的 Drone Chart 版本是drone-2.0.5,不同的版本配置略有不同,注意查看文檔。

安裝完成後,可以查看對應的 Pod 狀態:

$ kubectl get pods -n kube-ops -l app=drone
NAME READY STATUS RESTARTS AGE
drone-drone-server-6f66b47dc-69qmf 1/1 Running 0 96s

最後需要做的就是給域名 drone.qikqiak.com 添加上 DNS 解析,我們這裡是一個正常的域名,直接解析到 nginx-ingress Pod 的任意一個節點即可,如果你是自定義的域名記住在你要訪問 drone 的節點上的 /etc/hosts 中添加上域名隱射。

在瀏覽器中訪問 drone.qikqiak.com,正常這個時候就會跳轉到 GitHub 進行認證登錄,認證後會將 GitHub 的代碼倉庫同步到 Drone 來,也可以手動同步代碼倉庫:

使用 Kubernetes Helm 安裝 CI/CD 工具:Drone

drone index

點擊項目右邊的ACTIVATE激活,進入項目中也可以根據自己的需求進行配置:

使用 Kubernetes Helm 安裝 CI/CD 工具:Drone

drone project settings

到這裡我們就通過 Helm 成功安裝了 Drone,下一篇文章再和大家探討如何使用 Drone 的 Pipeline 來進行 CI/CD。


分享到:


相關文章: