Kubernetes CKA課程筆記 44

建立(系統)ServiceAccount並賦予其權限

ZONGRU Li
9 min readNov 9, 2021

就如現在常見的CICD工具 — Jenkins這個K8s Cluster外部的系統

若要透過Jenkins進行一系列的K8s元件佈署操作(執行kubectl create pod等)

我們也需要賦予Jenkins這個系統一個可以執行kubectl指令的身分及權限

這時候需要建立的就是 →serviceaccount 元件

建立ServiceAccount元件:

依樣透過指令查找完全指令:

kubectl create serviceaccount --help

看到:

指令還算單純,執行建立yaml:

kubectl create serviceaccount {名稱,這邊給jenkins} --dry-run=client -o yaml > jenkins-sa.yaml

建好進去看看內容
非常簡略的內容,不過真就這樣!

先將Admin身分設定放回到~/.kube/config :

所以現在下指令會是admin!!

直接將剛剛的yaml檔建立實際K8s元件:

用describe查看執行:

kubectl describe serviceaccount jenkins

也就是當一個serviceaccount一被建立

就會連帶產生一個Token就像password或普通token那樣

所以可以透過查找secret指令查找執行:

kubectl get secret {上述token的名稱}

這邊拿到的還只是secret的名稱,並且知道是屬於service-account-token

所以接著改成將這個secret印出來:

kubectl get secret jenkins-token-bgnxf -o yaml

後面讓jenkins與K8s Cluster溝通其實就是要依賴上述產出來的token內容

但記得上圖中的token是經過base64加密過後的內容,所以首先要先將其解密:

(複製好上面一大串token內容)

echo {上面一大串token內容}|base64 --decode

接著先在這個putty將上述base64解密後的token設為參數:

嘗試印出:

echo $token

接著透過以下指令查找看看jenkins系統怎麼K8s cluster溝通:

kubectl options

先取得cluster API位置資訊:

kubectl cluster-info

實際完整的jenkins與K8s Cluster溝通指令如下:

kubectl --server=https://172.31.32.35:6443 --certificate-authority /etc/kubernetes/pki/ca.crt --token $token get pod

但是在執行前先把admin設定檔移除:

再來執行上面指令:

有連到cluster但是沒有權限執行get pod!

並且請注意看上圖(以下放大):

User定義為(這邊要先記得,後面查詢auth can-i用得到!):

system:serviceaccount:default:jenkins

至此都還正常,畢竟還沒設定權限

亦即上面的指令其實已經可以供給Jenkins系統執行,只是還很長

其實也能變成相關的config檔案供放置於~/.kube目錄下

首先複製一版dev-hog.conf檔案出來為名稱:jenkins.conf

然後vi進入編輯

把一些dev-hog改為jenkins

並移除User的client-certificate & client-key

並在User下放置剛剛解完base64的token放進去:

(先出來複製一下token內容)

重新vi jenkins.conf編輯,把解密base64後的token內容貼上去:

儲存jenkins.conf後執行指令:

kubectl --kubeconfig jenkins.conf get pod

給予權限(Role & RoleBinding):

這邊一樣僅考慮最小權限原則

可能只給予Jenkins系統身分特定nameSpace部分元件的操作權限

這邊簡單地為Jenkins建立 — Role在default nameSpace

並且為Jenkins建立RoleBinding連結Jenkins與上述的Role權限元件

首先依樣查找怎麼建立role元件,執行:

kubectl create role --help

所以建立上假設讓Jenkins不直接操作pod元件

但是給Jenkins可以操作deploymentsServices

所以產建yaml檔指令就是如下:

kubectl create role {名稱,這邊取cicd-role} --verb=create,update,list --resource=deployments.apps,services --dry-run=client -o yaml > cicd-role.yaml

然後很悲慘的出現錯誤:

因為現在沒有指定使用者身分,所以先cp把Admin暫時加回去

重跑上面建立yaml檔指令:

成功看到yaml檔

進去編輯畫面看看:

這邊其實沒甚麼問題,預設該role元件綁定在default nameSpace

但是還是寫清楚點,把default nameSpace寫上去

補上namespace,預設就是default,不寫也是可以

接著執行建立指令並查看describe:

這邊記得,如果這個role元件不是在default nameSpace內

上述describe指令還要帶-n指定nameSpace!!

以上給Jenkins建立的role就先定義好了

接著當然要建立rolebinding元件

去連結上述role元件(cicd-role)與Jenkins身分

執行指令看看rolebinding怎麼建,執行:

kubectl create rolebinding --help

依據上面提示建立

所以產生rolebinding yaml的指令可以組合如下:

kubectl create rolebinding cicd-binding --role=cicd-role --serviceaccount=default:jenkins --dry-run=client -o yaml > cicd-binding.yaml

依樣vi進去看看內容:

沒啥需要改的!

然後執行describe指令查看:

kubectl describe rolebinding cicd-binding

很清楚!

接著直接繼續用Admin身分直接跑確認權限指令檢查jenkins執行指令權限:

kubectl auth can-i create service --as={這邊就是本篇最難的地方!!!} -n default

上面的as內的值要填入的是:

system:serviceaccount:default:jenkins

實際確認權限如下:

所以基本上要admin提供給Jenkins如下的jenkins.conf

內含K8s Cluster CA資訊及給jenkins連線用的token內容

就可以連到K8s Cluster,接著透過定義的權限做操作!

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet