一、介绍
Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务。Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。
二、创建Service Account
1###serviceaccount(服务账号) 21、#创建serviceaccount 3kubectl create serviceaccount mysa 4 52、#查看mysa 6[root@k8s-m ~]# kubectl describe sa mysa 7Name: mysa 8Namespace: default 9Labels: <none> 10Annotations: <none> 11Image pull secrets: <none> 12Mountable secrets: mysa-token-2zjlp 13Tokens: mysa-token-2zjlp 14Events: <none> 153、#查看mysa自动创建的secret 16[root@k8s-m ~]# kubectl get secret 17NAME TYPE DATA AGE 18default-token-29dpx kubernetes.io/service-account-token 3 119d 19mysa-token-2zjlp kubernetes.io/service-account-token 3 1m 20 214、#使用mysa的sa资源配置pod 22[root@k8s-m ~]# cat mysa-pod.yaml 23apiVersion: v1 24kind: Pod 25metadata: 26 name: nginx-pod 27 labels: 28 app: my-pod 29 30spec: 31 containers: 32 - name: my-pod 33 image: nginx 34 ports: 35 - name: http 36 containerPort: 80 37 serviceAccountName: mysa 38 5、#导入 39[root@k8s-m ~]# kubectl apply -f mysa-pod.yaml 40 41 426、#查看 43[root@k8s-m ~]# kubectl describe pod nginx-pod 44 457、#查看使用的token和secret(使用的是mysa的token) 46kubectl 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##创建账号 2#1、创建私钥 3(umask 077; openssl genrsa -out zhang.key 2048) 4#用此私钥创建一个csr(证书签名请求)文件 5openssl req -new -key zhang.key -out zhang.csr -subj "/CN=zhang" 6 7openssl x509 -req -in zhang.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out zhang.crt -days 365 8 9#2、查看证书内容 10openssl x509 -in zhang.crt -text -noout 11 12 13kubectl config set-credentials zhang --client-certificate=./zhang.crt --client-key=./zhang.key --embed-certs=true 14 15#3、设置上下文 16kubectl config set-context zhang@kubernetes --cluster=kubernetes --user=zhang 17 18#4、切换用户 19kubectl config use-context zhang@kubernetes 20 21 22##测试(还未赋予权限) 23[root@k8s-m ssl]# kubectl get pod 24No resources found. 25Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "default" 26 27 28##授权 29#K8S授权请求是http的请求 30对象URL格式: 31/apis/[GROUP]/[VERSION]/namespace/[NAMESPACE_NAME]/[KIND]/[OBJECT_ID] 32 33 34k8s授权方式分为:serviceaccount和自己签证ca证书的账号,及签证ca的用户组(group)上(授权给这个组的权限) 35 36#简介 37role: 381、允许的操作,如get,list等 392、允许操作的对象,如pod,svc等 40 41rolebinding:将哪个用户绑定到哪个role或clusterrole上 42 43clusterrole:(集群角色) 44clusterrolebinding:(绑定到集群) 453、如果使用rolebinding绑定到clusterrole上,表示绑定的用户只能用于当前namespace的权限 46 47 48#创建一个角色(role) 49kubectl create role myrole --verb=get,list,watch --resource=pod,svc 50 51#绑定用户zhang(上面创建的用户),绑定role为myrole 52kubectl create rolebinding myrole-binding --role=myrole --user=zhang 53#切换用户 54[root@k8s-m ~]# kubectl config use-context zhang@kubernetes 55Switched to context "zhang@kubernetes". 56 57#查看权限(只授权了default名称空间pod和svc的get,list,watch权限) 58[root@k8s-m ~]# kubectl get pod 59NAME READY STATUS RESTARTS AGE 60nginx-pod 0/1 ImagePullBackOff 0 1h 61[root@k8s-m ~]# kubectl get pod -n kube-system #无权访问kube-system 62No resources found. 63Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "kube-system" 64 65[root@k8s-m ~]# kubectl delete pod nginx-pod #无删除权限 66Error from server (Forbidden): pods "nginx-pod" is forbidden: User "zhang" cannot delete pods in the namespace "default" 67 68 69 70 71#创建clusterrole#可以访问全部的namespace 72kubectl create clusterrole mycluster-role --verb=get,list,watch --resource=pod,svc 73#删除zhang账号之前绑定的rolebinding 74kubectl delete rolebinding myrole-binding 75#使用clusterrolebinding绑定clusterrole 76kubectl create clusterrolebinding my-cluster-rolebinding --clusterrole=mycluster-role --user=zhang 77 78#切换账号 79kubectl config use-context zhang@kubernetes 80#查看权限 查看kube-system空间的pod 81[root@k8s-m ~]# kubectl get pod -n kube-system 82NAME READY STATUS RESTARTS AGE 83coredns-78fcdf6894-67h9h 1/1 Running 1 11h 84coredns-78fcdf6894-lzxmz 1/1 Running 1 11h 85etcd-k8s-m 1/1 Running 2 11h 86......
配置一个新账号和配置文件并授权
1##创建证书 2(umask 077; openssl genrsa -out k8s.key 2048) 3#用此私钥创建一个csr(证书签名请求)文件(/0是组名) 4openssl req -new -key k8s.key -out k8s.csr -subj "/CN=k8s/O=zhang" 5 6openssl x509 -req -in k8s.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out k8s.crt -days 365 7 8#查看证书内容 9openssl x509 -in k8s.crt -text -noout 10 11##创建secret 12#创建一个generic的secre namespace设置为default 13kubectl create secret generic k8s -n default --from-file=k8s.crt=./k8s.crt --from-file=k8s.key=./k8s.key 14#查看 15[root@k8s-m ~]# kubectl get secret |grep k8s 16k8s Opaque 2 35s 17 18 19 20###配置生成 21kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server="https://10.0.0.141:6443" --embed-certs=true --kubeconfig=./k8s.config 22 23## 配置客户端认证 24kubectl config set-credentials k8s --client-certificate=./k8s.crt --client-key=./k8s.key --embed-certs=true --kubeconfig=./k8s.config 25 26### 配置关联 27kubectl config set-context k8s@user --cluster=kubernetes --user=k8s --kubeconfig=./k8s.config 28 29 30 31##创建role 32 kubectl create role k8s-role --verb=get,list,watch --resource=pod,svc 33#创建rolebinding 34kubectl create rolebinding k8s-rolebinding --role=k8s-role --user=k8s 35 36#替换配置文件 37[root@k8s-m ~]# mv /root/.kube/config /mnt/ 38[root@k8s-m ~]# cp k8s.config /root/.kube/config 39#修改config的current-context内容 40current-context: "" 41改成# 42current-context: name: k8s@user 43 44##查看 45[root@k8s-m ~]# kubectl get pod 46NAME READY STATUS RESTARTS AGE 47my-statefulset-0 0/1 ContainerCreating 0 8d 48nginx-6f858d4d45-6qm6g 0/1 ImagePullBackOff 0 9d 49[root@k8s-m ~]# kubectl get pod -n kube-system 50No resources found. 51Error from server (Forbidden): pods is forbidden: User "k8s" cannot list pods in the namespace "kube-system"