三阶段: 认证(Authentication)、授权(Authorization)、准入控制(Admission Control)

① 所谓认证,就是先验证用户的身份是否合法,比如看看其证书是否合法有效,看看其Token是否正确;
② 所谓授权,就是看看这个用户是否有权限来访问或者操作K8s的资源;
③ 所谓准入控制,就是检查对应客户端的请求是否符合对应请求或操作API规范,检查传递参数是否是正确的。比如创建Pod,它会检查提交的信息是否符合创建Pod的规范,如果不符合规范就拒绝。另外,准入控制还会帮助我们把我们没有明确指定的字段信息,通过默认值的方式把对应的字段填充到客户端请求中,然后把填充好的信息一并由APIserver把客户端请求更新到对应资源在etcd中的对应信息上。
K8s认证(Authentication)¶
两种认证方式:
① Kubeconfig 这种是基于https ca证书认证,咱们命令行管理K8s用的就是这种认证
② Token 这种通过一个Token来识别用户,比如前面dashboard时,有创建一个serviceaccount,然后再获取其token
K8s授权(Authorization)¶
授权模式:
- AlwaysDeny:表示拒绝所有的请求,一般用于测试
- AlwaysAllow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略
- ABAC(Attribute-Based Access Control):基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制(老版本采用的方式,也就是定义属性的访问类型,如果用户拥有这个属性就能访问对应的资源。需要定义一长串的属性,并且ABAC修改完之后并不能生效,现在淘汰了)
- Webbook:通过调用外部 REST 服务对用户进行授权(在集群外部对集群鉴权)
- RBAC(Role-Based Access Control):基于角色的访问控制,现行的默认规则(拥有角色就代表拥有访问资源某些权限)
查看你的K8s授权模式(kubeadm安装):
$ cat /etc/kubernetes/manifests/kube-apiserver.yaml |grep authorization-mode
- --authorization-mode=Node,RBAC
查看你的K8s授权模式(二进制安装):
$ cat /usr/lib/systemd/system/kube-apiserver.service | grep authorization-mode
--authorization-mode=Node,RBAC
RBAC 授权模式
RBAC(Role-Based Access Control)基于角色的访问控制,在 Kubernetes 1.5 中引入,现行版本成为默认标准。相对其它访问控制方式,拥有以下优势:
- 对集群中的资源(pod deploy cpu…)和非资源(元信息如pod状态)均拥有完整的覆盖
- 整个 RBAC 完全由几个 API 对象完成,同其它 API 对象一样,可以用 kubectl 或 API 进行操作
- 可以在运行时进行调整,无需重启API Server即可生效
RBAC 的 API 资源对象说明
RBAC资源对象:Subject(包括:User, Group, ServiceAccount)Role(角色)、ClusterRole(集群角色)、RoleBinding(角色绑定)、ClusterRoleBinding(集群角色绑定)
主体(subject)
- User:用户
- Group:用户组
- ServiceAccount:服务账号
角色
- Role:授权特定命名空间的访问权限
- ClusterRole:授权所有命名空间的访问权限
角色绑定
-
RoleBinding:将角色绑定到主体(即subject)
-
ClusterRoleBinding:将集群角色绑定到主体

K8s准入控制(Adminssion Control)¶
Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。
1、查看可以启用的准入控制器列表
二进制安装查看方式:
$ kube-apiserver -h | grep ' --enable-admission-plugins'

