一、介紹
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"