1、安全框架

2、k8s集群强化 - 图1

K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都 支持插件方式,通过API Server配置来启用插件。

  1. Authentication(鉴权)
  2. Authorization(授权)
  3. 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默认授权策略,并且是动态配置策略(修改即时生效)。

2、k8s集群强化 - 图2

主体(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数量总和不超过该值
.storageclass.storage.k8s.io/requests.storage 所有与相关的PVC请求容量总和不超过该值
.storageclass.storage.k8s.io/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、k8s集群强化 - 图3

2. LimitRange

默认情况下,K8s集群上的容器对计算资源没有任何限制,可能会导致个别容器资源过大导致影响其他容器正常工

作,这时可以使用LimitRange定义容器默认CPU和内存请求值或者最大上限。

LimitRange限制维度:

• 限制容器配置requests.cpu/memory,limits.cpu/memory的最小、最大值

• 限制容器配置requests.cpu/memory,limits.cpu/memory的默认值

• 限制PVC配置requests.storage的最小、最大值

2、k8s集群强化 - 图4