• 使用 Kubernetes Helm 安装 Drone


    我们知道 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:1.2
    • Kubectl 和 Kubernetes:v1.14.2
    • Helm CLI 和 Tiller: v2.14.1
    • Docker: 18.09.1
    • Golang: 1.11.4

    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 Chart 官方仓库中包含的 Chart 包:https://github.com/helm/charts/tree/master/stable/drone,文档中有详细的使用说明。由于 Drone 需要和代码仓库进行连接,如果没有配置,则无法启动,我们这里将结合 GitHub 和 Drone 使用,首先需要先在 GitHub 中注册一个新的 OAuth 应用程序,登录 GitHub,进入页面https://github.com/settings/applications/new,添加如下信息:

    github new oauth applicationgithub 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.k8stech.net
      tls:
        - secretName: drone-tls
          hosts:
            - drone.k8stech.net
    
    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.k8stech.net  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.k8stech.net

    注意我们这里使用的 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.k8stech.net 添加上 DNS 解析,我们这里是一个正常的域名,直接解析到 nginx-ingress Pod 的任意一个节点即可,如果你是自定义的域名记住在你要访问 drone 的节点上的 /etc/hosts 中添加上域名隐射。

    在浏览器中访问 drone.k8stech.net,正常这个时候就会跳转到 GitHub 进行认证登录,认证后会将 GitHub 的代码仓库同步到 Drone 来,也可以手动同步代码仓库:

    drone indexdrone index

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

    drone project settingsdrone project settings

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

    转于:https://www.qikqiak.com/post/drone-with-k8s-1/

  • 相关阅读:
    微信下载远程图片的公用方法
    微信接口调用
    微信
    post方法
    asp.net pagebase获取缓存的方法
    sql查询最大id
    Controller里写自己需要的Action,参数的名字必须和路由设置的参数名一致

    递归调用
    队列及其应用
  • 原文地址:https://www.cnblogs.com/yx88/p/12800533.html
Copyright © 2020-2023  润新知