Pages - Menu

2022年4月11日 星期一

[GKE] CICD drone on GKE 建立

前言

drone這套知道的人應該不多,
不過他至少也是在CNCF裡面有掛名的一個工具。

正文

gitlab的安裝方式,參考 [[gitlab on GKE 災害還原筆記]]

再來是安裝drone的方式,
這邊之前沒寫文件,重試的時候搞了一陣子。

要先知道 runner分成哪幾種,根據你的環境選擇你要的方式。

在drone畫面,基本上都差不多。
有差異的點是再建置時,就直接看圖吧

Drone Runner分成五種,適用於不同的情境

  1. Docker runner :是drone最常見的用法,pineline中的每一個step都起一個獨立的container運行特定任務,本文即是採用docker runner。

    在建置時,會在該runner裡面執行docker,所以當下只會看到runner裡面的cpu跟ram使用量上升。

  2. Kubernetes runner:跟docker runner 的功能相似,只是改成Kubernetes 版本,如果你的服務要搭建在k8s上,就用這個。


    選擇kubernetes的版本,再建置時會在當下的叢集建立一個pod,
    然後就會在裡面執行要跑得步驟。

  3. Exec runner:用於你的專案不適合跑在容器內的狀況EX:MacOs專案。

  4. SSH runner:直接以ssh 連線到遠端以default shell 執行pipeline流程,需要使用openssh 7.9 以上版本。

  5. Digital Ocean runner :用於當你的pipeline需要權限可以操作整台虛擬機的情況,且不適合跑在容器內。

角色 功能
用戶 Gitlab
Drone Server Drone 主服務,提供Web界面
Drone Runner 我理解為實現各種操作的適配器,例如ssh、docker、k8s操作
Drone Agent 操作主機 Docker API 的代理程序
Docker Server 主機的 Doker 程序


再來就是要佈署 drone server跟 runner了。

Step 1.

首先要到Gitlab,建立oAuth的id 跟token。
切記是在user Setting的 Application,
因為Gitlab是我建的,所以我有另一個Admin的區域,
不是在Admin裡面。




網頁不要關, Application ID 跟 Secret等等會用到。


Step 2. drone Server


將一些參數改成自己的。

yaml欄位 對應的欄位
DRONE_GITLAB_CLIENT_ID Application ID
DRONE_GITLAB_CLIENT_SECRET Secret
DRONE_SERVER_HOST Callback URL 的domain
DRONE_RPC_SECRET 自行建立,runner的secret需一致
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gke-drone-server
  labels:
    app: drone
    drone: drone-server
    io.kompose.service: drone-server
spec:
  selector:
    matchLabels:
      app: drone
      drone: drone-server
      io.kompose.service: drone-server
  template:
    metadata:
      labels:
            app: drone
            drone: drone-server
            io.kompose.service: drone-server
    spec:
      containers:
      - env:
        - name: DRONE_GITLAB_CLIENT_ID    # OAuth 的 Application ID
          value: 5b2f90188137bab7b1c6959721feb6e55f1137919e5b4b5ce005bd5e15af536a      
        - name: DRONE_GITLAB_CLIENT_SECRET    # OAuth 的 Secret
          value: 4cc261149603b3df864677f5af37b55613f6f4d20dd65fbb3e4f77f0cbca9e15
        - name: DRONE_GITLAB_SERVER       # Gitlab Server
          value: http://35.234.26.234
        - name: DRONE_GIT_ALWAYS_AUTH     # Drone clone 時,是否每次都驗證
          value: "false"
        - name: DRONE_LOGS_COLOR          # Log 啟用顏色辨識
          value: "true"
        - name: DRONE_LOGS_DEBUG          # 選擇是否開啟 debug 模式
          value: "false"
        - name: DRONE_LOGS_PRETY
          value: "false"
        # - name: DRONE_LOGS_TRACE          #開啟log追蹤
        #   value: "true"
        - name: DRONE_RUNNER_CAPACITY     # 表示一次可執行 n 個 job
          value: "3"
        - name: DRONE_SERVER_HOST         # Drone URL,不能加HTTP,解析會在加上HTTP
          value: 14.199.130.26
        - name: DRONE_SERVER_PROTO        # http 或者 https 連線設定
          value: http
        - name: DRONE_TLS_AUTOCERT        # 自動生成 ssl 證書,並接受 https 連線,末認為false
          value: "false"
        - name: DRONE_REGISTRATION_CLOSED # 啟用的話,管理員需在用戶登入前創建用戶
          value: "false"
        - name: DRONE_USER_CREATE         # 建立admin權限的使用者  cli登入用
          value: username:ezio,admin:true
        - name: DRONE_USER_FILTER         # 可操作 Drone 的用戶清單
          value: root,ezio
        - name: DRONE_RPC_SECRET
          value: 824de51510f08498fa770c7798e3cc9e
        image: drone/drone:2
        imagePullPolicy: "Always"
        name: drone-server        
        ports:
        - containerPort: 80
        resources: {}
        volumeMounts:
        - mountPath: /data
          name: drone-server-claim0
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
      - name: drone-server-claim0
        persistentVolumeClaim:
          claimName: gke-drone-server-claim0

