前言
再上篇 [[drone on GKE 建立]],有談到k8s runner,
那時候都在default 的 namespace上面運作,
所以沒什麼問題,
但一到了正式環境,要切專門的namespace,
就陣亡拉)))))
正文
這篇會講到兩個東西,
- RBAC(Role-based Access Control)
- 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。
所以,現在有兩種做法(這邊會講第二種做法)。
- role的權限,給他能夠在不同的ns也能佈署的權限(這部分應該是建立clusterRole,沒試過)。
- 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.
0 意見:
張貼留言