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"