kubernetes授予用戶指定命名空間的使用權限
- 問題描述
- 具體實現
- 簽發客戶端證書
- 創建RBAC策略
- 生成kubeconfig文件
問題描述
假如我們部門來了個新同事,他需要使用kubernetes集群,但是因為他剛來,還不熟悉,所以不能直接將kubernetes集群的所有權限給他,我希望他能夠在test這個namespace里面操作,對于其他的namespace,則都沒有權限,那么我應該如何給這個用戶授權呢?
可以通過kubernetes的RBAC機制來完成授權工作,只給某個用戶某個namespace的權限
在 Kubernetes 中,RBAC 是一種強大的訪問控制機制,用于管理對集群資源的訪問權限。RBAC 可以幫助管理員精確地控制用戶、ServiceAccount 或其他實體對 Kubernetes API 中資源的操作權限。RBAC 基于角色的授權模型使得管理員可以定義角色和角色綁定,從而實現對不同用戶或實體的訪問權限控制
具體實現
示例,加入我需要給用戶lilei授權test命名空間的完全使用權限
- 用K8S CA簽發客戶端證書 基于證書的客戶端認證方式
- 創建RBAC權限策略 做一定的權限分配
- 生成kubeconfig授權文件 kubectl使用kubeconfig連接集群
最終目的也就是生成一個kubeconfig文件,讓指定用戶拿著這個文件去訪問集群
簽發客戶端證書
- 安裝簽發證書服務cfssl
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl*
mv cfssl_linux-amd64 /usr/bin/cfssl
mv cfssljson_linux-amd64 /usr/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
- 使用k8s CA簽發客戶端證書
如果是使用kubeadm部署的kubernetes集群,那么根證書存放在/etc/kubernetes/pki中
root@master:~# ls /etc/kubernetes/pki/
apiserver.crt apiserver-etcd-client.key apiserver-kubelet-client.crt ca.crt etcd front-proxy-ca.key front-proxy-client.key sa.pub
apiserver-etcd-client.crt apiserver.key apiserver-kubelet-client.key ca.key front-proxy-ca.crt front-proxy-client.crt sa.key
提前創建配置文件
root@master:~# cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
EOF#API Server會把客戶端證書的CN字段作為User,把names.O字段作為Group。k8s在校驗授權的時候就會讀取這兩個字段
root@master:~# cat > lulei-csr.json <<EOF
{"CN": "lilei","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "ShenZhen","L": "ShenZhen","O": "k8s","OU": "System"}]
}
EOF
cfssl使用根證書來簽發lilei客戶端的證書
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lilei-csr.json | cfssljson -bare lilei
簽發完成會在當前目錄下產生lulei-key.pem lulei.pem 兩個文件
上面就是客戶端證書,有多個用戶需要生成多個
- lilei-key.pem 私鑰 類似配置nginx https訪問 .key私鑰
- lilei.pem 數字證書 類似配置nginx https訪問的 .crt證書
創建RBAC策略
- 創建rbac策略,也就是創建一個role角色,然后進行rolebinding綁定,這里授予了這個用戶dev namespace下的所有權限(可根據實際需求更改)
root@master:~# cat > rbac.yaml <<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: testname: pod-reader
rules:
- apiGroups: ["", "apps", "batch", "networking.k8s.io"] #deployments屬于apss這個資源對象里面;里面為空,為核心的api組,常用的資源都在核心組里面resources: ["deployments", "pods", "services", "pods/exec", "ingresses", "secrets", "pods/log"]verbs: ["get", "list", "watch", "create", "delete", "update", "patch"] #資源操作方法
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: read-podsnamespace: test
subjects:
- kind: Username: lileiapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
EOFroot@master:~# kubectl apply -f rbac.yaml
生成kubeconfig文件
- 集群參數設置
root@master:~# kubectl config set-cluster kubernetes \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.98.99.140:6443 \--kubeconfig=lulei.kubeconfig#然后當前目錄下會生成一個lilei.kubeconfig文件
本段設置了所需要訪問的集群的信息。
使用set-cluster設置了需要訪問的集群,如上為kubernetes,這只是個名稱,實際為–server指向的apiserver
–certificate-authority設置了該集群的公鑰
–embed-certs為true表示將–certificate-authority證書寫入到kubeconfig中
–server則表示該集群的kube-apiserver地址
生成的kubeconfig 被保存到 lilei.kubeconfig文件
- 用戶參數設置
root@master:~# kubectl config set-credentials lulei \--client-key=lulei-key.pem \--client-certificate=lulei.pem \--embed-certs=true \--kubeconfig=lilei.kubeconfig#會追加user信息到lilei.kubeconfig文件中,注意,當前目錄下需要有lilei-key.pem和lilei.pem
本段主要設置用戶的相關信息,主要是用戶證書。如上的用戶名為lilei,證書為:lilei.pem,私鑰為:lilei-key.pem。注意客戶端的證書首先要經過集群CA的簽署,否則不會被集群認可。此處使用的是ca認證方式,也可以使用token認證,如kubelet的 TLS Boostrap機制下的bootstrapping使用的就是token認證方式。上述kubectl使用的是ca認證,不需要token字段
- 上下文參數設置
root@master:~# kubectl config set-context kubernetes \--cluster=kubernetes \--user=lilei \--kubeconfig=lulei.kubeconfig#會追加context信息到lilei.kubeconfig文件中
集群參數和用戶參數可以同時設置多對,在上下文參數中將集群參數和用戶參數關聯起來。上面的上下文名稱為kubenetes,集群為kubenetes,用戶為lilei,表示使用lilei的用戶憑證來訪問kubenetes集群的default命名空間,也可以增加–namspace來指定訪問的命名空間。
- 設置當前使用的配置
#切換context為kubernetes,集群默認的context為kubernetes-admin@kubernetes,如果root用戶直接執行這個會失敗,因為當前root用的kubeconfig文件中沒有kubernetes這個context的信息,下面第二種指定kubeconfig即可
kubectl config use-context kubernetes
kubectl config use-context kubernetes --kubeconfig=lulei.kubeconfig
#列出可用的上下文,跟你的當前用戶的kubeconfig設置有關
kubectl config get-contexts <name>
#列出當前使用的上下文
kubectl config current-context <name>
#設置新的上下文,可以包括集群、用戶和命名空間
kubectl config set-context <name> [--cluster=<cluster>] [--user=<user>] [--namespace=<namespace>]
#刪除指定上下文
kubectl config delete-context <name>
#可以查看當前kubeconfig的內容,包括集群、用戶、上下文等配置信息
kubectl config view
最終生成的kubeconfig文件就是lilei.kubeconfig,將其復制到某個用戶的的.kube文件中,就可以使用該限制了