Kubernetes 鉴权
理论学习
目前Kubernetes 官方提供了四种鉴权模块:
- Node —— 一个专用鉴权模式,根据调度到 kubelet 上运行的 Pod 为 kubelet 授予权限。
- ABAC ——基于属性的访问控制(ABAC)定义了一种访问控制范型,通过使用将属性组合在一起的策略,
将访问权限授予用户。策略可以使用任何类型的属性(用户属性、资源属性、对象,环境属性等)。 - RBAC —— 基于角色的访问控制(RBAC) 是一种基于企业内个人用户的角色来管理对计算机或网络资源的访问的方法。 在此上下文中,权限是单个用户执行特定任务的能力, 例如查看、创建或修改文件。
- Webhook —— WebHook 是一个 HTTP 回调:发生某些事情时调用的 HTTP POST; 通过 HTTP POST 进行简单的事件通知。 实现 WebHook 的 Web 应用程序会在发生某些事情时将消息发布到URL。
基于角色的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对计算机或网络资源的访问的方法。在大中型企业的实践中, RBAC 授权模型已经被认为是最佳的员工授权管理解决方案。使用 RBAC,只要严格遵守角色的规则要求,它会让你的访问管理变得非常容易,且不容易出错。
RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding。
RBAC 的 Role 或 ClusterRole 中包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)。
Role 总是用来在某个名字空间内设置访问权限; 在你创建 Role 时,你必须指定该 Role 所属的名字空间。
与之相对,ClusterRole 则是一个集群作用域的资源。这两种资源的名字不同(Role 和 ClusterRole) 是因为 Kubernetes 对象要么是名字空间作用域的,要么是集群作用域的,不可两者兼具。
ClusterRole 有若干用法。你可以用它来:
- 定义对某名字空间域对象的访问权限,并将在个别名字空间内被授予访问权限;
- 为名字空间作用域的对象设置访问权限,并被授予跨所有名字空间的访问权限;
- 为集群作用域的资源定义访问权限。
如果你希望在名字空间内定义角色,应该使用 Role; 如果你希望定义集群范围的角色,应该使用 ClusterRole。
角色绑定(Role Binding)是将角色中定义的权限赋予一个或者一组用户。 ClusterRoleBinding 用于要跨整个集群完成访问权限的授予。RoleBinding 在指定的名字空间中执行授权,而 ClusterRoleBinding 在集群范围执行授权。
一个 RoleBinding 可以引用同一的名字空间中的任何 Role。 或者,一个 RoleBinding 可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的名字空间。 如果你希望将某 ClusterRole 绑定到集群中所有名字空间,你要使用 ClusterRoleBinding。
实战练习
操作步骤
- 进入题目指定集群
$ kubectl config use-context k8s
- 创建 ClusterRole 并赋予所需权限
$ kubectl create clusterrole deployment-clusterrole --verb=create --resource=Deployments,StatefulSets,DaemonSets
- verb : create 表示允许执行创建操作
- resource:deployments,statefulsets, daemonsets 表示允许对Deployments 、 StatefulSets、DaemonSets 资源进行操作 ,其中:
- Deployments (部署) :用于管理可扩展的应用程序部署。 可以指定要运行的容器镜像、副本数量、升级策略等信息。并提供滚动更新和回滚功能,以便无缝地更新应用程序版本
- StatefulSets (有状态副本集):用于管理有状态应用程序的部署。在Deployments不同,StatefulSets 在创建和管理Pod 实例时保持每个实例的唯一标识和稳定的网络标识符。这对于需要有状态应用程序(如数据库)非常重要,因为每个实例都有自己的持久性标识,并且可以按顺序启动和停止。
- DaemonSets (守护进程集): DaemonSets 是一种 Kubernetes 资源对象,用于在集群的每个节点上运行一个 pod 的副本。与 Deployments 和 StatefulSets 不同,DaemonSets 不会按照副本数量进行扩展,而是确保在每个节点上运行一个 Pod 副本。 这对于在整个集群中运行后台任务、监控代理或网络代理等系统级任务非常有用。
- 在指定Namespace 创建 ServiceAccount
$ kubectl -n app-team1 create serviceaccount cicd-token
- 将新的ClusterRole 绑定到 ServiceAccount
$ kubectl -n app-team1 create rolebinding clusterrolebinding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
检查命令
$ kubectl -n app-team1 describe rolebinding clusterrolebinding
$ kubectl describe clusterrole deployment-clusterrole
参考链接: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/