Kubernetes:kubelet 源码分析之探针
前言 kubernetes 提供三种探针,配置探针(Liveness),就绪探针(Readiness)和启动(Startup)探针判断容器健康状态。其中,存活探针确定什么时候重启容器,就绪探针确定容器何时准备好接受流量请求,启动探针判断应用容器何时启动。 ...
前言 kubernetes 提供三种探针,配置探针(Liveness),就绪探针(Readiness)和启动(Startup)探针判断容器健康状态。其中,存活探针确定什么时候重启容器,就绪探针确定容器何时准备好接受流量请求,启动探针判断应用容器何时启动。 ...
前言 在 Kubernetes 架构中,controller manager 是一个永不休止的控制回路组件,其负责控制集群资源的状态。通过监控 kube-apiserver 的资源状态,比较当前资源状态和期望状态,如果不一致,更新 kube-apiserver 的资源状态以保持当前资源状态和期望状态一致。 ...
前言 Kubernetes:kube-scheduler 源码分析 介绍了 kube-scheduler 调度 Pod 的逻辑。文中有一点未提的是,在 Kubernetes 集群中,kube-scheduler 组件是多副本,单实例运行。仅有一个副本作为 leader 运行,当发生故障时,其它副本会抢占为 leader 继续运行。这种机制通过 leader election 实现,本文将从源码角度分析 leader election 选举的实现。并且,在此基础上,在回头看 kube-scheduler 是怎么结合 leader elction 实现多副本,单实例运行的。 ...
前言 [译] kubernetes:kube-scheduler 调度器代码结构概述 介绍了 kube-scheduler 的代码结构。本文围绕代码结构,从源码角度出发,分析 kube-scheduler 的调度逻辑。 启动 kube-scheduler kube-scheduler 使用 Cobra 框架初始化参数,配置和应用。 1// kubernetes/cmd/kube-scheduler/scheduler.go 2func main() { 3 // 启动 kube-scheduler 入口 4 command := app.NewSchedulerCommand() 5 ... 6} 7 8// kubernetes/cmd/kube-scheduler/app/server.go 9func NewSchedulerCommand(registryOptions ...Option) *cobra.Command { 10 // 创建 kube-scheduler 选项 11 opts := options.NewOptions() 12 13 cmd := &cobra.Command{ 14 Use: "kube-scheduler", 15 ... 16 RunE: func(cmd *cobra.Command, args []string) error { 17 return runCommand(cmd, opts, registryOptions...) 18 }, 19 ... 20 } 21 ... 22} 23 24// 运行 kube-scheduler 25func runCommand(cmd *cobra.Command, opts *options.Options, registryOptions ...Option) error { 26 ... 27 // 创建 kube-scheduler 配置 cc 28 // 创建 kube-scheduler 实例 sched 29 cc, sched, err := Setup(ctx, opts, registryOptions...) 30 if err != nil { 31 return err 32 } 33 ... 34 return Run(ctx, cc, sched) 35} 从启动命令来看,这里重点关注的是 Setup 函数。在该函数内,创建 kube-scheduler 配置 cc 和调度器实例 sched。 ...
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 实现了 调度框架。该框架没有提供构建新调度器的所有部分。组装一个功能齐全的单元仍然需要队列、缓存、调度算法和其他构建元素。本文档旨在描述所有单独的部分是如何组合在一起,以及它们在整个体系结构中的作用,以便开发人员能够快速了解调度器代码。 ...
上接 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: ...
前言 在看 kube-scheduler 组件的过程中遇到了 kube-scheduler 对于 client-go 的调用,泛泛的理解调用过程总有种隔靴搔痒的感觉,于是调转头先把 client-go 理清楚在回来看 kube-scheduler。 为什么要看 client-go,并且要深入到原理,源码层面去看。很简单,因为它很重要。重要在两方面: ...
前言 前两篇文章介绍了 kube-apiserver 的认证和鉴权,这里继续往下走,介绍 kube-apiserver 的准入。 准入 admission 不同于前两篇的逆序介绍,这里顺序介绍 admission 流程。从创建准入 options,到根据 options 创建准入 config,接着介绍在 kube-apiserver 的 handler 中是怎么进入准入控制,怎么执行的。 ...