如果要其他git的安裝方式請參考 1. 的官方文件
ref.

  1. Drone Gitlab

Step 3-a. drone Runner - Docker Runner


注意 DRONE_RPC_SECRET需與server一致。
這邊會用到 docker.sock,也是因為這個的關係,
才導致這次重新測試。

k8s即將廢棄 Dockershim,改用containerd,
詳細內容就不多說了,有興趣的可參考 (1) 、 (2)

雖然我實測出來的結果,
在containerd的node是可以用的。
有在想是不是因為核心還是 /var/run/docker.sock 個關係,
但隨著後續研究 docker.sock (3),發覺應該是不能用的才對…
但為什麼能用還是搞不懂。但(4)的官方論壇有說,他不擔心這個問題,
實際上還真的沒問題…

補充,
最近把node的 containerd 版本升到 1.20 後,Docker Runner就真的不能用了。應該是早期還在用舊版的containerd,所以才能跑。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: agent
spec:
  selector:
    matchLabels:
      drone: drone-agent
  replicas: 1
  template:
    spec:
      containers:
      - env:
        - name: DRONE_LOGS_DEBUG
          value: "false"
        # - name: DRONE_LOGS_TRACE          #開啟log追蹤
        #   value: "true"
        - name: DRONE_RPC_SECRET
          value: 824de51510f08498fa770c7798e3cc9e
        - name: DRONE_RPC_HOST
          value: 14.199.130.26
        - name: DRONE_RPC_PROTO
          value: "http"
        - name: DRONE_RUNNER_CAPACITY
          value: "3"
        image: drone/drone-runner-docker:1
        imagePullPolicy: ""
        name: drone-agent
        resources: {}
        volumeMounts:
        - mountPath: /var/run/docker.sock
          name: docker-socket
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
      - name: docker-socket
        hostPath:
          path: /var/run/docker.sock

ref.
1. 檢查棄用 Dockershim 對你的影響
2. 棄用 Dockershim 的常見問題
3. [Docker] 掛載 /var/run/docker.sock 的用意?
4. Drone Disscus - Docker plugin & dockershim deprecation // Kubernetes 1.20+

Step 3-b. drone Runner - kubernete Runner


注意 DRONE_RPC_SECRET需與server一致。


kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: drone
rules:
- apiGroups:
  - ""
  resources:
  - secrets
  verbs:
  - create
  - delete
- apiGroups:
  - ""
  resources:
  - pods
  - pods/log
  verbs:
  - get
  - create
  - delete
  - list
  - watch
  - update

---

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: drone
  namespace: default
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: Role
  name: drone
  apiGroup: rbac.authorization.k8s.io

---


apiVersion: apps/v1
kind: Deployment
metadata:
  name:  gke-drone-agent

  labels:
    app: drone
    drone: drone-agent
    io.kompose.service: drone-agent
spec:
  replicas: 1
  selector:
    matchLabels:
      app: drone
      drone: drone-agent
      io.kompose.service: drone-agent
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "true"
      labels:
        app: drone
        drone: drone-agent
        io.kompose.service: drone-agent
    spec:
      containers:
      - name: runner
        image: drone/drone-runner-kube:latest
        ports:
        - containerPort: 3000
        env:
        - name: DRONE_RPC_SECRET
          value: 824de51510f08498fa770c7798e3cc9e
        - name: DRONE_RPC_HOST
          value: 14.199.130.26
        - name: DRONE_RPC_PROTO
          value: "http"
        - name: DRONE_RUNNER_CAPACITY
          value: "3"

ref.
- KUBERNETES Runner

問題排除

  1. 首先碰到的問題是,drone沒有反應,先檢查webhook
    到專案底下的webhook選項,查看錯誤的訊息




因為GKE的防火牆沒開的關係,導致webhook資料丟不過去。

  1. drone無法連線到gitlab


本來以為是防火牆的關係,但直接連進去pod裡面,呼叫這個網址是正常的。

後來看到 (2) 的討論,我跟他們狀況一樣,應該也是istio造成的。
原以為是 drone server或 runner,有安裝istio的關係,
還特別寫了

template:
  metadata:
    annotations:
      sidecar.istio.io/inject: "false"

來阻止 istio的注入(3)。

後來想了又想,才驚覺,我要取消的應該是整個namespace的istio注入,
因為當新的 pipeline建立時,就已經注入了istio的sidecar,



所以要先讓這個namespace通通不能自動注入,
指定其他的deploy會自動注入。
自動注入的規則,請參考 [[istio sidecar 注入規則]]

  1. 切換namespace,無法佈署

ref.
1. Gitlab Webhooks
2. Drone CI pipeline first step clone failed: Connection refused
3. 安裝 Sidecar
4. istio -Resource Annotations

沒有留言:

張貼留言