k8s與CICD--drone簡介和部署


前言

整個基於k8s的pass平臺,關鍵的一部分就是CICD。CICD又是devops的關鍵部分。以前主流的工具是Jenkins。今天主要介紹的是drone。drone用go語言實現的,drone是前google員工2013年開源的一個CI/CD工具,如今已經拉了投資商業化了。企業版是付費的,咱們用的是免費版本。drone更新比較快,以前穩定版本是0.7,今天部署的時候已經更新到0.8了。不過相關的文檔不完善,不少都是coming soon。python

優點:

drone引入pipline的概念,整個build過程由多個stage組成,每個stage都是docker。mysql

  • 各stage間能夠經過共享宿主機的磁盤目錄, 實現build階段的數據共享和緩存基礎數據, 實現加速下次build的目標
  • 各stage也能夠共享宿主機的docker環境,實現共享宿主機的docker image, 不用每次build都從新拉取base image,減小build時間
  • 能夠併發運行。多個build能夠併發運行,單機併發數量由服務器cpu數決定。 由開發者負責打包image和流程控制。Docker-in-docker,這一點很是重要,一切都在掌握之中。相比jenkins的好處是,全部的image都是開發者提供,不須要運維參與在CI服務器上部署各類語言編譯須要的環境。
    是DevOps的最佳實踐!

部署

編寫docker-compose文件

drone的部署及其簡單,採用docker-compose的方式,相似於gogs。
具體docker-compose.yml以下:git

version: '2'

services:
  drone-server:
    image: drone/drone:0.8

    ports:
      - 80:8000
      - 9000
    volumes:
      - /var/lib/drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_HOST=127.0.0.1
      - DRONE_GOGS=true
      - DRONE_GOGS_URL=http://gogs.xxx.com
      - DRONE_GOGS_PRIVATE_MODE=true 
      - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec

  drone-agent:
    image: drone/agent:0.8

    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=drone-server:9000
      - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec
      - DOCKER_API_VERSION=1.24

此處須要注意的是在agent處的 DOCKER_API_VERSION=1.24。在執行pipline的時候,直接報錯github

client is newer than server (client API version: 1.26, server API version: 1.24)golang

這實際上是docker1.12版本的一個issue。解決方案就是在agent裏增長環境變量DOCKER_API_VERSION=1.24。web

執行docker-compose

基本上就一句命令sql

docker-compose up -d

不熟悉docker-compose命令的能夠具體查看。
至於docker-compose的安裝,我這裏使用pip安裝的。docker

yum install python-pip -y
pip install docker-compose -y

登陸配置gogs項目

圖片描述

此處輸入的用戶名和密碼是gogs的。drone拿着用戶名和密碼能夠獲取gogs的項目和創建webhook。數據庫

登陸成功之後選擇你想要進行cicd的項目便可。能夠設置各類gogs鉤子的觸發條件,好比push或是merge,tag等。下面是我實際測試的一個項目截圖。緩存

圖片描述

.drone.yml

固然必須如今項目根目錄下添加.drone.yml文件。增長本身實際的構建邏輯。
因爲我這邊是一個go項目做爲測試。具體的內容以下:

pipeline:
  build:
    image: golang:latest
    commands:
      - go get 
      - go build

而後基本上工做就完成了。

看到上面的貼圖其實有報錯信息的,具體的錯誤

fatal: could not read Username for 'http://gogs.xxx.com': No such device or address
exit status 128

其實在實際應用場景中,幾乎全部單位的gogs都是私有倉庫,因此纔會出現這個問題。這個坑我也是查了不少信息都沒有解決,最後是這個issue以及看了drone-git的源碼之後找到了解決方案。實際上在drone0.4以前,是不支持gogs私有倉庫的。而在以後的版本已經解決了這個問題,須要在docker-compose文件中增長 以下配置項:

# Set to true if Gogs is running in private mode.
DRONE_GOGS_PRIVATE_MODE=true

配置drone數據庫爲mysql

以前的docker-compose文件默認啓用的是內部的sqlite數據庫,在生產環境中,咱們須要持久化到生產數據庫。drone支持mysql和pgsql兩個數據庫。這裏我用的是mysql。

新的配置文件以下:

version: '2'

services:
  drone-server:
    image: drone/drone:0.8

    ports:
      - 80:8000
      - 9000
    volumes:
      - /var/lib/drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_HOST=127.0.0.1
      - DRONE_GOGS=true
      - DRONE_GOGS_URL=http://gogs.xx.com
      - DRONE_GOGS_PRIVATE_MODE=true
      - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec
      - DRONE_DATABASE_DRIVER=mysql
      - DRONE_DATABASE_DATASOURCE=root:123456@tcp(xx.205.xx.126:3306)/drone?parseTime=true

  drone-agent:
    image: drone/agent:0.8

    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=drone-server:9000
      - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec
      - DOCKER_API_VERSION=1.24

仔細查看drone關於mysql的文檔,須要咱們手動建立drone數據庫。

和k8s的結合

  1. 其實主要的目的仍是在咱們k8s的平臺上使用起來,drone提供了豐富的插件。其中有k8s和helm相關的。結合harbor和helm,實現k8s的CICD,大體的流程:合併代碼觸發pipline,build和生成鏡像推到harbor,而後利用helm插件部署到k8s中。
  2. 固然若是你的項目不是docker部署的,其實也徹底可使用drone的。好比golang項目,就能夠構建完成之後,將構建成功的可執行文件拷貝到目的主機。
  3. 因爲一切都是基於docker,因此徹底能夠定製本身不一樣的鏡像用來實現不一樣的場景。尤爲是提供了service這個功能。能夠提供一些mysql等service,能夠在測試階段發揮做用。因爲我最近一直在作golang的項目,有一個場景大概全部的gopher都有這個問題,那就是go的包管理工具太多了,dep,godep,glide等,最好的實現就是提供一些單獨安裝了某種工具的go基礎鏡像,在具體的項目選擇不一樣的鏡像便可。
相關文章
相關標籤/搜索