准入
准入控制
- 配额管理
- 原因:资源有限,如何限定某个用户有多少资源?
- 方案
- 预定义每个 Namespace 的 ResourceQuota,并把 spec 保存为 configmap
- 用户可以创建多少个 Pod
- BestEffortPod
- QoSPod
- 用户可以创建多少个 service
- 用户可以创建多少个 ingress
- 用户可以创建多少个 service VIP
- 用户可以创建多少个 Pod
- 创建 ResourceQuota Controller 监控 namespace 创建事件,当 namespace 创建时,在该 namespace 创建对应的 ResourceQuota 对象
- apiserver 中开启 ResourceQuota 的 admission plugin
- 预定义每个 Namespace 的 ResourceQuota,并把 spec 保存为 configmap
为资源增加自定义属性
- 作为多租户集群方案中的一环, 我们需要在 namespace 的准入控制中, 获取用户信息, 并将用户信息更新的 namespace 的 annotation
只有当 namespace 中有有效用户信息时, 我们才可以在 namespace 创建时, 自动绑定用户权限, namespace 才可用.
准入控制(Admission Control)在授权后对请求做进一步的验证或添加默认参数. 不同于授权和认证只关心请求的用户和操作, 准入控制还处理请求的内容, 并且仅对创建、更新、删除或连接(如代理)等有效, 而对读操作无效.
准入控制支持同时开启多个插件, 它们依次调用, 只有全部插件都通过的请求才可以放过进入系统.
准入控制插件
- AlwaysAdmit : 接受所有请求.
- AlwaysPullImages : 总是拉取最新镜像. 在多租户场景下非常有用.
- DenyEscalatingExec : 禁止特权容器的 exec 和 attach 操作.
- ImagePolicyWebhook : 通过 webhook 决定 image 策略, 需要同时配置 --admission-control-config-file
- ServiceAccount: 自动创建默认 ServiceAccount, 并确保 Pod 引用的 ServiceAccount 已经存在
- SecurityContextDeny: 拒绝包含非法 SecurityContext 配置的容器
- ResourceQuota: 限制 Pod 的请求不会超过配额, 需要在 namespace 中创建一个 ResourceQuota 对象
- LimitRanger: 为 Pod 设置默认资源请求和限制, 需要在 namespace 中创建一个 LimitRange 对象
- InitialResources: 根据镜像的历史使用记录, 为容器设置默认资源请求和限制
- NamespaceLifecycle: 确保处于 termination 状态的 namespace 不再接收新的对象创建请求, 并拒绝请求不存在的 namespace
- DefaultStorageClass: 为 PVC 设置默认 StorageClass
- DefaultTolerationSeconds: 设置 Pod 的默认 forgiveness toleration 为 5 分钟
- PodSecurityPolicy: 使用 Pod Security Policies时必须开启
- NodeRestriction: 限制 kubelet 仅可访问 node 、endpoint 、pod 、service 以及 secret、configmap、PV 和 PVC 等相关的资源
准入控制插件的开发
准入控制插件
除默认的准入控制插件以外, Kubernetes 预留了准入控制插件的扩展点, 用户可自定义准入控制 插件实现自定义准入功能
- MutatingWebhookConfiguration: 变形插件, 支持对准入对象的修改
- ValidatingWebhookConfiguration: 校验插件, 只能对准入对象合法性进行校验, 不能修改

准入控制
为资源增加自定义属性
- 作为多租户集群方案中的一环, 我们需要在 namespace 的准入控制中, 获取用户信息, 并将用户信息更新到 namespace 的 annotation
只有当 namespace 中有有效用户信息时, 我们才可以在 namespace 创建时, 自动绑定用户权限, namespace 才可用.
# {{if eq .k8snode_validating "enabled"}}
apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingWebhookConfiguration
metadata :
name: ns-mutating .webhook .k8s .io
webhooks :
- clientConfig :
caBundle : {{ .serverca_base64}}
url:https://admission.local.tess.io/apis/admission.k8s.io/v1alpha1/ns-mutating
failurePolicy : Fail
name: ns-mutating.webhook.k8s.io
namespaceSelector: {}
rules:
- apiGroups:
- ""
apiVersions :
- '*'
operations:
- CREATE
resources :
- nodes
sideEffects : Unknown
# {{end}}
配额管理
- 原因: 资源有限, 如何限定某个用户有多少资源?
方案:
- 预定义每个 Namespace 的 ResourceQuota, 并把 spec 保存为 configmap
- 用户可以创建多少个 Pod
- BestEffortPod
- QoSPod
- 用户可以创建多少个 service
- 用户可以创建多少个 ingress
- 用户可以创建多少个 service VIP
- 用户可以创建多少个 Pod
- 创建 ResourceQuota Controller
- 监控 namespace 创建事件, 当 namespace 创建时, 在该 namespace 创建对应的 ResourceQuota 对象
- apiserver 中开启 ResourceQuota 的 admission plugin