Kubernetes 源码剖析与实战
孔令飞
前腾讯云专家工程师
1362 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已更新 29 讲/共 55 讲
Kubernetes 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

27|Kubernetes如何进行请求参数校验?

你好,我是孔令飞。
绝大部分企业应用,都是通过 API 接口的形式对外提供功能,API 接口的通信协议通常是 HTTP 或者 RPC。使用 RPC 作为通信协议的 API 接口又称作 RPC 接口,使用 HTTP 作为通信协议的 API 接口又称作 HTTP 接口。不管哪种类型的 API 接口,在请求到来时,都要进行请求参数校验。
Kubernetes 中有大量的 RESTful API 接口,在请求这些接口的时候,同样要进行请求参数校验。
本节课,我们就来看下 Kuberentes 是如何进行请求参数校验的(请求参数,其实就是资源定义,所以也叫资源定义校验)。希望通过本节课的学习,你可以掌握 Kubernetes 请求参数校验的实现方式。更重要的是,通过学习 Kubernetes 请求参数校验的设计和实现,你可以掌握优秀开源项目的参数校验设计和实现,并迁移到未来的业务开发中。

Kubernetes 参数校验流程

kube-apiserver 真正开始处理 HTTP 请求的函数是 createHandler 函数,跟验证相关的逻辑如下:
func createHandler(r rest.NamedCreater, scope *RequestScope, admit admission.Interface, includeName bool) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
ctx := req.Context()
// For performance tracking purposes.
...
namespace, name, err := scope.Namer.Name(req)
...
options := &metav1.CreateOptions{}
values := req.URL.Query()
// 将 HTTP 请求的 Query 参数解析到 metav1.CreateOptions 类型的变量 options 中
if err := metainternalversionscheme.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, options); err != nil {
...
return
}
// 验证创建资源的CreateOptions是否合法
if errs := validation.ValidateCreateOptions(options); len(errs) > 0 {
...
return
}
// WithAudit 封装了 admit,做了更多的逻辑处理,例如记录Annotations
admit = admission.WithAudit(admit)
audit.LogRequestObject(req.Context(), obj, objGV, scope.Resource, scope.Subresource, scope.Serializer)
if objectMeta, err := meta.Accessor(obj); err == nil {
// 这里会校验资源定义中的 namespace 和请求的 namespace 是一致的
if err := rest.EnsureObjectNamespaceMatchesRequestNamespace(rest.ExpectedNamespaceForResource(namespace, scope.Resource), objectMeta); err != nil {
scope.err(err, w, req)
return
}
}
requestFunc := func() (runtime.Object, error) {
return r.Create(
ctx,
name,
obj,
rest.AdmissionToValidateObjectFunc(admit, admissionAttributes, scope),
options,
)
}
...
result, err := finisher.FinishRequest(ctx, func() (runtime.Object, error) {
...
// 用来校验ManagedFields,其实是在mutation webhook中校验的
admit = fieldmanager.NewManagedFieldsValidatingAdmissionController(admit)
// 执行mutation webhook
if mutatingAdmission, ok := admit.(admission.MutationInterface); ok && mutatingAdmission.Handles(admission.Create) {
if err := mutatingAdmission.Admit(ctx, admissionAttributes, scope); err != nil {
return nil, err
}
}
...
// 请求流程转到 r.Create 方法中
result, err := requestFunc()
...
return result, err
})
...
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. Kubernetes 中的 RESTful API 接口在请求参数校验时,使用了 `metav1.CreateOptions` 类型的变量 `options`,并通过 `validation.ValidateCreateOptions` 函数对其进行参数校验。 2. 校验方法列表中包含了多个通用的资源校验函数,如 `ValidateLabelSelector`、`ValidateDeleteOptions`、`ValidateUpdateOptions` 等,这些函数被大量用于各类资源的校验逻辑中。 3. 在校验资源定义中的 `ObjectMeta.ManagedFields` 字段时,实际上是走的 Mutating Webhook,这是因为 Kubernetes 需要在校验失败时给 `ObjectMeta.ManagedFields` 设置默认值。 4. `rest.BeforeCreate` 函数中会先调用 `strategy.Validate` 方法来进行资源校验,`strategy.Validate` 方法实现会调用`k8s.io/kubernetes/pkg/apis/apps/validation`包中的 `ValidateXXX` 方法来校验资源的参数是否合法。 5. `rest.BeforeCreate` 函数中接着会调用`ValidateObjectMetaAccessor`函数,来校验资源的 `ObjectMeta`字段。 6. `createValidation`方法用来执行 Validating Webhook 列表,如果 kube-apiserver 在启动时加载了 Validating Webhook,则会执行 Validating Webhook 链。 7. Kubernetes 中创建资源的资源定义校验逻辑包括校验 CreateOptions、资源的 `ObjectMeta.ManagedFields`、资源校验策略、资源的 `ObjectMeta`字段和执行 Validating Webhook 校验资源。 8. 通过本节课的学习,应该已经了解了 Kubernetes 中资源校验的流程、校验点和具体的实现方式。 9. 课后练习包括查看准入控制链具体是如何被初始化的以及学习更新资源的校验流程和实现。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 源码剖析与实战》
新⼈⾸单¥68
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)