KubeApiserver源码分析

KubeApiserver流程分析

kube-apiserver底层原理使用go-restful框架对路径进行映射,然后通过etcd客户端对etcd进行请求。

我们需要注意kube-apiserver的几个功能:TLS认证、权限验证、webhook。

kube-apiserver使用http2.0作为传输协议所以对请求进行采用TLS认证,在认证完成后会通过类似于过滤链的形式对请求进行调用。

接下来让我们先看一下kube-apiserver是如何创建go-restful以及添加资源映射的。

//创建go-restful服务并返回
func NewAPIServerHandler(name string, s runtime.NegotiatedSerializer, handlerChainBuilder HandlerChainBuilderFn, notFoundHandler http.Handler) *APIServerHandler {
   // 创建Container
   gorestfulContainer := restful.NewContainer()
   gorestfulContainer.ServeMux = http.NewServeMux()
   gorestfulContainer.Router(restful.CurlyRouter{}) // e.g. for proxy/{kind}/{name}/{*}
   gorestfulContainer.RecoverHandler(func(panicReason interface{}, httpWriter http.ResponseWriter) {
      logStackOnRecover(s, panicReason, httpWriter)
   })
   gorestfulContainer.ServiceErrorHandler(func(serviceErr restful.ServiceError, request *restful.Request, response *restful.Response) {
      serviceErrorHandler(s, serviceErr, request, response)
   })
   director := director{
      name:               name,
      goRestfulContainer: gorestfulContainer,
      nonGoRestfulMux:    nonGoRestfulMux,
   }
   return &APIServerHandler{
     // 接受到请求并进行TLS认证后会调用该handler链,该链第一步就是对权限进行验证工作。
      FullHandlerChain:   handlerChainBuilder(director),
      GoRestfulContainer: gorestfulContainer,
      NonGoRestfulMux:    nonGoRestfulMux,
      Director:           director,
   }
}

// handlerChainBuilder(director)的实现
func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler {
	// trck记录
	handler = filterlatency.TrackCompleted(handler)
    // 权限认证
	handler = genericapifilters.WithAuthorization(handler, c.Authorization.Authorizer, c.Serializer)
	handler = filterlatency.TrackStarted(handler, "authorization")
	return handler
}

    

资源映射分为两步,api资源创建与apis资源创建两步基本类似,所以我们只看api资源创建

// 根据每个资源调用该方法,比如pod、service
func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storage, ws *restful.WebService) (*metav1.APIResource, *storageversion.ResourceInfo, error) 
这里会根据子资源,是否有命名空间对请求路径进行创建
会通过path以及参数、请求方式生成action。
遍历actions,go-restful中的ws根据请求方式(get,post,put,get等)将生成的handler与path进行添加。
这每个handler都嵌入的webhook操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值