Drone 是我今年主推的 CI/CD 自架服務,詳細可以參考
這篇文章,目前在公司內部團隊使用了一年以上,服務相當穩定。Drone 本身可以透過
docker-compose 方式快速在機器上架設完成,但是由於
Kubernetes 的盛行,大家也希望能透過 Kubernetes 來安裝 Drone 服務。本篇會教大家如何在 AWS 上透過 Kubernetes 安裝完成。Drone 預設使用
SQLite 當作資料庫,檔案會直接存放在
/var/lib/drone
路徑底下,但是容器內不支援寫入,所以必須要要額外掛上空間讓 Drone 可以寫入資料。此篇會以
GitHub 認證 + SQLite 來教學。
事前準備
- 在 AWS 上面 建立 kubernets
- 在 AWS 上面建立 EBS 空間存放 SQLite
- 申請 GitHub OAut
在安裝 Drone 之前,有三件事情務必先完成,第一是要先有 K8S 環境,本篇不會教大家如何架設出 K8S 環境。但是你可以透過官方提供的方式來測試:
- 使用 Minikube (快速在本機端架設出 K8S Cluster)
- Katacoda
- Play with Kubernetes (單次免費四小時)
第二,你需要先在 AWS 上面建立一個 1G 的 EBS 空間,空間大小由你決定,你可以透過 AWS CLI 或直接到 AWS Console 頁面建立,底下是建立 EBS 的指令
$ aws ec2 create-volume \
--availability-zone=ap-southeast-1a \
--size=1 --volume-type=gp2
注意
availability-zone
區域要跟 K8S 同樣,大小先設定 1G。完成後會看到底下訊息:
{
"AvailabilityZone": "ap-southeast-1a",
"Encrypted": false,
"VolumeType": "gp2",
"VolumeId": "vol-04741f74eb0f6b891",
"State": "creating",
"Iops": 100,
"SnapshotId": "",
"CreateTime": "2017-09-23T15:42:24.319Z",
"Size": 1
}
之後會用到
VolumeId
。假如沒有做此步驟,您會發現 Drone 伺服器是無法啟動成功。最後是請到 GitHub 帳號內建立一個全新 OAuth App,並取得
CLient
跟
Secret
代碼。
安裝 Drone
所有的 Yaml 檔案都可以直接在
appleoy/drone-on-kubernetes,找到。首先打開
drone-server-deployment.yaml
,找到
volumeID
取代成上述建立好的結果。
awsElasticBlockStore:
fsType: ext4
# NOTE: This needs to be pointed at a volume in the same AZ.
# You need not format it beforehand, but it must already exist.
# CHANGEME: Substitute your own EBS volume ID here.
- volumeID: vol-xxxxxxxxxxxxxxxxx
+ volumeID: vol-01f13b969e9dabff7
再來設定 server 跟 agent 溝通用的 Secret,打開
drone-secret.yaml
data:
- server.secret: ZHJvbmUtdGVzdC1kZW1v
+ server.secret: ZHJvbmUtdGVzdC1zZWNyZXQ=
透過 base64 指令換掉上面的代碼。假設密碼設定
drone-test-secret
,請執行底下指令
$ echo -n "drone-test-secret" | base64
ZHJvbmUtdGVzdC1zZWNyZXQ=
在 GitHub 上面建立新的 Application,並且拿到 Client ID 跟 Secret Key,修改
drone-configmap.yaml
檔案
server.host: drone.example.com
server.remote.github.client: xxxxx
server.remote.github.secret: xxxxx
接著陸續執行底下指令,新增 Drone NameSpace 並且將 server 及 agent 服務啟動
$ kubectl create -f drone-namespace.yaml
$ kubectl create -f drone-secret.yaml
$ kubectl create -f drone-configmap.yaml
$ kubectl create -f drone-server-deployment.yaml
$ kubectl create -f drone-server-service.yaml
$ kubectl create -f drone-agent-deployment.yaml
完成後,k8s 會自動建立 ELB,透過 kubectl 可以看到 ELB 名稱
$ kubectl --namespace=drone get service -o wide
執行後看到底下結果:
NAME CLUSTER-IP EXTERNAL-IP
drone-service 100.68.89.117 xxxxxxxxx.ap-southeast-1.elb.amazonaws.com
拿到 ELB 網域後,可以直接更新 GitHub 的 application 資料
![Screen Shot 2017-09-23 at 3.40.28 PM]()
最後打開瀏覽器,填入上述的網址,會發現直接轉到 GitHub OAuth 認證,點選確認後,Drone 會開始讀取您的個人資料,這樣就代表成功了。
懶人包安裝
上述步驟是不是有點複雜,要執行的 kubectl 指令非常多,所以我提供了另一種安裝方式,就是透過 [install-drone.sh],執行這 Shell Script 檔案前,你必須先做兩件事情。1. 申請 EBS 空間,完成後請修改
drone-server-deployment.yaml
內的
volumeID
。2. 申請 [GitHub OAuth Application][42],完成後請修改
drone-configmap.yaml
內的 GitHub 設定。最後執行底下指令
$ ./install-drone.sh
擴展 agent 服務
假設一個 agent 已經不符合團隊需求,在 k8s 內只要一個指令就可以自動水平擴展 agent:
$ kubectl scale deploy/drone-agent \
--replicas=2 --namespace=drone
其中
replicas
可以改成你要的數字。
如何清除 Drone 服務
我們已經將 Drone 資料庫備份在 EBS,所以隨時都可以移除 Drone 服務,透過簡單的指令就可以清除掉 Drone 所有容器,只要下清除 Namespace 即可
$ kubectl delete -f drone-namespace.yaml
後記
這算是我的第一篇 Kubernetes 心得文,就先拿 Drone 服務來測試看看。Drone 作者也很用心寫了一個接口讓 K8S 可以監控 agent 容器,假如您不是使用 SQLite 而是用 MySQL 資料庫,就需要修改 YAML 設定檔。對於本篇文章有不懂的地方,歡迎大家留言。我也錄製了 15 分鐘影片放在
Udemy Drone 課程,課程到月底特價 1600 元。優惠代碼:
DEVOPSTAIPEI