Pages - Menu

2022年4月11日 星期一

[drone] k8s-runner 進階設定

前言

再上篇 [[drone on GKE 建立]],有談到k8s runner,
那時候都在default 的 namespace上面運作,
所以沒什麼問題,
但一到了正式環境,要切專門的namespace,
就陣亡拉)))))


正文

這篇會講到兩個東西,

  1. RBAC(Role-based Access Control)
  2. drone k8s-runner policy

Step 1.

先從Cloud RBAC開始說起,

基本概念如下圖




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

role : 設定權限能做什麼事
roleBinding : 要將哪個角色綁定權限到sa帳號

這邊簡單說明roleBinding (因rolebinding的roleRef 無法指定ns),

將 role, namespace 在 default 的 drone 跟
serviceAccount的 namespace在 default 的 default 綁在一起,

更細項的說明,請參考 (1)~(4)

當服務沒有指定是哪一個 『serviceAccountName',就會使用預設的default 。

所以,如果將namespace通通改成drone的話,會發生什麼事?
會先在drone的畫面看到 skip




然後查看 k8s-runner的 log,會看到沒有權限,被拒絕執行。



Step 2.

再來要解決權限問題,
因為k8s-runner,預設都是使用 default(namespace)的default再建立pod。

所以,現在有兩種做法(這邊會講第二種做法)。

  1. role的權限,給他能夠在不同的ns也能佈署的權限(這部分應該是建立clusterRole,沒試過)。
  2. k8s-runner在pipeline時,要求在指定的namespace做動作。

建立一個 policy(5) 的 yml,
底下的關鍵欄位,有在碰k8s的應該都很熟,
match這塊要再測試看看,這邊就先註解掉。
(文件上是說 ,可以用來定義多個policy用,
當有符合時,就執行下面的policy)

這邊設定規則是,

佈署時,佈署到drone的namespace ,
資源請求是 512Mi,節點選擇的label 是 disktype: ssd

kind: policy
name: drone

# match:
#   repo:
#   - "octocat/*"
#   - "octocat/hello-world"

metadata:
  namespace: drone

resources:
  request:
    memory: 512MiB
  # limit:
  #   cpu: 4000
  #   memory: 1GiB

node_selector:
  disktype: ssd

再來要在runner裡面掛載這個檔案,直接用 configMap將檔案載入。

建立configmap

 kubectl create configmap -n drone drone-policy --from-file=policy.yml --dry-run=client -o yaml | kubectl apply -f -

k8s-runner內掛載configmap
要特別注意env ,
DRONE_POLICY_FILE(6),需要指定你的yml位置。

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  drone-runner-k8s
  namespace: drone
  labels:
    drone:  runner-k8s
spec:
  replicas: 1
  selector:
    matchLabels:
      drone:  runner-k8s
  template:
    metadata:
      labels:
        drone:  runner-k8s
    spec:
      containers:
      - name: runner
        image: drone/drone-runner-kube:latest
        ports:
        - containerPort: 3000
        volumeMounts:
        - mountPath: /policy.yml
          name: policy
          subPath: policy.yml
        env:
        - name: DRONE_POLICY_FILE
          value: /policy.yml        
      volumes:
      - configMap:
          defaultMode: 420
          name: drone-policy
        name: policy  

附註,如果node_selector,選擇的節點是ssd的硬碟的話,
時間會減少 35%。 但每個月會多13塊美金。

再來下篇應該就是寫將drone完整導入istio的做法了

ref.

  1. 使用 RBAC 鑑權
  2. Kubernetes權限管理之RBAC
  3. Day-28 瞭解 Namespace 與 Rbac
  4. [Kubernetes] 如何取得合法可用的權限,讓 pod 與 API server 溝通
  5. Policies
  6. DRONE_POLICY_FILE
  7. 配置 Pod 的 Service Account

沒有留言:

張貼留言