1、安全框架
K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都 支持插件方式,通过API Server配置来启用插件。
- Authentication(鉴权)
- Authorization(授权)
- Admission Control(准入控制)
客户端要想访问K8s集群API Server,一般需要证书、Token或者用户名+密码;如果Pod访问,需要ServiceAccount
2、安全框架 - 鉴权(Authentication)
K8s Apiserver提供三种客户端身份认证:
• HTTPS 证书认证:基于CA证书签名的数字证书认证(kubeconfig)
• HTTP Token认证:通过一个Token来识别用户(serviceaccount)
• HTTP Base认证:用户名+密码的方式认证(1.19版本弃用)
3、安全框架 - 授权(Authorization)
RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。
RBAC根据API请求属性,决定允许还是拒绝。
比较常见的授权维度:
- user:用户名
- group:用户分组
- 资源,例如pod、deployment
- 资源操作方法:get,list,create,update,patch,watch,delete
- 命名空间
- API组
基于角色的权限访问控制:RBAC
RBAC(Role-Based Access Control,基于角色的访问控制)是K8s默认授权策略,并且是动态配置策略(修改即时生效)。
主体(subject)
• User:用户
• Group:用户组
• ServiceAccount:服务账号
角色
• Role:授权特定命名空间的访问权限
• ClusterRole:授权所有命名空间的访问权限
角色绑定
• RoleBinding:将角色绑定到主体(即subject)
• ClusterRoleBinding:将集群角色绑定到主体
注:RoleBinding在指定命名空间中执行授权,ClusterRoleBinding在集群范围执行授权
k8s预定好了四个集群角色供用户使用,使用**kubectl get clusterrole**
查看,其中**systemd:**
开头的为系统内部使用。
内置集群角色 | 描述 |
---|---|
cluster-admin | 超级管理员,对集群所有权限 |
admin | 主要用于授权命名空间所有读写权限 |
edit | 允许对命名空间大多数对象读写操作,不允许查看或者修改角色、角色绑定 |
view | 允许对命名空间大多数对象只读权限,不允许查看角色、角色绑定和Secret |
案例
参考:学习案例
4、安全框架 - 准入控制(Adminssion Control)
Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。
启用一个准入控制器:
<font style="background-color:#FADB14;">kube-apiserver --</font><font style="color:#F5222D;background-color:#FADB14;">enable</font><font style="background-color:#FADB14;">-admission-plugins=NamespaceLifecycle,LimitRanger ...</font>
关闭一个准入控制器:
<font style="background-color:#FADB14;">kube-apiserver --</font><font style="color:#F5222D;background-color:#FADB14;">disable</font><font style="background-color:#FADB14;">-admission-plugins=PodNodeSelector,AlwaysDeny ... </font>
查看默认启用:
<font style="background-color:#FADB14;">kubectl exec kube-apiserver-k8s-master -n kube-system -- kube-apiserver -h | grep enable-admission-plugins</font>
5、资源配额
1. ResourceQuota
当多个团队、多个用户共享使用K8s集群时,会出现不均匀资源使用,默认情况下先到先得,这时可以通过ResourceQuota来对命名空间资源使用总量做限制,从而解决这个问题。
使用流程:k8s管理员为每个命名空间创建一个或多个ResourceQuota对象,定义资源使用总量,K8s会跟踪命名空间资源使用情况,当超过定义的资源配额会返回拒绝。
ResourceQuota功能是一个准入控制插件,默认已经启用。
支持的资源 | 描述 |
---|---|
limits.cpu/memory | 所有Pod上限资源配置总量不超过该值(所有非终止状态的Pod) |
requests.cpu/memory | 所有Pod请求资源配置总量不超过该值(所有非终止状态的Pod) |
cpu/memory | 等同于requests.cpu/requests.memory |
requests.storage | 所有PVC请求容量总和不超过该值 |
persistentvolumeclaims | 所有PVC数量总和不超过该值 |
所有与 |
|
所有与 |
|
pods、count/deployments.apps、count/statfulsets.apps、count/services(services.loadbalancers、services.nodeports)、count/secrets、count/configmaps、count/job.batch、count/cronjobs.batch | 创建资源数量不超过该值 |
2. LimitRange
默认情况下,K8s集群上的容器对计算资源没有任何限制,可能会导致个别容器资源过大导致影响其他容器正常工
作,这时可以使用LimitRange定义容器默认CPU和内存请求值或者最大上限。
LimitRange限制维度:
• 限制容器配置requests.cpu/memory,limits.cpu/memory的最小、最大值
• 限制容器配置requests.cpu/memory,limits.cpu/memory的默认值
• 限制PVC配置requests.storage的最小、最大值