【多用戶】k8s多用戶配置 kubeconfig
K8S 集群中的認(rèn)證、授權(quán)與 kubeconfig
一、kubeconfig 介紹
-[appuser@k8s-master-1 ~]$ cat /etc/kubernetes/kubeconfig
apiVersion: v1
kind: Config
clusters:
- name: shjq-dev01-chenqiang-cluster
cluster:
server: https://10.130.14.155:443
certificate-authority: /etc/kubernetes/ssl/ca.crt
users:
- name: shjq-dev01-chenqiang-user
user:
client-certificate: /etc/kubernetes/ssl/cs_client.crt
client-key: /etc/kubernetes/ssl/cs_client.key
contexts:
- context:
cluster: shjq-dev01-chenqiang-cluster
user: shjq-dev01-chenqiang-user
name: shjq-dev01-chenqiang
------
# 上面為 指定目錄格式
# 我們要配置成單個(gè) kubeconfig 配置文件,我們需要做如下操作:
- 修改 certificate-authority 成 certificate-authority-data
- 修改 client-certificate 成 client-certificate-data
- 修改 client-key 成 client-key-data
- 對(duì) /etc/kubernetes/ssl/ca.crt, cs_client.crt, cs_client.key 進(jìn)行 base64 編碼,分別執(zhí)行 /etc/kubernetes/ssl/ca.crt|base64 等。
-------
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZuVENDQTRXZ0F3SUJBZ0lKQVBuVlJIdW9zZXpqTUEwR0NTcUdTSWIzRFFFQkN3VUFNR1V4Q3pBSkJnTlYKQkFZVEFrTk9NUkV3RHdZRFZRUUlEQWhUYUdGdVoyaGhhVEVQTUEwR0ExVUVCd3dHVUhWa2IyNW5NUll3RkFZRApWUVFLREExellXbGpiVzkwYjNJdVkyOXRNUXd3Q2dZRFZRUUxEQU5yT0hNeEREQUtCZ05WQkFNTUEyczRjekFlCkZ3MHhPREF6TURnd05qSTJORE5hRncweE9UQXpNRGd3TmpJMk5ETmFNR1V4Q3pBSkJnTlZCQVlUQWtOT01SRXcKRHdZRFZRUUlEQWhUYUdGdVoyaGhhVEVQTUEwR0ExVUVCd3dHVUhWa2IyNW5NUll3RkFZRFZRUUtEQTF6WVdsagpiVzkwYbnpCSDQvOG9Od0NDaHkrcUdYVE9hNTY2UzhjNW5vQ2c2TlovTGxZVjFLUHlJdjFMblRmd3VselUKenpSTGUwVkRjZXpwUmY0RnJ4TVJLSzg # 太長(zhǎng)了 有刪減
server: https://10.130.14.155:443
name: shjq-dev01-chenqiang-cluster
contexts:
- context:
cluster: shjq-dev01-chenqiang-cluster
user: shjq-dev01-chenqiang-user
name: shjq-dev01-chenqiang
current-context: shjq-dev01-chenqiang
kind: Config
preferences: {}
users:
- name: shjq-dev01-chenqiang-user
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBakNDQWVvQ0NRQ0NhYWdFUnFmNExEQU5CZ2txaGtpRzl3MEJBUXNGQURCbE1Rc3dDUVlEVlFRR0V3SkQ # 太長(zhǎng)了 有刪減
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBeUI4djN5YjlqRmxRU0x3L1FYaVUycFdGck5jNjB0bmp1ZVh5N3gvNTZOcXNpOUhwCjdlSzZaSG5LL1JabDcxZUltS0tPNjhrVm9aSUZsRmx2UTJMWmtJMkVrYXpndHNrdnpvQ3l4aEhQSndIV01sRloKQ1dndDFXVHdkTm93emI1ZEtpSnhGbHFvWlJtZ3BBMGJ # 太長(zhǎng)了 有刪減
以實(shí)際環(huán)境的 kubeconfig 為例進(jìn)行分析,主要包含以下幾部分信息
三大部分
clusters 用于集群認(rèn)證 Server 字段: 存儲(chǔ)集群的地址
證書路徑(certificate-authority: /etc/kubernetes/ssl/ca.crt)或
證書內(nèi)容(certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZuVENDQTRXZ)
可以有多個(gè) cluster 集群
users 用于用戶認(rèn)證 存儲(chǔ)用戶的證書、密鑰(兩種形式,路徑或內(nèi)容)
證書形式
client-certificate: /etc/kubernetes/ssl/cs_client.crt
client-key: /etc/kubernetes/ssl/cs_client.key
密鑰token形式:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktL
可以有多個(gè) user 用戶
context 上下文,用戶和集群的組合 采用某個(gè) context :表示采用某個(gè)用戶去管控某個(gè)集群
默認(rèn)情況是,采用 admin 用戶管控集群,具有所有資源的創(chuàng)建權(quán)限
二、明確一個(gè)問題
由于 RBAC 機(jī)制,ServiceAccount 可以(通過Rolebinding或 ClusterRolebinding)具有(Role 或 ClusterRole 定義的)某些權(quán)限
那么在默認(rèn) context 下(就是 admin user)下,創(chuàng)建一個(gè)具有 pod create 權(quán)限的 ServiceAccount,接下來使用該 ServiceAccount 去創(chuàng)建 Pod 等,并不能說是該 ServiceAccount 在管控集群,實(shí)際上仍是 admin user 在管控集群,所以此時(shí)不能成為 k8s 多用戶管控集群
因?yàn)樵谠?k8s 環(huán)境中,仍可以創(chuàng)建 deployment 、Service、daemonset 等資源
若是該 ServiceAccount 管控集群,在k8s環(huán)境中,應(yīng)該只能創(chuàng)建 pod
所以可以這么理解
cluster 多集群
user 多用戶,user 的權(quán)限(可綁定 ServiceAccount,進(jìn)行權(quán)限限制,下文將講如何用 ServiceAccount 創(chuàng)建 User)
context 表示使用用戶管控集群(該集群的最大權(quán)限就是用戶的權(quán)限)
SA 通過 RoleBinding 綁定 Role ,具有 Role 權(quán)限,只能操作 Role 所在 namespace
可以實(shí)現(xiàn) SA 具有操作別的 namespace 中資源的權(quán)限(例如 SA 在 ns1, Role 在 ns2,SA 可操作 ns2 資源)
SA 通過 RoleBinding 綁定 ClusterRole, 具有 ClusterRole 權(quán)限,只能操作 SA 所在的 namespace
可以實(shí)現(xiàn) SA 在所在 namespace 具有高權(quán)限,但不能跨出當(dāng)前 namespace
SA 通過 ClusterRoleBinding 綁定 ClusterRole,具有 ClusterRole 權(quán)限,可操作所有 namespace 和集群資源
沒有 ClusterRoleBinding 與 Role de 組合
三、使用 ServiceAccount 創(chuàng)建 kubeconfig 中的 User
3.1 創(chuàng)建 ServiceAccount 獲取 Token
首先創(chuàng)建 role 或 clusterrole 進(jìn)行權(quán)限定義
之后創(chuàng)建 ServiceAccount 用于與 role 或 clusterrole 綁定
最后取出 ServiceAccount 對(duì)應(yīng)的 Token (創(chuàng)建 serviceaccount 時(shí)會(huì)自動(dòng)創(chuàng)建個(gè)同名的 secret 并掛載上,其用于訪問集群)
# 簡(jiǎn)單舉例
# 創(chuàng)建命名空間
kubectl create ns ns-sa
# 創(chuàng)建 serviceaccount
kubectl create sa sa-test -n ns-sa
# 創(chuàng)建 role 賦予某些權(quán)限 也可以通過 yaml 編寫
kubectl -n ns-sa create role role-1 --verb=get,list --resources=Pod,Deployment -n test-sa
# 綁定 賦予 sa 權(quán)限
kubectl -n ns-sa create rolebinding sa-rolebinding-1 --role=ns-sa:role-1 --serviceaccount=sa-test
# 獲取 sa 的 token
# 首先查看對(duì)應(yīng)的 secret
kubectl -n ns-sa get secret | grep sa-test # 獲知 secret 的名稱 如 sa-test-token-gz2jr
# 然后獲取 token
kubectl -n ns-sa describe secret sa-test-token-gz2jr
# 或
kubectl -n kube-system get secret admin-token-nwphb -o jsonpath={.data.token}|base64 -d # 這種方法 后面可能多個(gè) % 刪除就好
3.2 創(chuàng)建 k8s user 管控
實(shí)際上就是創(chuàng)建個(gè) user,使用的是上面 ServiceAccount 的 Token
第一步:設(shè)置一個(gè)賬號(hào)鑒權(quán)信息(創(chuàng)建一個(gè)k8s user)
上面的<TokenOfSecret>的內(nèi)容就是我們上面通過kubectl describe secret獲取到的 Token 值,注意指定的值兩邊沒有 符號(hào)
$ kubectl config set-credentials test-user(自定義) --token <TokenOfSecret>
第二步:設(shè)置集群的訪問信息
若配置訪問已有的集群信息,忽略此步
若添加新集群,則需要添加下面信息
$ kubectl config set-cluster new-cluster-name(自定義) --server https://10.192.0.2:6443 --certificate-authority /home/shiyanlou/ca.crt --embed-certs=true
Cluster "new-cluster-name" set.
第三步:創(chuàng)建一個(gè) Context,把集群信息和鑒權(quán)信息綁定在一起
# 采用了自己的集群 minikube
$ kubectl config set-context your-context-name(自定義) --cluster minikube --user test-user
Context "your-context-name" created.
第四步:使用這個(gè)創(chuàng)建的 Context
$ kubectl config use-context your-context-name
Switched to context "your-context-name".
通過以上步驟的設(shè)置,我們就可以在本地通過 kubectl 使用我們創(chuàng)建的 ServiceAccount 來調(diào)用 API 接口,訪問集群中資源的信息了。
好了,讓我們來簡(jiǎn)單查看下默認(rèn)命名空間 default 中的 Pod 列表
$ kubectl get pods
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:shiyanlou-admin" cannot list pods in the namespace "default"
為什么會(huì)出現(xiàn)此信息?
因?yàn)槲覀?role 賦予的權(quán)限是在 ns-sa 命名空間下查看 pod,因此無法獲取 default 空間下的 pod
3.3 利用 mac 用戶進(jìn)行管控
因?yàn)?mac 用戶不是 k8s user,所以不太清楚怎么利用mac user 創(chuàng)建 contxt
此處測(cè)試 mac user 與 clusterrole admin 綁定,驗(yàn)證是否有創(chuàng)建pod權(quán)限
新建mac 用戶 yeah
【小技巧】macOS 下用 dscl 命令行管理用戶 創(chuàng)建用戶
賦予權(quán)限
# 綁定 admin clusterrole
k create clusterrolebinding test-sa-admin2 --user=yeah --clusterrole=admin
驗(yàn)證權(quán)限
# 驗(yàn)證是否授權(quán)成功
kubectl auth can-i create pods --namespace default --as yeah
四、命令總結(jié)
kubeconfig配置文件可通過kubectl config命令進(jìn)行設(shè)定
kubectl config view #打印文件內(nèi)容
kubectl config set-cluster # 設(shè)置clusters段
kubectl config set-credentials # 設(shè)置users段
kubectl config set-context # 設(shè)置contexts段
kubectl config set-use-context # 設(shè)置current-context段
獲取secret的token
# 創(chuàng)建 serviceaccount 時(shí)會(huì)自動(dòng)創(chuàng)建個(gè)同名的 secret 并掛載上,其用于訪問集群
kubectl -n kube-system get secret|grep admin-token
# 用 jsonpath 方式獲取 token 的值
kubectl -n kube-system get secret admin-token-nwphb -o jsonpath={.data.token}|base64 -d
使用指定用戶創(chuàng)建資源
# mac 用戶
$ k apply -f 1sysctl.yaml --as=yeah
# 使用 ServiceAccount
$ k apply -f 1sysctl.yaml --as system:serviceaccount:default:sa-test1
驗(yàn)證用戶是否有某些權(quán)限
# 測(cè)試權(quán)限 因?yàn)?k8s User 綁定的 serveraccount, 所以 k8s User 本身并沒有權(quán)限
$ kubectl auth can-i create pods --namespace default --as user-test1
no
# ServiceAccount 才有權(quán)限
$ kubectl auth can-i create pods --namespace default --as system:serviceaccount:default:sa-test1
yes
-------------------------------------------
個(gè)性簽名:獨(dú)學(xué)而無友,則孤陋而寡聞。做一個(gè)靈魂有趣的人!
如果覺得這篇文章對(duì)你有小小的幫助的話,記得在右下角點(diǎn)個(gè)“推薦”哦,在此感謝!

浙公網(wǎng)安備 33010602011771號(hào)