為K8S叢集建立只讀許可權帳號
參考URL:
https://www.jianshu.com/p/a1a0d64f1245
https://mritd.me/2018/03/20/use-rbac-to-control-kubectl-permissions/
https://studygolang.com/articles/11730?fr=sidebar
公司的k8s叢集裡的運維使用者是為k8s的運維同事增加的。有的研發同事也需要登陸到k8s的master上,檢視一些日誌,或是瞭解一下k8s的執行資訊。這裡,我們就需要新增一個只讀許可權供研發同事操作。
要建立一個對k8s叢集資訊只讀許可權的帳戶,重點就是限制使用者執行kubectl命令的許可權。使用者執行kubectl命令時,預設是讀取使用者目錄下的~/.kube/config檔案,並將其中的認證資訊與k8s叢集的api server認證鑑權。之後,就會用提定的許可權,與k8s的叢集打交道了。
建立一個只讀許可權的帳號,分為如下三大步驟:
- 使用叢集證書為指定使用者生成叢集認證資訊(我們舉例的k8s叢集使用者為xxx)。
- 使用認證資訊,生成kube.config檔案。
- 建立合適的cluster-role,並將此角色與前面的使用者進行clouster-role-binding操作。
一,使用叢集證書生成使用者認證資訊
1, 使用docker帳號登陸k8s叢集的master機器。
2, 下載https://pkg.cfssl.org/下的軟體放到機器的/tmp/目錄。(cfssl,cfssljson)
本來下載的檔案為:
3, 將/etc/kubernetes/pki/目錄下的ca.crt和ca.key檔案cp到/tmp/目錄。
cp /etc/kubernetes/pki/ca.crt /tmp/ca.crt
cp /etc/kubernetes/pki/ca.key /tmp/ca.key
4, 在/tmp/目錄下生成ca-config.json檔案,內容如下:
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
5, 在/tmp/目錄下生成xxx-csr.json檔案,內容如下:
{
"CN": "xxx",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ShangHai",
"L": "ShangHai",
"O": "k8s",
"OU": "System"
}
]
}
6, 執行如下命令,生成xxx.pem和xxx-key.pem檔案。
./cfssl gencert -ca=./ca.crt -ca-key=./ca.key -config=./ca-config.json \
-profile=kubernetes xxx-csr.json | ./cfssljson -bare xxx
二,使用認證資訊,生成kube.config檔案
1, 將/etc/kubernetes/目錄下的admin.conf檔案cp到/tmp/目錄,並重命名。
cp /etc/kubernetes/admin.conf ./ro-user.kubeconfig
2, 執行如下xxx.sh指令碼,生成最終的config檔案。
3, 將config檔案更名為config檔案。
cp ro-user.kubeconfig config
4, 使用研發使用者登陸,並將/tmp/config檔案cp到~/.kube/目錄下。
mkdir ~/.kube/
cp /tmp/config ~/.kube/
三,使用K8s的RBAC授權
1, 建立一個cluster-role-ro.yaml檔案,生成只讀資源。
以下檔案,可以在匯出叢集管理員許可權基礎之上修改,命令為
kubectl get clusterrole admin -o yaml >cluster-role-ro.yaml
2, 建立cluster-rolebinding-ro.yaml檔案,繫結使用者和資源。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: k8s-ro-cluster
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cro-readonly
subjects:
- kind: User
name: xxx
apiGroup: rbac.authorization.k8s.io
3, 在運維使用者下,使用kubectl apply –f 命令將這兩個yaml檔案應用於叢集。
4, 使用研發使用者登陸,並進行命令測試。
比如,執行如下命令,顯示OK。
kubectl --kubeconfig=/tmp/ro-user.kubeconfig get pod --all-namespaces -o wide
再比如,執行如下命令,顯示無許可權。
kubectl apply -f xxx-dep-svc.yaml
from server for: "xxx-dep-svc.yaml": deployments.extensions "xxx" is forbidden: User "xxx" cannot get deployments.extensions in the namespace "kube-system"
至此,K8S叢集的只讀許可權帳號建立完成。
後期改進方向:
l 在統一的機器上製作,然後分發。
l 操作指令碼化,加快工作效率。