[译] kubernetes:kube-scheduler 调度器代码结构概述

1本文翻译自 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md 2译者:xhy 调度器代码层次结构概述 介绍 调度器监视新创建的还没有分配节点的 Pod。当发现这样的 Pod 后,调度器将 Pod 调度到最适合它的节点。一般来说,调度是计算机科学中一个相当广泛的领域,它考虑了各种各样的约束和限制。调度器的每个工作负载可能需要不同的方法来实现最佳调度结果。Kubernetes 项目提供的 kube-scheduler 调度器的目标是以简单为代价提供高吞吐量。为了帮助构建调度器(默认或者定制化)和共享调度逻辑,kube-scheduler 实现了 调度框架。该框架没有提供构建新调度器的所有部分。组装一个功能齐全的单元仍然需要队列、缓存、调度算法和其他构建元素。本文档旨在描述所有单独的部分是如何组合在一起,以及它们在整个体系结构中的作用,以便开发人员能够快速了解调度器代码。 ...

2024-01-20 · xhy

Kubernetes: client-go 源码剖析(二)

上接 Kubernetes: client-go 源码剖析(一) 运行 informer 运行 informer 将 Reflector,informer 和 indexer 组件关联以实现 informer 流程图的流程。 Reflector List&Watch 运行 informer: 1informer.Run(stopCh) 2 3// client-go/tools/cache/shared_informer.go 4func (s *sharedIndexInformer) Run(stopCh <-chan struct{}) { 5 func() { 6 ... 7 // 创建 DeltaFIFO 队列 8 fifo := NewDeltaFIFOWithOptions(DeltaFIFOOptions{ 9 KnownObjects: s.indexer, 10 EmitDeltaTypeReplaced: true, 11 Transformer: s.transform, 12 }) 13 14 cfg := &Config{ 15 Queue: fifo, 16 ListerWatcher: s.listerWatcher, 17 ObjectType: s.objectType, 18 ObjectDescription: s.objectDescription, 19 FullResyncPeriod: s.resyncCheckPeriod, 20 RetryOnError: false, 21 ShouldResync: s.processor.shouldResync, 22 Process: s.HandleDeltas, 23 WatchErrorHandler: s.watchErrorHandler, 24 } 25 26 // 根据 Config 创建 informer 的 controller 27 s.controller = New(cfg) 28 s.controller.(*controller).clock = s.clock 29 s.started = true 30 }() 31 32 ... 33 // goroutine 运行 processor 34 wg.StartWithChannel(processorStopCh, s.processor.run) 35 36 ... 37 // 运行 controller 38 s.controller.Run(stopCh) 39} 首先,创建队列 Delta FIFO: ...

2023-12-16 · xhy

Kubernetes: client-go 源码剖析(一)

前言 在看 kube-scheduler 组件的过程中遇到了 kube-scheduler 对于 client-go 的调用,泛泛的理解调用过程总有种隔靴搔痒的感觉,于是调转头先把 client-go 理清楚在回来看 kube-scheduler。 为什么要看 client-go,并且要深入到原理,源码层面去看。很简单,因为它很重要。重要在两方面: ...

2023-12-16 · xhy

Kubernetes:kube-apiserver 之准入

前言 前两篇文章介绍了 kube-apiserver 的认证和鉴权,这里继续往下走,介绍 kube-apiserver 的准入。 准入 admission 不同于前两篇的逆序介绍,这里顺序介绍 admission 流程。从创建准入 options,到根据 options 创建准入 config,接着介绍在 kube-apiserver 的 handler 中是怎么进入准入控制,怎么执行的。 ...

2023-11-14 · xhy

Kubernetes:kube-apiserver 之鉴权

前言 上一篇文章介绍了 kube-apiserver 的认证机制。这里继续往下走,介绍 kube-apiserver 的鉴权。kube-apiserver 处理认证和鉴权非常类似,建议阅读鉴权机制前先看看 kube-apiserver 的 认证。 ...

2023-11-09 · xhy

Kubernetes:kube-apiserver 之认证

前言 kube-apiserver 不仅负责 RESTful API 路由的建立,也负责请求的认证,授权和准入。如下图所示: 本篇文章将介绍 kube-apiserver 的认证机制。 认证 Authentication 认证是对请求的认证,确认请求是否具有访问 Kubernetes 集群的权限。在 kube-apiserver 中,通过 handler 处理请求的认证,所有请求都将通过认证 handler 进行认证。可以把它理解成 Gin 框架的中间件。 ...

2023-11-08 · xhy

Kubernetes:kube-apiserver 和 etcd 的交互

前言 上几篇文章介绍了 kubernetes 的核心数据结构 scheme 和 Kubernetes:kube-apiserver 的启动流程。在启动流程篇中重点关注的是启动的核心逻辑,并没有关注 kube-apiserver 和外部组件的交互。 而交互是非常必要的,其定义了边界和依赖。 ...

2023-11-05 · xhy

Kubernetes:kube-apiserver 之启动流程(二)

接着 Kubernetes:kube-apiserver 之启动流程(一) 加以介绍。 创建 APIExtensions Server 创建完通用 APIServer 后继续创建 APIExtensions Server。 1func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*CustomResourceDefinitions, error) { 2 genericServer, err := c.GenericConfig.New("apiextensions-apiserver", delegationTarget) 3 4 s := &CustomResourceDefinitions{ 5 GenericAPIServer: genericServer, 6 } 7 8 // 存储建立 REST API 到资源实体的信息 9 apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiextensions.GroupName, Scheme, metav1.ParameterCodec, Codecs) 10 11 // 资源实体 12 storage := map[string]rest.Storage{} 13 14 // customresourcedefinitions 15 if resource := "customresourcedefinitions"; apiResourceConfig.ResourceEnabled(v1.SchemeGroupVersion.WithResource(resource)) { 16 // 创建资源实体 17 customResourceDefinitionStorage, err := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) 18 if err != nil { 19 return nil, err 20 } 21 storage[resource] = customResourceDefinitionStorage 22 storage[resource+"/status"] = customresourcedefinition.NewStatusREST(Scheme, customResourceDefinitionStorage) 23 } 24 if len(storage) > 0 { 25 apiGroupInfo.VersionedResourcesStorageMap[v1.SchemeGroupVersion.Version] = storage 26 } 27 28 if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil { 29 return nil, err 30 } APIGroupInfo 对象用于描述资源组信息,storage 存储资源到资源实体的对应关系。 ...

2023-11-04 · xhy