kubeadm安装查看方式:
$ k exec kube-apiserver-aminglinux01 -n kube-system -- kube-apiserver -h | grep ' --enable-admission-plugins'
2、查看当前K8s启用的准入控制器
二进制安装查看方式:
$ cat /usr/lib/systemd/system/kube-apiserver.service | grep enable-admission
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota
kubeadm安装查看方式:
$ grep 'admission' /etc/kubernetes/manifests/kube-apiserver.yaml
3、更改准入控制器
二进制安装更改方式:
$ vi /usr/lib/systemd/system/kube-apiserver.service
找到--enable-admission-plugins那一行,直接修改
kubeadm安装更改方式:
$ vi /etc/kubernetes/manifests/kube-apiserver.yaml
找到--enable-admission-plugins那一行,直接修改
4、admission控制器列表以及说明
| Admission 控制器 | 说明 |
|---|---|
| AlwaysPullImages | 强制要求每个容器始终从镜像仓库拉取最新的镜像。 |
| DenyEscalatingExec | 防止容器执行特权操作,例如以root用户执行exec命令。 |
| ExtendedResourceToleration | 允许 Pod 通过指定容忍性来请求使用扩展资源,如GPU。 |
| InitialResources | 自动为 Pod 分配初始资源,例如 CPU 和内存。 |
| LimitPodHardAntiAffinityTopology | 在同一拓扑域中,强制对 Pod 应用硬亲和度规则,以保证高可用性和冗余性。 |
| LimitRanger | 实现资源限制(如 CPU、内存、存储等)的默认值和最大值,限制 Pod 和容器的资源使用。 |
| MutatingAdmissionWebhook | 在资源提交到 API Server 之前,用于对请求进行修改,例如注入辅助容器、自动挂载存储等。 |
| NamespaceLifecycle | 管理命名空间的生命周期,拦截 Kubernetes API 服务器对命名空间的创建、删除和更新请求,并在进行处理之前进行验证和审查。 |
| NodeRestriction | 用于保护节点安全,限制 Pod 的访问权限以确保节点的安全性。 |
| PodNodeSelector | 强制将 Pod 调度到与其节点选择器匹配的节点上。 |
| PodPreset | 在创建 Pod 时,从预定义的资源清单中注入额外的容器配置或环境变量。 |
| PodSecurityPolicy | 通过定义 Pod 所允许的行为,帮助管理员确保容器在运行时遵守安全最佳实践。 |
| Priority | 通过定义优先级,帮助 Kubernetes 确定 Pod 调度顺序。 |
| ReplicaSet | 对 ReplicaSet 资源的请求进行验证和审查,例如确保模板的正确性和匹配标签选择器。 |
| ResourceQuota | 管理 Kubernetes 中的资源配额,限制命名空间中的资源使用量。 |
| SecurityContextDeny | 防止 Pod 和容器在启动时执行不安全的操作,例如使用特权模式、访问主机网络等。 |
| ServiceAccount | 用于自动为每个命名空间创建默认的 ServiceAccount,并为 ServiceAccount 分配适当的权限。 |
| ServiceAccountTTL | 为 ServiceAccount 指定生存期,以避免积累不需要的 ServiceAccount。 |
| ValidatingAdmissionWebhook | 在资源提交到 API Server 之前,用于对请求进行验证和审查,以确保符合预期的策略和规则。 |
| ValidatingPodWebhook | 在 Pod 提交到 API Server 之前, 用于对 Pod 对象进行验证和审查。例如审查Pod 的标签、注释、容器规范和卷规范等,以确保它们符合预期和安全性最佳实践。 |
| VolumeBinding | 强制在调度期间将 Pod 中的所有卷绑定到可用的节点上,以确保卷的可用性。 |
| VolumeSubpath | 允许将子路径添加到 Pod 中的卷,从而更灵活地控制卷的使用方式。 |
| ValidatingMutation | 在资源提交到 API Server 之前,用于对请求进行验证和修改。相较于 MutatingAdmissionWebhook,该插件不仅可以修改请求,还可以拒绝它。 |
| PodOverhead | 允许 Kubernetes 在计算 Pod 资源使用量时考虑它们的开销。 |
| PodSecurityPolicyReview | 在 PodSecurityPolicy 中增加了 Review 操作。可以使用 kubectl create、apply 和 delete 命令,以进行审计和测试。 |
| RuntimeClass | 允许运行时类别动态定义 Kubernetes 节点上容器运行的属性和配置。 |
| VolumeSnapshotDataSource | 允许使用 Snapshot 数据源创建 PV,以简化卷恢复过程。 |
| CertificateApproval | 允许批准和拒绝凭证签发请求,确保凭证的安全性和正确性。 |
| Certificates.k8s.io | 提供了一组用于管理和创建证书和私钥的 API,例如 CertificateSigningRequest 和 CertificateSigningRequestApproval。 |
| CSI | 允许扩展 Kubernetes 的存储解决方案。CSI(Container Storage Interface)为存储厂商提供了一种通用的接口,从而简化了存储插件的开发和部署。 |
| ImagePolicyWebhook | 在拉取镜像之前,用于对镜像进行验证和审查,以确保它们符合安全最佳实践和策略。 |
| PodDisruptionBudget | 确保在进行计划性维护、故障排除和升级时,Pod 可以正常运行,防止应用程序的不可用。 |
| PodPresets | 允许在创建 Pod 时注入容器配置和环境变量。 |
| ValidatingResourceQuota | 允许管理员创建规则以确保 Kubernetes 中的资源分配和使用符合预期。 |
| ValidatingSecurityContext | 在 Pod 提交到 API Server 之前,用于对安全上下文进行验证和审查,以确保 Pod 与集群中其他资源的安全性相匹配。 |
| ValidatingVolumeMounts | 验证 Pod 中的卷是否正确挂载。 |