Service Account和RBAC授權


一、介紹

Service Account概念的引入是基於這樣的使用場景:運行在pod里的進程需要調用Kubernetes API以及非Kubernetes API的其它服務。Service Account它並不是給kubernetes集群的用戶使用的,而是給pod里面的進程使用的,它為pod提供必要的身份認證。

二、創建Service Account

###serviceaccount(服務賬號)
1、#創建serviceaccount 
kubectl  create  serviceaccount  mysa

2、#查看mysa
[root@k8s-m ~]# kubectl  describe sa mysa 
Name:                mysa
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   mysa-token-2zjlp
Tokens:              mysa-token-2zjlp
Events:              <none>
3、#查看mysa自動創建的secret
[root@k8s-m ~]# kubectl  get secret
NAME                  TYPE                                  DATA      AGE
default-token-29dpx   kubernetes.io/service-account-token   3         119d
mysa-token-2zjlp      kubernetes.io/service-account-token   3         1m

4、#使用mysa的sa資源配置pod
[root@k8s-m ~]# cat mysa-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels: 
    app: my-pod
     
spec:
  containers:
  - name: my-pod
    image: nginx
    ports:
    - name: http
      containerPort: 80
  serviceAccountName: mysa 
  5、#導入
[root@k8s-m ~]# kubectl apply -f  mysa-pod.yaml


6、#查看
[root@k8s-m ~]# kubectl  describe pod nginx-pod

7、#查看使用的token和secret(使用的是mysa的token)
kubectl  get  pod nginx-pod  -o jsonpath={".spec.volumes"}

  

創建k8s賬號及RBAC授權

一、介紹

在Kubernetes中,授權有ABAC(基於屬性的訪問控制)、RBAC(基於角色的訪問控制)、Webhook、Node、AlwaysDeny(一直拒絕)和AlwaysAllow(一直允許)這6種模式。從1.6版本起,Kubernetes 默認啟用RBAC訪問控制策略。從1.8開始,RBAC已作為穩定的功能。通過設置–authorization-mode=RBAC,啟用RABC。在RABC API中,通過如下的步驟進行授權:1)定義角色:在定義角色時會指定此角色對於資源的訪問控制的規則;2)綁定角色:將主體與角色進行綁定,對用戶進行訪問授權。

二、創建k8s賬號與RBAC授權使用

##創建賬號
#1、創建私鑰
(umask 077; openssl genrsa -out zhang.key 2048)
#用此私鑰創建一個csr(證書簽名請求)文件
openssl  req -new -key zhang.key -out zhang.csr -subj  "/CN=zhang"

openssl x509 -req -in zhang.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out zhang.crt -days 365

#2、查看證書內容
openssl  x509 -in zhang.crt  -text -noout


kubectl   config  set-credentials zhang  --client-certificate=./zhang.crt  --client-key=./zhang.key   --embed-certs=true 

#3、設置上下文
kubectl  config   set-context  zhang@kubernetes --cluster=kubernetes --user=zhang

#4、切換用戶
kubectl  config use-context zhang@kubernetes


##測試(還未賦予權限)
[root@k8s-m ssl]# kubectl  get pod
No resources found.
Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "default"


##授權
#K8S授權請求是http的請求
對象URL格式:
/apis/[GROUP]/[VERSION]/namespace/[NAMESPACE_NAME]/[KIND]/[OBJECT_ID]


k8s授權方式分為:serviceaccount和自己簽證ca證書的賬號,及簽證ca的用戶組(group)上(授權給這個組的權限)

#簡介
role:
1、允許的操作,如get,list等
2、允許操作的對象,如pod,svc等

rolebinding:將哪個用戶綁定到哪個role或clusterrole上

clusterrole:(集群角色)
clusterrolebinding:(綁定到集群)
3、如果使用rolebinding綁定到clusterrole上,表示綁定的用戶只能用於當前namespace的權限


#創建一個角色(role)
kubectl  create role  myrole  --verb=get,list,watch --resource=pod,svc

