建立ServiceAccount元件:
依樣透過指令查找完全指令:
kubectl create serviceaccount --help
看到:
指令還算單純,執行建立yaml:
kubectl create serviceaccount {名稱,這邊給jenkins} --dry-run=client -o yaml > jenkins-sa.yaml
先將Admin身分設定放回到~/.kube/config :
直接將剛剛的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設定檔移除:
再來執行上面指令:
並且請注意看上圖(以下放大):
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可以操作deployments及Services
所以產建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檔指令:
進去編輯畫面看看:
但是還是寫清楚點,把default nameSpace寫上去
接著執行建立指令並查看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,接著透過定義的權限做操作!