Skip to content

准入

准入控制

  • 配额管理
    • 原因:资源有限,如何限定某个用户有多少资源?
  • 方案
    • 预定义每个 Namespace 的 ResourceQuota,并把 spec 保存为 configmap
      • 用户可以创建多少个 Pod
        • BestEffortPod
        • QoSPod
      • 用户可以创建多少个 service
      • 用户可以创建多少个 ingress
      • 用户可以创建多少个 service VIP
    • 创建 ResourceQuota Controller 监控 namespace 创建事件,当 namespace 创建时,在该 namespace 创建对应的 ResourceQuota 对象
    • apiserver 中开启 ResourceQuota 的 admission plugin

为资源增加自定义属性

  • 作为多租户集群方案中的一环, 我们需要在 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
  • 创建 ResourceQuota Controller
    • 监控 namespace 创建事件, 当 namespace 创建时, 在该 namespace 创建对应的 ResourceQuota 对象
  • apiserver 中开启 ResourceQuota 的 admission plugin