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