1.运行机制
用于准入控制。
1.2 ValidatingAdmissioncontrollers
/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/plugin.go
本质是admission插件。实现了下面的接口
监听ValidatingWebhookConfiguration对象,维护配置的所有validating admission webhook的列表。
会判断需要调用哪些webhook。
并发调用所有需要调用的webhook。
必须所有webhook都通过。
1.3 mutatingAdmissioncontrollers
/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating
如果有插件修改了资源对象,会在reinvokeCtx.mutatingAdmissioncontrollers上下文中标记需要重新调用。
更上层的机制会触发对mutatingAdmissioncontrollers整体的重新调用。
逐个调用需要调用的webhook。
2.使用
2.1 确保集群支持
1) kueb-apiserver开启Mutating和Validating的admisson插件
--admission-control-config-file可以为这两个插件,配置相关参数。默认为空。
这些admisson插件,会被创建为一个handlerchain。在install API的时候,安装这个handlerchain。
2)集群启用了准入注册 API
2.2 编写webhook
1)创建一个服务器
监听两个路径,分别对应Mutating和Validating。
路径需要对应MutatingAdmissionWebhook和ValidatingAdmissionWebhook中定义的路径。
2)输入/输出
从request.body取出。
// AdmissionReview describes an admission review request/response.
type AdmissionReview struct {
metav1.TypeMeta
// 请求
Request *AdmissionRequest
// 响应
Response *AdmissionResponse
}
type AdmissionRequest struct {
// 每个请求都不一样
// 作用:追踪webhook和apiserver之间的round trip
UID types.UID
// ----- 操作对象的版本 -----
// 可能与资源本身的版本不一样
// (v1.Pod/autoscaling.v1.Scale)
Kind metav1.GroupVersionKind
// 资源类型是URL中使用的名称
// (v1.pods)
Resource metav1.GroupVersionResource
// 可选("status"/"scale")
SubResource string
// ------ 资源最初的版本 -----
// MatchPolicy为Equivalent的情况:
// api-server已经将资源转换为webhook要求的版本
// 这里记录的是资源最初的版本
RequestKind *metav1.GroupVersionKind
RequestResource *metav1.GroupVersionResource
RequestSubResource string
// ----- 资源的其他属性 ------
Name string
Namespace string
Operation Operation // 操作类型
UserInfo authentication.UserInfo // 发起操作的用户信息
Object runtime.Object // (可选)资源对象
OldObject runtime.Object // (可选)只有在DELETE/UPDATE时才使
DryRun *bool
Options runtime.Object // (可选)用户操作时,指定的Options(meta.k8s.io/v1.CreateOptions)
}
// AdmissionResponse describes an admission response.
type AdmissionResponse struct {
UID types.UID
// 当前admission request是否被批准
Allowed bool
// 拒绝当前请求的详细原因
Result *metav1.Status
// --- 针对资源对象的patch ----
Patch []byte
// 只支持"JSONPatch".
PatchType *PatchType
// (可选)remote admission controller/admission webhook添加额外的信息用于审计
// key:必须以webhook的名字为前缀(imagepolicy.example.com/error=image-blacklisted)
AuditAnnotations map[string]string
// (可选)返回给提交请求的API client的warnings(需要改正或注意的事项)
Warnings []string
}
2.3 配置webhook
1)
type ValidatingWebhookConfiguration struct {
metav1.TypeMeta
metav1.ObjectMeta
Webhooks []ValidatingWebhook
}
// admission webhook/其影响的资源和操作operations
type ValidatingWebhook struct {
// "webhook名字.组织名" 例子:imagepolicy.kubernetes.io"
Name string
// 如何与webhook通信
// 1)webook在集群中的service
// 2)CA证书
// 3)scheme://host:port/path
ClientConfig WebhookClientConfig
// webhook关注的操作和资源
// 1)Operations关注的操作
// CONNECT/UPDATE/DELETE/CONNECT/*
// 2) Rule通过四个条件,指定关注的资源
// APIGroups/APIVersions/Resources/scope
// scope:
// 1)Cluster,只有集群作用域的资源才能匹配此规则
// 2)Namespaced,
// 3)*
Rules []RuleWithOperations
// 如何处理Webhook中无法识别的错误和超时错误
// 1)Ignore:忽略,API请求继续。
// 2)Fail:准入失败,API请求被拒绝。
FailurePolicy *FailurePolicyType
// 例子:
// Webhook仅为apiGroups:["apps"], apiVersions:["v1","v1beta1"]指定了规则
// 而修改资源的请求是extensions/v1beta1)发出的
// 请求是否应该被发送到Webhook。
// 1)Exact:不应该
// 2)Equivalent:应该,会自动转换成webhook要求的版本,再发送至webhook
// 在rule仅写资源的一个group/version,webhook会处理该资源的所有group/version
MatchPolicy *MatchPolicyType
// 根据命名空间筛选关注的资源
// 筛选的是"命名空间对象"上的lable
NamespaceSelector *metav1.LabelSelector
// 筛选的是"资源对象"上的lable
ObjectSelector *metav1.LabelSelector
// Webhook通常仅对发送给他们的AdmissionReview内容进行操作.
// 某些Webhook在处理admission请求时会进行带外更改. -> 副作用
// 1)None:没有副作用
// 2)NoneOnDryRun
// 可能会有副作用
// 如果请求带有dryRun:true属性,Webhook将抑制副作用
SideEffects *SideEffectClass
// webhook超时时间
TimeoutSeconds *int32
// webhook可以接收的admissionReview版本
AdmissionReviewVersions []string
}
2)
type MutatingWebhookConfiguration struct {
metav1.TypeMeta
metav1.ObjectMeta
Webhooks []MutatingWebhook
}
// MutatingWebhook describes an admission webhook and the resources and operations it applies to.
type MutatingWebhook struct {
Name string
ClientConfig WebhookClientConfig
Rules []RuleWithOperations
FailurePolicy *FailurePolicyType
MatchPolicy *MatchPolicyType
NamespaceSelector *metav1.LabelSelector
ObjectSelector *metav1.LabelSelector
SideEffects *SideEffectClass
TimeoutSeconds *int32
AdmissionReviewVersions []string
// 例子:
// MutatingWebhook A向对象中添加新的子结构[向pod中添加container]
// 已经运行的其他MutatingWebhook可能会对这些新结构有影响[在所有容器上设置imagePullPolicy]
// 是否再次调用其他已经运行的webhook
// 1)Never
// 2)IfNeeded
ReinvocationPolicy *ReinvocationPolicyType
}