一、RBAC概述
1,k8s集群的交互邏輯(簡(jiǎn)單了解)
? ? ? ? 我們通過(guò)k8s各組件架構(gòu),指導(dǎo)各個(gè)組件之間是使用https進(jìn)行數(shù)據(jù)加密及交互的,那么同理,我們作為“使用”k8s的各種資源,也是通過(guò)https進(jìn)行數(shù)據(jù)加密的;
? ? ? ? k8s通過(guò)我們家目錄下的證書來(lái)判斷我們是誰(shuí)?通過(guò)證書內(nèi)容,認(rèn)定我們的權(quán)限;
用戶證書的位置
[root@k8s231 ~]# ll -a .kube/config?
-rw------- 1 root root 5634 Jan ?1 19:40 .kube/config
2,k8s的安全架構(gòu)(簡(jiǎn)單了解)
3,RBAC用戶授權(quán)的邏輯(重要)
用戶/主題Topic
? ? ? ? 1,User
? ? ? ? 2,SerciceAccount
? ? ? ? 3,Group
用戶角色:
? ? ? ? 1,Role:局部資源角色
? ? ? ? 2,ClusterRole:全局資源角色
角色綁定:
? ? ? ? 1,RoleBinding
? ? ? ? 2,ClusterRoleBinding
4,查看現(xiàn)有的集群默認(rèn)角色
[root@k8s231 ~]# kubectl get clusterrole | grep -v system
admin:主要用于授權(quán)命名空間所有讀寫的權(quán)限
cluster-admin:超級(jí)管理員,由集群所有權(quán)限
edit:允許對(duì)大多數(shù)對(duì)象進(jìn)行讀寫操作,不允許查看或者修改角色、角色綁定;
view:允許對(duì)命名空間大多數(shù)對(duì)象進(jìn)行讀寫,不允許查看角色、角色綁定、secret;
#####
kubeadm用戶,只有使用kubeadm部署k8s時(shí)才會(huì)出現(xiàn),不用關(guān)心它;
二、流程介紹
1,用戶的創(chuàng)建流程
1,User
2,SerciceAccount
3,Group
? ? ? ? 本質(zhì)上講,在k8s系統(tǒng)中,用戶,就是一個(gè)文件,這個(gè)文件在當(dāng)前登錄用戶的家目錄下;
這個(gè)文件config,就代表“我”是誰(shuí);
????????這里面并沒有角色、權(quán)限信息,角色和權(quán)限信息,在其他位置;
[root@k8s231 ~]# ll .kube/config?
-rw------- 1 root root 5634 Jan ?1 19:40 .kube/config
????????所以,要?jiǎng)?chuàng)建用戶,就是要?jiǎng)?chuàng)建這個(gè)文件;
? ? ? ? 那么如何創(chuàng)建這個(gè)文件吶?
· ssl流程介紹
? ? ? ? 知道了ssl原理,https請(qǐng)求過(guò)程,我們就了解了,ssl的安全機(jī)制;
? ? ? ? 實(shí)際上k8s當(dāng)中“根證書”早就生成好了,在我們kubeadm部署的時(shí)候,就自動(dòng)幫我們生成了;
? ? ? ? k8s是模擬ca機(jī)構(gòu),給自己頒發(fā)證書,自己驗(yàn)證自己,所以,整數(shù)中有私鑰、公鑰等;
[root@k8s231 ~]# ll /etc/kubernetes/pki/
total 56
-rw-r--r-- 1 root root 1281 Jan ?1 19:39 apiserver.crt
-rw-r--r-- 1 root root 1155 Jan ?1 19:39 apiserver-etcd-client.crt
-rw------- 1 root root 1679 Jan ?1 19:39 apiserver-etcd-client.key
-rw------- 1 root root 1675 Jan ?1 19:39 apiserver.key
-rw-r--r-- 1 root root 1164 Jan ?1 19:39 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 Jan ?1 19:39 apiserver-kubelet-client.key#根證書
-rw-r--r-- 1 root root 1099 Jan ?1 19:39 ca.crt#ca機(jī)構(gòu)的私鑰
-rw------- 1 root root 1679 Jan ?1 19:39 ca.key
drwxr-xr-x 2 root root ?162 Jan ?1 19:39 etcd
-rw-r--r-- 1 root root 1115 Jan ?1 19:39 front-proxy-ca.crt
-rw------- 1 root root 1675 Jan ?1 19:39 front-proxy-ca.key
-rw-r--r-- 1 root root 1119 Jan ?1 19:39 front-proxy-client.crt
-rw------- 1 root root 1679 Jan ?1 19:39 front-proxy-client.key
-rw------- 1 root root 1675 Jan ?1 19:39 sa.key
-rw------- 1 root root ?451 Jan ?1 19:39 sa.pub
· 生成用戶證書
? ? ? ? 一個(gè)用戶一個(gè)證書,這個(gè)用戶證書,就是用來(lái)生成,用戶文件的(也就是家目錄下的config)
· 生成kubeconfig用戶授權(quán)文件
? ? ? ? 有了這個(gè)授權(quán)文件,我們就擁有了一個(gè)用戶了;
? ? ? ? 但是,還沒有任何權(quán)限,還無(wú)法使用;
2,創(chuàng)建角色和規(guī)則
? ? ? ? 通過(guò)資源清單的方式,創(chuàng)建角色和規(guī)則;
? ? ? ? 角色就是:
1,Role:局部資源角色
2,ClusterRole:全局資源角色
? ? ? ? 規(guī)則就是:這個(gè)角色的權(quán)限;能使用什么資源、不能使用什么資源,,,,
3,角色與用戶的綁定
? ? ? ? 根據(jù)角色的不同,創(chuàng)建資源清單,對(duì)應(yīng)不同的綁定資源清單的編寫;
1,RoleBinding
2,ClusterRoleBinding
? ? ? ? 只要角色和用戶綁定完成,那么,RBAC的整個(gè)流程就結(jié)束了;
? ? ? ? 我們就成功創(chuàng)建了一個(gè)帶有特定權(quán)限的用戶;就可以分發(fā)給“同事”進(jìn)行使用了;
4,邏輯流程的總結(jié)
三、RBAC創(chuàng)建初體驗(yàn)
1,創(chuàng)建用戶【user】
· 生成用戶ssl證書
? ? ? ? 以往我們使用openssl的工具命令生成證書,比較繁瑣,本次學(xué)習(xí),我給大家介紹一個(gè)證書生成工具,叫做cfssl證書生成工具;
1,上傳/下載cfssl證書生成工具
cfssl工具百度網(wǎng)盤地址:
鏈接:https://pan.baidu.com/s/1gDRQuxekvgInplLkpjvhQw?pwd=f31x?
提取碼:f31x
或者去github地址下載:Releases · cloudflare/cfssl · GitHub
[root@k8s231 rbac]# rz -E
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 10808877 Nov ?8 00:30 cfssl.zip
2,解壓cfssl工具壓縮包
[root@k8s231 rbac]# unzip cfssl.zip?
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 12054528 Aug 30 15:46 cfssl_1.6.4_linux_amd64
-rw-r--r-- 1 root root ?9560064 Aug 30 15:45 cfssl-certinfo_1.6.4_linux_amd64
-rw-r--r-- 1 root root ?7643136 Aug 30 15:48 cfssljson_1.6.4_linux_amd64
-rw-r--r-- 1 root root 10808877 Nov ?8 00:30 cfssl.zip
3,刪除壓縮包,將cfssl文件改名
? ? ? ? 為什么改名?為了便于使用~如果你不嫌費(fèi)力,可以不改~
[root@k8s231 rbac]# rm -rf cfssl.zip?
[root@k8s231 rbac]# rename _1.6.4_linux_amd64 "" *
[root@k8s231 rbac]# ll
-rw-r--r-- 1 root root 12054528 Aug 30 15:46 cfssl
-rw-r--r-- 1 root root ?9560064 Aug 30 15:45 cfssl-certinfo
-rw-r--r-- 1 root root ?7643136 Aug 30 15:48 cfssljson
4,將cfssl文件編程全局命令
? ? ? ? 將這三個(gè)文件,移動(dòng)到/usr/local/bin目錄下,編程全局命令~
[root@k8s231 rbac]# mv ./* /usr/local/bin/
5,給cfssl執(zhí)行文件加執(zhí)行權(quán)限
[root@k8s231 rbac]# chmod +x /usr/local/bin/cfssl*
6,編輯cfssl工具的生成用戶ssl證書的配置文件
? ? ? ? 根證書
[root@k8s231 rbac]# cat ca-config.json?
{
? "signing": {
? ? "default": {
? ? ? "expiry": "87600h"
? ? },
? ? "profiles": {
? ? ? "kubernetes": {
? ? ? ? "usages": [
? ? ? ? ? ? "signing",
? ? ? ? ? ? "key encipherment",
? ? ? ? ? ? "server auth",
? ? ? ? ? ? "client auth"
? ? ? ? ],
? ? ? ? "expiry": "87600h"
? ? ? }
? ? }
? }
}
? ? ? ? 客戶端驗(yàn)證簽名證書
[root@k8s231 rbac]# cat csr.json?
{
? "CN": "xinjizhiwa",
? "hosts": [],
? "key": {
? ? "algo": "rsa",
? ? "size": 2048
? },
? "names": [
? ? {
? ? ? "C": "CN",
? ? ? "ST": "BeiJing",
? ? ? "L": "BeiJing",
? ? ? "O": "k8s",
? ? ? "OU": "System"
? ? }
? ]
}
7,使用cfssl工具生成用戶的ssl證書
[root@k8s231 rbac]# cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes csr.json | cfssljson -bare xinjizhiwa
參數(shù)解釋:
#使用k8s自帶的證書來(lái)簽發(fā)客戶端證書(位置就在/etc/kubernetes/pki/下面);
-ca=/etc/kubernetes/pki/ca.crt?
-ca-key=/etc/kubernetes/pki/ca.key?
-config=ca-config.json?
-profile=kubernetes csr.json | cfssljson -bare xinjizhiwa
查看證書
[root@k8s231 rbac]# ll
total 20
-rw-r--r-- 1 root root ?292 Feb 21 20:06 ca-config.json
-rw-r--r-- 1 root root ?223 Feb 21 20:07 csr.json
-rw-r--r-- 1 root root 1001 Feb 21 20:11 xinjizhiwa.csr
-rw------- 1 root root 1675 Feb 21 20:11 xinjizhiwa-key.pem
-rw-r--r-- 1 root root 1285 Feb 21 20:11 xinjizhiwa.pem
至此,我們用戶的ssl證書申請(qǐng)完畢了;
· 生成用戶kubeconfig文件
1,編輯生成kubeconfig文件的執(zhí)行腳本
[root@k8s231 rbac]# cat kubeconfig.sh?
#!/bin/bash# 配置集群;
# --certificate-authority:指定K8s的ca根證書文件路徑
# --embed-certs:
# ? 1,true,表示將根證書文件的內(nèi)容寫入到配置文件中,
# ? 2,false,則只是引用配置文件,將kubeconfig
# --server:指定APIServer的地址。
# --kubeconfig:指定kubeconfig的配置文件名稱
kubectl config set-cluster xinjizhiwa-cluster \
? --certificate-authority=/etc/kubernetes/pki/ca.crt \
? --embed-certs=true \
? --server=https://10.0.0.231:6443 \
? --kubeconfig=xinjizhiwa.kubeconfig
?
# 設(shè)置客戶端認(rèn)證,客戶端將來(lái)需要攜帶證書讓服務(wù)端驗(yàn)證
kubectl config set-credentials xinjizhiwa-client \
? --client-key=xinjizhiwa-key.pem \
? --client-certificate=xinjizhiwa.pem \
? --embed-certs=true \
? --kubeconfig=xinjizhiwa.kubeconfig# 設(shè)置默認(rèn)上下文,可以用于綁定多個(gè)客戶端和服務(wù)端的對(duì)應(yīng)關(guān)系(客戶端和服務(wù)端綁定)。
kubectl config set-context xinjizhiwa \
? --cluster=xinjizhiwa-cluster \
? --user=xinjizhiwa-client \
? --kubeconfig=xinjizhiwa.kubeconfig# 設(shè)置當(dāng)前使用的上下文(正式生效)
kubectl config use-context xinjizhiwa --kubeconfig=xinjizhiwa.kubeconfig
2,執(zhí)行生成kubeconfig用戶文件的執(zhí)行腳本
? ? ? ? 正式生成用戶
[root@k8s231 rbac]# bash kubeconfig.sh?
Cluster "xinjizhiwa-cluster" set.
User "xinjizhiwa-client" set.
Context "xinjizhiwa" created.
Switched to context "xinjizhiwa".
查看生成的kubeconfig用戶文件
[root@k8s231 rbac]# ll
......
-rw------- 1 root root 5802 Feb 21 20:24 xinjizhiwa.kubeconfig
拓展知識(shí):也可以使用config資源清單編寫生成用戶kubeconfig文件
[root@k8s231 rbac]# cat xinjizhiwa.kubeconfig?
apiVersion: v1
clusters:
- cluster:
? ? certificate-authority-data: ......(/etc/kubernetes/pki/ca.crt)
? ? server: https://10.0.0.231:6443
? name: xinjizhiwa-cluster
contexts:
- context:
? ? cluster: xinjizhiwa-cluster
? ? user: xinjizhiwa-client
? name: xinjizhiwa
current-context: xinjizhiwa
kind: Config
preferences: {}
users:
- name: xinjizhiwa-client
? user:
? ? client-certificate-data: .......(xinjizhiwa.pem或者寫入公鑰串,pem記得base64 -d之后使用)
? ? client-key-data: ......(xinjizhiwa-key.pem)
此時(shí)使用這個(gè)用戶,取查看pod,會(huì)提示你沒有權(quán)限,因?yàn)樵蹅冞€沒有創(chuàng)建、綁定角色;
[root@k8s231 rbac]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig
至此,我們用戶“xinjizhiwa”就創(chuàng)建完成了;
2,創(chuàng)建角色編寫規(guī)則
· 編輯角色資源清單
? ? ? ? 上述內(nèi)容中,我們知道,角色有兩種,一種是全局角色ClusterRole,另一種是局部角色Role;
? ? ? ? 我們先創(chuàng)建一個(gè)局部的Role角色作為學(xué)習(xí);
[root@k8s231 rbac]# cat role.yaml?
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
? name: xinjizhiwa-role
? namespace: default
rules:
? #聲明API組;[""]代表v1;["apps"]代表apps/v1
- apiGroup: ["","apps"]
? #聲明API組下面的資源類型(不支持簡(jiǎn)寫,只能寫全稱)
? resources: ["pods","deployments","services"]
? #聲明使用方式(動(dòng)作增刪改查、、)
? verbs: ["get","list","delete"]
· 創(chuàng)建角色
[root@k8s231 rbac]# kubectl apply -f role.yaml
查看角色
[root@k8s231 rbac]# kubectl get role
NAME ? ? ? ? ? ? ?CREATED AT
xinjizhiwa-role ? 2024-02-21T13:19:34Z
至此,用戶和角色及規(guī)則都創(chuàng)建成功了;
3,綁定用戶與角色
· 編輯綁定資源清單
[root@k8s231 rbac]# cat bind.yaml?
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
? name: xinjizhiwa-bind
? namespace: default
#聲明用戶主體(綁定的用戶是哪個(gè))
subjects:
#由于我們用戶類型有三種,所以需要寫明用戶類型;
- kind: User
? #用戶名稱
? name: xinjizhiwa
? apiGroup: rbac.authorization.k8s.io
#聲明角色主體(綁定的角色是哪個(gè)?)
roleRef:?
? #角色類型
? kind: Role
? #角色名稱
? name: xinjizhiwa-role
? apiGroup: rbac.authorization.k8s.io
· 創(chuàng)建綁定資源
[root@k8s231 rbac]# kubectl apply -f bind.yaml
4,測(cè)試用戶
協(xié)議個(gè)pod資源,使用用戶“xinjizhiwa”創(chuàng)建,發(fā)現(xiàn)創(chuàng)建不了,提示權(quán)限不夠;
因?yàn)椋覀冊(cè)趧?chuàng)建角色規(guī)則的時(shí)候,只給了刪除、和查看的能力,沒有給create創(chuàng)建能力;
[root@k8s231 rbac]# cat pod.yaml?
apiVersion: v1
kind: Pod
metadata:
? name: pod-nginx
spec:
? containers:
? - name: c1
? ? image: nginx:1.20.1-alpine
[root@k8s231 rbac]# kubectl apply -f pod.yaml --kubeconfig=xinjizhiwa.kubeconfig
因?yàn)槲覀冇衐efault默認(rèn)名稱空間的查看、刪除權(quán)限,所以我們可以進(jìn)行查看;
測(cè)試查看功能
[root@k8s231 rbac]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig
測(cè)試刪除功能
[root@k8s231 rbac]# kubectl delete deploy --all --kubeconfig=xinjizhiwa.kubeconfig
到此,普通用戶的創(chuàng)建、角色綁定、角色配置就學(xué)習(xí)完畢了;
四、其他節(jié)點(diǎn)使用用戶登錄操作k8s
? ? ? ? 我們有了用戶文件,將用戶文件發(fā)送給“同事”,同事直接使用這個(gè)文件,就可以按照綁定的規(guī)則,操作k8s資源了;
1,模擬將用戶文件發(fā)給同事
? ? ? ? 比如,同事正在使用k8s233,我們把用戶文件發(fā)給他
[root@k8s231 rbac]# scp xinjizhiwa.kubeconfig k8s233:/root/
2,同事在k8s233使用用戶文件操作k8s資源
[root@k8s233 ~]# kubectl get pods --kubeconfig=xinjizhiwa.kubeconfig
3,操作資源不指定文件,默認(rèn)指定設(shè)置
[root@k8s233 ~]# cp xinjizhiwa.kubeconfig ./.kube/config
[root@k8s233 ~]# kubectl get pods
五、用戶組Group案例
1,用戶組的概念
1,用戶組的好處在于,無(wú)需單獨(dú)為一個(gè)用戶創(chuàng)建權(quán)限和綁定了,只需要統(tǒng)一把一個(gè)組進(jìn)行授權(quán),然后,將該組的用戶加入進(jìn)去,就沒一個(gè)用戶都擁有該組的權(quán)限了;
2,APIserver會(huì)優(yōu)先校驗(yàn)用戶名(ssl證書中的CN字段),若用戶名沒有對(duì)應(yīng)的權(quán)限,則再去校驗(yàn)用戶組(o)的權(quán)限;
? ? ? ? k8s中的用戶、用戶組都是提取ssl證書簽名字段中的一個(gè)字段,不是在集群中創(chuàng)建的;
--證書簽名中的CN字段:代表用戶
--證書簽名中的o字段:代表用戶組
2,創(chuàng)建用戶組Group
· 編輯cfssl證書請(qǐng)求文件
[root@k8s231 group]# cat ca-group.json?
{
? "signing": {
? ? "default": {
? ? ? "expiry": "87600h"
? ? },
? ? "profiles": {
? ? ? "kubernetes": {
? ? ? ? "usages": [
? ? ? ? ? ? "signing",
? ? ? ? ? ? "key encipherment",
? ? ? ? ? ? "server auth",
? ? ? ? ? ? "client auth"
? ? ? ? ],
? ? ? ? "expiry": "87600h"
? ? ? }
? ? }
? }
}
[root@k8s231 group]# cat xinjizhiwa-csr.json?
{
? "CN": "xinjizhiwa",
? "hosts": [],
? "key": {
? ? "algo": "rsa",
? ? "size": 2048
? },
? "names": [
? ? {
? ? ? "C": "CN",
? ? ? "ST": "BeiJing",
? ? ? "L": "BeiJing",
? ? ? "O": "xinjizhiwa-group",
? ? ? "OU": "System"
? ? }
? ]
}
· 生成用戶組證書
再次聲明,你創(chuàng)建的是用戶、還是用戶組,取決于你的證書名稱選擇的簽名字段,選擇的是CN還是o;
[root@k8s231 group]# cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-group.json -profile=kubernetes xinjizhiwa-csr.json | cfssljson -bare xinjizhiwa-group
· 編輯腳本生成用戶組kubeconfig用戶組文件
[root@k8s231 group]# cat kubeconfig.sh?
#!/bin/bashkubectl config set-cluster xinjizhiwa-cluster \
? --certificate-authority=/etc/kubernetes/pki/ca.crt \
? --embed-certs=true \
? --server=https://10.0.0.231:6443 \
? --kubeconfig=xinjizhiwa-group.kubeconfig
?
# 設(shè)置客戶端認(rèn)證
kubectl config set-credentials xinjizhiw-client \
? --client-key=xinjizhiwa-group-key.pem \
? --client-certificate=xinjizhiwa-group.pem \
? --embed-certs=true \
? --kubeconfig=xinjizhiwa-group.kubeconfig# 設(shè)置默認(rèn)上下文
kubectl config set-context xinjizhiwa-group \
? --cluster=xinjizhiwa-cluster \
? --user=xinjizhiw-client \
? --kubeconfig=xinjizhiwa-group.kubeconfig# 設(shè)置當(dāng)前使用的上下文
kubectl config use-context xinjizhiwa-group --kubeconfig=xinjizhiwa-group.kubeconfig
· 執(zhí)行腳本生成用戶組文件
[root@k8s231 group]# bash kubeconfig.sh
3,創(chuàng)建角色、綁定用戶組
· 編輯資源清單
[root@k8s231 group]# cat rbac.yaml?
#創(chuàng)建角色
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
? namespace: default
? name: role-group
rules:
- apiGroups: ["","apps"] ?
? resources: ["pods","nodes","services","deployments"] ?
? verbs: ["get", "watch", "list","create"] ?---
#綁定用戶組與角色
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
? name: group-rolebinding
? namespace: default
#聲明要綁定的用戶/用戶組
subjects:
? # 聲明主體類型:組
- kind: Group
? # 組名(對(duì)應(yīng)的O字段)
? name: xinjizhiwa-group ?
? apiGroup: rbac.authorization.k8s.io
roleRef:
? # 角色類型
? kind: Role ?
? # 綁定角色名稱
? name: role-group
? apiGroup: rbac.authorization.k8s.io
· 創(chuàng)建用戶組kubeconfig文件
[root@k8s231 group]# kubectl apply -f rbac.yaml
此時(shí),我們就擁有了xinjizhiwa-group這個(gè)用戶組了;
4,創(chuàng)建用戶加入用戶組
· 創(chuàng)建用戶
[root@k8s231 user]# cat ca-config.json?
{
? "signing": {
? ? "default": {
? ? ? "expiry": "87600h"
? ? },
? ? "profiles": {
? ? ? "kubernetes": {
? ? ? ? "usages": [
? ? ? ? ? ? "signing",
? ? ? ? ? ? "key encipherment",
? ? ? ? ? ? "server auth",
? ? ? ? ? ? "client auth"
? ? ? ? ],
? ? ? ? "expiry": "87600h"
? ? ? }
? ? }
? }
}
?
[root@k8s231 user]# cat group-user-xjzw.json?
{
? "CN": "xjzw",
? "hosts": [],
? "key": {
? ? "algo": "rsa",
? ? "size": 2048
? },
? "names": [
? ? {
? ? ? "C": "CN",
? ? ? "ST": "BeiJing",
? ? ? "L": "BeiJing",
? ? ? "O": "xinjizhiwa-group",
? ? ? "OU": "System"
? ? }
? ]
}
生成用戶證書
[root@k8s231 user]# cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes group-user-xjzw.json | cfssljson -bare xjzw
· xjzw用戶加入用戶組
1,編輯生成kubeconfig用戶文件的執(zhí)行腳本
[root@k8s231 user]# ca kubeconfig.sh?
-bash: ca: command not found
[root@k8s231 user]# cat kubeconfig.sh?
#!/bin/bashkubectl config set-cluster xinjizhiwa-cluster \
? --certificate-authority=/etc/kubernetes/pki/ca.crt \
? --embed-certs=true \
? --server=https://10.0.0.231:6443 \
? --kubeconfig=xjzw.kubeconfig
?
# 設(shè)置客戶端認(rèn)證
kubectl config set-credentials xjzw-client \
? --client-key=xjzw-key.pem \
? --client-certificate=xjzw.pem \
? --embed-certs=true \
? --kubeconfig=xjzw.kubeconfig# 設(shè)置默認(rèn)上下文
kubectl config set-context xinjizhiwa-contest \
? --cluster=xinjizhiwa-cluster \
? --user=xjzw-client \
? --kubeconfig=xjzw.kubeconfig# 設(shè)置當(dāng)前使用的上下文
kubectl config use-context xinjizhiwa-contest --kubeconfig=xjzw.kubeconfig
2,執(zhí)行腳本
[root@k8s231 user]# bash kubeconfig.sh
5,測(cè)試用戶是否擁有用戶組的權(quán)限
[root@k8s231 user]# kubectl get pods --kubeconfig=xjzw.kubeconfig
總結(jié),只要擁有了用戶組,我們創(chuàng)建用戶的時(shí)候,簽名中“O”字段,與用戶組名相同,那么創(chuàng)建出來(lái)的用戶,就擁有了用戶組的權(quán)限,就不在需要配置角色、綁定了;方便了很多;
六、基于【服務(wù)賬號(hào)serviceaccount】授權(quán)
? ? ? ? serviceaccount用戶,簡(jiǎn)稱sa資源,用于自動(dòng)化程序的用戶創(chuàng)建;
? ? ? ? 創(chuàng)建sa用戶,就不需要使用證書來(lái)創(chuàng)建了,它是k8s集群中的一個(gè)資源,sa資源;
1,創(chuàng)建sa資源
· 聲明式創(chuàng)建
[root@k8s231 sa]# vim sa01.yaml
apiVersion: v1
kind: ServiceAccount
metadata:?
? name: py01
[root@k8s231 sa]# kubectl apply -f sa01.yaml?
serviceaccount/py01 created
查看sa服務(wù)賬號(hào)
[root@k8s231 sa]# kubectl get sa
NAME ? ? ?SECRETS ? AGE
default ? 1 ? ? ? ? 51d
py01 ? ? ?1 ? ? ? ? 4s
· 響應(yīng)式創(chuàng)建
[root@k8s231 sa]# kubectl create serviceaccount py02
查看sa用戶
[root@k8s231 sa]# kubectl get sa
NAME ? ? ?SECRETS ? AGE
default ? 1 ? ? ? ? 51d
py01 ? ? ?1 ? ? ? ? 2m4s
py02 ? ? ?1 ? ? ? ? 4s
2,授權(quán)python程序?qū)8s-API的訪問權(quán)限
· 創(chuàng)建用戶
[root@k8s231 sa]# kubectl create serviceaccount py02
· 創(chuàng)建角色
[root@k8s231 sa]# vim role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
? name: python-role
rules:
- apiGroups: [""]
? resources: ["pods"]
? verbs: ["get","watch","list"]
[root@k8s231 sa]# kubectl apply -f role.yaml
· 綁定sa賬號(hào)和角色
[root@k8s231 sa]# vim bind.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
? name: python-role-sa
subjects:
- kind: ServiceAccount?
? name: py02
roleRef:
? kind: Role
? name: python-role
? apiGroup: rbac.authorization.k8s.io
[root@k8s231 sa]# kubectl apply -f bind.yaml
3,部署一個(gè)python的pod資源
[root@k8s231 sa]# vim pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: dm-py
spec:
? replicas: 2
? selector:
? ? matchLabels:
? ? ? apps: python
? template:
? ? metadata:
? ? ? labels:
? ? ? ? ?apps: python
? ? spec:
? ? ? #這里就是sa賬號(hào),指定sa的名稱,請(qǐng)確認(rèn)該賬號(hào)是有權(quán)限訪問K8S集群的喲!
? ? ? serviceAccountName: py02
? ? ? containers:
? ? ? - image: python:3.9.16-alpine3.16
? ? ? ? name: py
? ? ? ? command:
? ? ? ? - tail?
? ? ? ? - -f
? ? ? ? - /etc/hosts
[root@k8s231 sa]# kubectl apply -f pod.yaml
4,進(jìn)入pod中執(zhí)行python代碼
[root@k8s231 sa]# kubectl exec -it dm-py-64975879c8-b9sxg -- sh
/ # python --version
Python 3.9.16#寫一個(gè)python腳本
/ # cat > view-k8s-resources.py <<EOF
> from kubernetes import client, config
>?
> with open('/var/run/secrets/kubernetes.io/serviceaccount/token') as f:
> ? ? ?token = f.read()
>?
> configuration = client.Configuration()
> configuration.host = "https://kubernetes" ?# APISERVER地址
> configuration.ssl_ca_cert="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" ?# CA證書?
> configuration.verify_ssl = True ? # 啟用證書驗(yàn)證
> configuration.api_key = {"authorization": "Bearer " + token} ?# 指定Token字符串
> client.Configuration.set_default(configuration)
> apps_api = client.AppsV1Api()?
> core_api = client.CoreV1Api()?
> try:
> ? print("###### Deployment列表 ######")
> ? #列出default命名空間所有deployment名稱
> ? for dp in apps_api.list_namespaced_deployment("default").items:
> ? ? print(dp.metadata.name)
> except:
> ? print("沒有權(quán)限訪問Deployment資源!")
>?
> try:
> ? #列出default命名空間所有pod名稱
> ? print("###### Pod列表 ######")
> ? for po in core_api.list_namespaced_pod("default").items:
> ? ? print(po.metadata.name)
> except:
> ? print("沒有權(quán)限訪問Pod資源!")
> EOF
/ #?####安裝py使用k8s的插件########
/ # pip install kubernetes -i https://pypi.tuna.tsinghua.edu.cn/simple/#執(zhí)行python腳本
/ # python3 view-k8s-resources.py
###### Deployment列表 ######
沒有權(quán)限訪問Deployment資源!
###### Pod列表 ######
dm-py-64975879c8-b9sxg
dm-py-64975879c8-z76fp
pod-nginx文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-835535.html
至此,關(guān)于k8s的RBAC的學(xué)習(xí),就此結(jié)束;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-835535.html
到了這里,關(guān)于25-k8s集群中-RBAC用戶角色資源權(quán)限的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!