admission webhooks

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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值