K8s:RBAC
K8s RBAC
1、作用
1、对不同namespace进行权限划分
2、鉴权、认证、准入控制。
2、鉴权流程
1、身份验证
1.1、apiserver对kubectl或者客户端、dashboard进行鉴权
1.2、检验:头部报文、证书、客户端证书、账号密码、token身份信息
1.3、身份信息是否合法(不合法就报错401终止请求)
2、鉴权
2.1、有没有执行动作权限:delete、get、
2.2、如果没有权限(直接报错403终止请求)
2.3、这一步的主要目的就是给不同的用户赋予不同的权限、权限的划分(只能看到自己namespace的pod)
3、准入控制(pod和ns级别的限制是否在准许范围之内)
3.1、上面两个步骤都通过之后、
3.2、只能看、不能删、
3.3、检查控制器的权限、有没有配置LimitRange、
比如kubelet有权限操作、通过LimitRange限制了最小值、创建操作成功、pod违反了限制条件、就会报错、禁止操作、拒绝创建,主要目的就是看有没有pod和ns级别的限制。
这几个步骤成功之后就实现交给deployment、replica-set、statefulset控制器等等开始创建pod
3、鉴权类型
鉴权模块:
RBAC
ABAC(基本不用)
node
webhook:http回调、发生事件时候进行通知回调。(需要添加证书、类似于Jenkins成功失败通知)
4、修改配置文件
find / -name kube-apiserver.service
修改service配置文件、去定义使用什么鉴权类型
5、创建流程
user—————>关联role—————>关联权限——————(get、delete、update、)
关联关系: user和role和role-binding都必须在同一个ns
注意:绑定role角色的时候有两种方式: Role和ClusterRole
6、RBAC资源对象
四种资源对象:
Role 一组资源对象、用于定义访问k8s名称空间中的资源对象(就是namespace)
RoleBinding
ClusterRole 定义一个用户、授权多个名称空间、包括集群资源(PV全局资源)
ClusterRoleBinding
Role:
角色(Role)定义了一组允许的操作(verbs)对特定资源(resources)的权限。这些权限是针对某个特定的命名空间的。
RoleBinding:
角色绑定(RoleBinding)将角色与用户、服务账户或用户组关联起来,从而授予他们角色中定义的权限。
ClusterRole
创建集群角色(ClusterRole)(如果需要跨命名空间的权限)
ClusterRoleBinding
集群角色绑定(ClusterRoleBinding)将集群角色与用户、服务账户或用户组关联起来,授予它们集群角色中定义的权限。
7、绑定流程图

8、实战(授权一个用户+ns)
###查看资源
1、创建一个用户(magedu)
kubectl create serviceaccount magedu(用户) -n magedu
###查看创建的用户kubectl get sa -n magedu
2、创建Role
3.1、定义资源类型(什么类型的role)
3.2、定于权限规则(只读和读写权限)(针对pod的和deployment)
yaml文件
3.3、查看 kubectl describe role magedu-role -n magedu
3、role-binding(将规则和role绑定)
3.1、目的:将规则和账号进行绑定
3.2、
4、创建一个token
5.1、定义toeken名称、
5.2、属于哪个ns、
5.3、在哪个账号上创建token
5、登录dashboard、查看(传递变量可以查看每个ns、权限不够没法看)
9、权限分配
1、希望看到service资源
kubectl api-resources
注意及重点:修改pod权限、pod和pods/exec权限划分明细点
10、做成kubeconfig认证文件
主要:
(1)签发证书
1.1、编写json文件、签发证书(证书相关信息)magedu-csr.json
注意:环境里面要有cfssl命令
1.2、签发证书:指定公钥、CA的私钥、config文件、描述、指定信息文件csr、
然后管道传递使用cfssljson命令查看证书信息
find / -name ca-config.json
1.3签发完成之后、主要就是公钥和私钥
(2)生成kubeconfig文件
2.1、生产kubeconfig文件
加入公钥、开启base64加密、apiserver地址、指定kubeconfig文件放到什么目录、
(3)设置客户端认证参数
3.1、 设置证书、指定认证私钥和公钥、再加密、再加上一步骤生成的kubeconfig文件
(4)设置上下文参数(多集群使用上下文参数)
4.1、设置集群名称、用户名、ns、kubeconfig文件
4.2、执行完之后就有了、这个文件
实操:详细步骤
# ls magedu*
magedu-csr.json magedu-key.pem magedu-role-bind.yaml magedu-role.yaml magedu.csr magedu.pem
2.3:生成普通用户kubeconfig文件:
# kubectl config set-cluster cluster1 --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://172.31.7.188:6443 --kubeconfig=magedu.kubeconfig #--embed-certs=true为嵌入证书信息
2.4:设置客户端认证参数:
# cp *.pem /etc/kubernetes/ssl/
# kubectl config set-credentials magedu \
--client-certificate=/etc/kubernetes/ssl/magedu.pem \
--client-key=/etc/kubernetes/ssl/magedu-key.pem \
--embed-certs=true \
--kubeconfig=magedu.kubeconfig
2.5:设置上下文参数(多集群使用上下文区分)
https://kubernetes.io/zh/docs/concepts/configuration/organize-cluster-access-kubeconfig/
# kubectl config set-context cluster1 \
--cluster=cluster1 \
--user=magedu \
--namespace=magedu \
--kubeconfig=magedu.kubeconfig
2.5: 设置默认上下文
# kubectl config use-context cluster1 --kubeconfig=magedu.kubeconfig
2.7:获取token:
# kubectl get secrets -n magedu | grep magedu
# kubectl describe secrets magedu-token-8d897 -n magedu
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlYwMDNHdWJwTmtoaTJUMFRPTVlwV3RiVWFWczJYRHJCNkFkMGRtQWFqRTgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtYWdlZHUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoibWFnZWR1LXRva2VuLThkODk3Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im1hZ2VkdSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjBlZmNiNGI0LWM3YTUtNGJkZS1iZjk4LTFiNTkwNThjOTFjNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDptYWdlZHU6bWFnZWR1In0.SJHLgshKcGtIf-ycivn_4SWVRdWw4SuWymBVaA8YJXHPd5PYnwERVNtfUPX88nv-wXkCuZY7fIjGYkoYj6AJEhSPoG15fcmUPaojYeyjkQYghan3CBsZR8C12buSB6t5zCCt22GdG_ScZymxLU7n3Z0PhOzTLzgpXRs1Poqz4DOYylqZyLmW_BPgoNhtQYKlBH6OFzDe8v3JytnaaJUObVZCRxtI6x4iKLt2Evhs8XKfczqqesgoo61qTqtbU4jzlXuHeW7cUMhWoipUc-BkEdV6OtKWOetecxu5uB-44eTRHa1FBjnRMv9SEGj0hxTJCQ08ZNlP0Kc01JZlKXBGdQ
2.8:将token写入用户kube-config文件:
3.9:dashboard登录测试:
https://172.31.7.111:30002/#/login
11、总结
总结:1、最终权限由role去控制
2、cluster_role也是一样
3、创建相应的角色(Role或ClusterRole)和ServiceAccount,并将角色绑定到ServiceAccount上,以便在Kubernetes集群中控制资源访问权限。

浙公网安备 33010602011771号