#綁定用戶zhang(上面創建的用戶),綁定role為myrole
kubectl  create  rolebinding myrole-binding  --role=myrole  --user=zhang
#切換用戶
[root@k8s-m ~]# kubectl  config use-context zhang@kubernetes
Switched to context "zhang@kubernetes".

#查看權限(只授權了default名稱空間pod和svc的get,list,watch權限)
[root@k8s-m ~]# kubectl  get pod
NAME                     READY     STATUS              RESTARTS   AGE
nginx-pod                0/1       ImagePullBackOff    0          1h
[root@k8s-m ~]# kubectl  get pod -n kube-system #無權訪問kube-system
No resources found.
Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "kube-system"

[root@k8s-m ~]# kubectl  delete pod nginx-pod #無刪除權限
Error from server (Forbidden): pods "nginx-pod" is forbidden: User "zhang" cannot delete pods in the namespace "default"




#創建clusterrole#可以訪問全部的namespace
kubectl  create clusterrole mycluster-role --verb=get,list,watch  --resource=pod,svc  
#刪除zhang賬號之前綁定的rolebinding
kubectl  delete rolebinding myrole-binding  
#使用clusterrolebinding綁定clusterrole
kubectl  create clusterrolebinding my-cluster-rolebinding   --clusterrole=mycluster-role  --user=zhang

#切換賬號
kubectl  config use-context zhang@kubernetes
#查看權限 查看kube-system空間的pod
[root@k8s-m ~]# kubectl  get pod -n kube-system
NAME                            READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-67h9h        1/1       Running   1          11h
coredns-78fcdf6894-lzxmz        1/1       Running   1          11h
etcd-k8s-m                      1/1       Running   2          11h
......

  

 

配置一個新賬號和配置文件並授權

##創建證書
(umask 077; openssl genrsa -out k8s.key 2048)
#用此私鑰創建一個csr(證書簽名請求)文件(/0是組名)
openssl  req -new -key k8s.key -out k8s.csr -subj  "/CN=k8s/O=zhang"

openssl x509 -req -in k8s.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out k8s.crt -days 365

#查看證書內容
openssl  x509 -in k8s.crt  -text -noout

##創建secret
#創建一個generic的secre namespace設置為default
kubectl  create  secret generic k8s  -n default  --from-file=k8s.crt=./k8s.crt   --from-file=k8s.key=./k8s.key
#查看
[root@k8s-m ~]# kubectl  get secret |grep k8s
k8s                   Opaque                                2         35s



###配置生成
kubectl config set-cluster  kubernetes    --certificate-authority=/etc/kubernetes/pki/ca.crt  --server="https://10.0.0.141:6443"  --embed-certs=true   --kubeconfig=./k8s.config

## 配置客戶端認證
kubectl config set-credentials k8s --client-certificate=./k8s.crt   --client-key=./k8s.key --embed-certs=true  --kubeconfig=./k8s.config 

### 配置關聯
kubectl  config   set-context  k8s@user --cluster=kubernetes --user=k8s --kubeconfig=./k8s.config



##創建role
 kubectl  create role  k8s-role  --verb=get,list,watch --resource=pod,svc
#創建rolebinding
kubectl  create  rolebinding k8s-rolebinding  --role=k8s-role  --user=k8s

#替換配置文件
[root@k8s-m ~]# mv /root/.kube/config    /mnt/
[root@k8s-m ~]# cp k8s.config  /root/.kube/config 
#修改config的current-context內容
current-context: ""
改成# 
current-context: name: k8s@user

##查看
[root@k8s-m ~]# kubectl  get pod 
NAME                     READY     STATUS              RESTARTS   AGE
my-statefulset-0         0/1       ContainerCreating   0          8d
nginx-6f858d4d45-6qm6g   0/1       ImagePullBackOff    0          9d
[root@k8s-m ~]# kubectl  get pod  -n kube-system
No resources found.
Error from server (Forbidden): pods is forbidden: User "k8s" cannot list pods in the namespace "kube-system"

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM