我们知道 CI/CD 是 devops 中最重要的环节,特别是对于现在的云原生应用,CI/CD 更是不可或缺的部分,对于 CI/CD 工具有很多优秀的开源工具,比如前面我们介绍的 Jenkins 以及 gitlab ci 都是非常流行常用的 CI/CD 工具,但是这两个工具整体使用来说有点陈旧和笨重,本文将为大家介绍一个比较热门的轻量级 CI/CD 开源工具:Drone,介绍如何将 Drone 和 Kubernetes 进行结合使用。

本篇文章是 Drone 系列文章中的第一篇文章,需要有一定的 Kubernetes 基础知识,我们将通过 Helm 在 Kubernetes 集群上面安装 Drone,如果你已经有运行在 K8S 集群上面的 Drone 应用,则可以忽略本文内容。

Drone

Drone 是用 Go 语言编写的基于 Docker 构建的开源轻量级 CI/CD 工具,可以通过 SaaS 服务和自托管服务两种方式使用,Drone 使用简单的 YAML 配置文件来定义和执行 Docker 容器中定义的 Pipeline,Drone 由两个部分组成:

  • Server端负责身份认证,仓库配置,用户、Secrets 以及 Webhook 相关的配置。
    
  1. 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,添加如下信息:

创建完成后会获得用于配置 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

注意我们这里使用的 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 来,也可以手动同步代码仓库:

点击项目右边的 ACTIVATE激活,进入项目中也可以根据自己的需求进行配置:

到这里我们就通过 Helm 成功安装了 Drone,下一篇文章再和大家探讨如何使用 Drone 的 Pipeline 进行 CI/CD。

k8s进阶课程推荐:打造独当一面的 Kubernetes 运维、开发工程师

扫描下面的二维码(或微信搜索 k8s技术圈)关注我们的微信公众帐号,在微信公众帐号中回复 加群 即可加入到我们的 kubernetes 讨论群里面共同学习。