Kubernetes控制平面组件:Controller Manager详解
云原生学习路线导航页(持续更新中)
- kubernetes学习系列快捷链接
- Kubernetes架构原则和对象设计(一)
- Kubernetes架构原则和对象设计(二)
- Kubernetes架构原则和对象设计(三)
- Kubernetes控制平面组件:etcd(一)
- Kubernetes控制平面组件:etcd(二)
- Kubernetes控制平面组件:API Server详解(一)
- Kubernetes控制平面组件:API Server详解(二)
- Kubernetes控制平面组件:调度器Scheduler(一)
- Kubernetes控制平面组件:调度器Scheduler(二)
- Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
- Kubernetes控制平面组件:Controller Manager 之 NamespaceController 全方位讲解
本文对 kubernetes 的控制面组件ControllerManager进行了详细讲解,包括:ControllerManager的基本功能、架构定位、编写控制器的流程、Lister-watch机制原理、informer机制原理、kube-controller-manager配置参数、CloudControllerManager架构设计、Controller高可用设计(Leader Election)等,并且给出一些生产建议
- 希望大家多多 点赞 关注 评论 收藏,作者会更有动力继续编写技术文章
1.ControllerManager是什么
在 Kubernetes架构原则和对象设计(一) 中我们曾详细介绍过kubernetes控制器工作的基本流程,忘记的可以回顾一下
- Controller Manager 以 单进程多控制器 形式运行,内部包含诸多Controller控制器
- 每个Controller逻辑是大同小异的,都是一个生产者消费者模型
- Controller里的watcher就是一个生产者:使用watch机制监控APIServer中某些资源的变化,观察到的变化事件都会放入一个队列中
- Controller里的处理逻辑作为消费者:不断从队列中取出数据去做调谐。如果调谐失败,需要有将事件重新放回队列,等待一段时间后重试,以此达到 最终一致性。
- 最终一致性:不能保证一次就能达到spec期望状态,但是会有重试机制,保证经过多轮处理后,最终能够达到spec期望状态。
- ControllerManager其实是一个控制器合集,内置资源的Controller都在这里,比如:
- Deployment Controller
- ReplicaSet Controller
- Service Controller
- …
2.编写一个控制器的过程
2.1.编写控制器基本流程
- 先编写 types.go,定义你的 对象结构,包括 spec、status 的定义
- 然后在 type.go 中,编写一些 code generation 代码生成的tag
- 代码生成器会根据tag生成对应的代码框架,其中就包括:Informer框架、Lister框架的代码
- Lister框架 负责从apiserver list 符合条件的全量对象
- Informer框架 负责与apiserver建立watch长连接,监听对象变化
2.2.如何定义一个对象
- 对象一般都是在types.go文件中
2.3.使用代码生成的Tags
2.3.1.code-generator项目
-
code-generator项目:https://github.com/kubernetes/code-generator
-
code-generator项目下包含很多代码生成的工具,包括生成 深拷贝代码、client代码、informer代码、lister代码、conversion代码等
-
代码生成器,是通过文件中的 特定tag 生效的,比如下面有一些常用的tag
标签 解释 // +k8s:deepcopy-gen=package
全局标签,为包内所有类型生成深拷贝方法。 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
生成实现 runtime.Object
接口的深拷贝方法,用于序列化与版本转换。// +genclient
生成客户端代码(CRUD 方法、Lister、Informer)。 // +genclient:nonNamespaced
标记资源为集群作用域(Cluster-scoped),生成不带命名空间参数的方法。 // +genclient:noVerbs
不生成默认客户端方法(需配合其他标签指定特定动词)。 // +genclient:onlyVerbs=create,delete
仅生成指定的客户端方法(如仅 Create
和Delete
)。// +genclient:skipVerbs=get,list,watch
跳过生成指定的客户端方法(如 Get
、List
、Watch
)。// +genclient:method=Create,verb=create,result=...
自定义客户端方法名称、HTTP 动词及返回类型(如返回 metav1.Status
)。 -
说明:
- 全局标签作用于整个包,局部标签作用于单个资源。
- 标签需严格遵循格式(如空格不可省略),否则会被代码生成器忽略。
2.3.2.代码生成使用示例
- 通过编写脚本文件,指定code-generator项目下各种工具的路径,然后使用命令生成具体的代码。如下图:
--input-dirs
:源代码目录-O
:生成的文件名称--bounding-dirs
:输出目录--go-header-file
:加什么样的header描述
3.Controller Lister-Informer 机制
3.1.Controller 基本处理流程
- Controller的 list-Informer 机制一般都包含两部分
- Lister:负责从APIServer List全量数据
- Informer:负责从APIServer Watch数据的变化
- Controller 处理的基本流程
- 首先Lister会从 APIServer List 全量数据。
- 之后Informer 会持续Watch资源的变更事件,并将不同的事件使用对应的 EventHandler(可以自行注册) 处理后,将资源key(namespace+name)加入队列
- 启动一个或多个协程goroutine,作为消费者,从队列中取出资源key并处理
- 注意点:
- 自己编写controller的时候,一般都会在list里使用 label selector,只获取自己关心的 对象
- 但是这里的label selector筛选动作是在apiserver做的,所以对apiserver来说每次list都要检索所有对象,然后再过滤,这个过程消耗很大,控制器内部要尽量避免与apiserver的list操作,尽量使用watch监听代替全量拉取
3.2.Informer的内部机制
- Informer的组件及其职责
- Reflector:反射器,负责将APIServer发过来的对象数据(一般是json或protobuf),反序列化成一个go struct
- Delta FIFO Queue:循环FIFO队列,负责存储 待处理对象,Delta FIFO Queue是一个循环队列,满的时候会覆盖旧数据
- Informer:通知器,负责从Delta FIFO Queue中不断弹出对象,做两件事:
- 通过Indexer索引器,以key-value形式存入Thread Safe Store本地存储。
- key:namespaceName
- value:对象本身
- 通过Handler,调用当前Event类型 对应的那一个Handler,处理后将对象的key添加到WorkQueue
- 通过Indexer索引器,以key-value形式存入Thread Safe Store本地存储。
- Indexer:本地缓存索引器,负责处理和本地缓存相关的查询、写入操作
- Thread Safe Store:线程安全的本地存储,负责在Informer内部维护一份对象缓存,这样控制器的查询操作,就不用到APIServer查询,直接在本地查询即可
- 提高了查询效率,而且缓解了 APIServer 的压力
- Handler:事件处理器,负责处理资源的不同Event,每种Event都应该有一个对应的Handler,所以应该有很多类型的Resource Handler。比如 Create Handler、Update Handler、Delete Handler…。
- 本质上就是一些回调函数,当发生具体事件时回调对应的函数
- WorkQueue:工作队列,负责存储所有待处理对象的key(namespaceName)
- Process NextWorkItem:负责不断从WorkQueue取出key,交给某个Worker处理
- Worker:资源处理工作器,负责真正的对象调谐工作。一般会启动多个Worker,每个Worker都是一个goroutine,并行处理WorkQueue中的事件
- Informer是一个概念,SharedInformer是一个具体实现
- Controller的整个处理流程如下(以Deployment Controller为例):
- Controller 启动时,会通过Lister 先List一下所有Deployment资源,存入Thread Safe Store本地缓存
- 然后 SharedInformer 通过长连接建立 Deployment资源的 watch 连接
- 当发生Deployment资源变化时,APIServer会把事件及对应的Deployment资源对象,发送给Deployment控制器的SharedInformer
- 首先会使用 Reflector将其反序列化为go struct,然后存入Delta FIFO Queue
- Informer 组件会 从Delta FIFO Queue中取出对象,通过IndexerThread Safe Store本地缓存,并通过Handler将对象的key放入WorkQueue
- Process NextWorkItem会从WorkQueue中取出key,找到一个worker对这个deployment资源进行处理
3.3.控制器之间协同工作原理
以创建一个Deployment资源为例
- 用户使用kubectl或http请求方式,发起一个创建Deployment资源的请求
- 请求到达APIServer,会经过 认证、鉴权、资源变形、schema校验、其他校验 等一系列处理后,APIServer 将deployment数据写入自己的watch缓存 和 etcd
- Kubernetes 内部的 DeploymentController 早就已经和APIServer建立了Watch长连接
- 当APIServer将数据写入缓存之后,就会把Deployment资源的变化,通知所有关心Deployment资源的watcher,其中就包括DeploymentController
- DeploymentController 根据自己的处理逻辑,编排出对应的 ReplicaSet 资源,向APIServer发送了创建ReplicaSet请求
- 请求到达APIServer,会经过 认证、鉴权、资源变形、schema校验、其他校验 等一系列处理后,APIServer 将ReplicaSet数据写入自己的watch缓存 和 etcd
- Kubernetes 内部的 ReplicaSetController 早就已经和APIServer建立了Watch长连接
- 当APIServer将数据写入缓存之后,就会把ReplicaSet资源的变化,通知所有关心ReplicaSet资源的watcher,其中就包括ReplicaSetController
- ReplicaSetController 根据自己的处理逻辑,编排出对应的 Pod 资源,向APIServer发送了创建Pod请求
- 请求到达APIServer,会经过 认证、鉴权、资源变形、schema校验、其他校验 等一系列处理后,APIServer 将Pod数据写入自己的watch缓存 和 etcd
- Kubernetes 内部的 Scheduler调度器 和 每个Worker Node上的Kubelet 都早就已经和APIServer建立了Watch长连接
- 当APIServer将数据写入缓存之后,就会把Pod资源的变化,通知所有关心Pod资源的watcher,其中就包括 Scheduler调度器.
- 同时,Scheduler调度器还 watch 了所有的node对象
- Scheduler调度器 发现该pod属于新创建,还没有调度,就会经过计算选择一个node,将 node名称 写到 pod的
spec.nodeName
中,即绑定pod与node,并向 APIServer 发起 pod update 请求。 - APIServer一样会更新 watch缓存+etcd,并通知所有关心Pod资源的watcher,其中就包括 Worker Node 上的 kubelet
- 某一个node上的kubelet 发现pod的
spec.nodeName
和自己的名称一致,就知道这个pod被调度到自己身上- 这个node上的kubelet,就会以此调用 CRI、CNI、CSI,启动容器,挂载网络和数据卷
4.Controller详解
4.1.ControllerManager配置参数
4.1.1.ControllerManager支持哪些Controller
- ControllerManager是一个Controller集合,那么它究竟包含哪些controller呢?
- –controllers 参数中列出来了
# 找到controller-manager pod
[root@VM-226-235-tencentos ~]# kubectl get pods -n kube-system | grep kube-controller
kube-controller-manager-vm-226-235-tencentos 1/1 Running 3 375d# 查看支持的所有controllers
[root@VM-226-235-tencentos ~]# kubectl exec -it kube-controller-manager-vm-226-235-tencentos -n kube-system -- kube-controller-manager -h | grep controllers
--controllers strings A list of controllers to enable. '*' enables all on-by-default controllers, 'foo' enables the controller named 'foo', '-foo' disables the controller named 'foo'.All controllers: attachdetach, bootstrapsigner, cloud-node-lifecycle, clusterrole-aggregation, cronjob, csrapproving, csrcleaner, csrsigning, daemonset, deployment, disruption, endpoint, endpointslice, endpointslicemirroring, ephemeral-volume, garbagecollector, horizontalpodautoscaling, job, namespace, nodeipam, nodelifecycle, persistentvolume-binder, persistentvolume-expander, podgc, pv-protection, pvc-protection, replicaset, replicationcontroller, resourcequota, root-ca-cert-publisher, route, service, serviceaccount, serviceaccount-token, statefulset, tokencleaner, ttl, ttl-after-finished
4.1.2.ControllerManager支持的功能开关
# 查看支持的所有功能开关,会展示哪个默认开 哪个默认关
[root@VM-226-235-tencentos ~]# kubectl exec -it kube-controller-manager-vm-226-235-tencentos -n kube-system -- kube-controller-manager -h | grep feature-gates -A 100--feature-gates mapStringBool A set of key=value pairs that describe feature gates for alpha/experimental features. Options are:APIListChunking=true|false (BETA - default=true)APIPriorityAndFairness=true|false (ALPHA - default=false)APIResponseCompression=true|false (BETA - default=true)AllAlpha=true|false (ALPHA - default=false)AllBeta=true|false (BETA - default=false)AllowInsecureBackendProxy=true|false (BETA - default=true)AnyVolumeDataSource=true|false (ALPHA - default=false)AppArmor=true|false (BETA - default=true)BalanceAttachedNodeVolumes=true|false (ALPHA - default=false)BoundServiceAccountTokenVolume=true|false (ALPHA - default=false)CPUManager=true|false (BETA - default=true)CRIContainerLogRotation=true|false (BETA - default=true)CSIInlineVolume=true|false (BETA - default=true)CSIMigration=true|false (BETA - default=true)CSIMigrationAWS=true|false (BETA - default=false)CSIMigrationAWSComplete=true|false (ALPHA - default=false)CSIMigrationAzureDisk=true|false (BETA - default=false)CSIMigrationAzureDiskComplete=true|false (ALPHA - default=false)CSIMigrationAzureFile=true|false (ALPHA - default=false)CSIMigrationAzureFileComplete=true|false (ALPHA - default=false)CSIMigrationGCE=true|false (BETA - default=false)CSIMigrationGCEComplete=true|false (ALPHA - default=false)CSIMigrationOpenStack=true|false (BETA - default=false)CSIMigrationOpenStackComplete=true|false (ALPHA - default=false)CSIMigrationvSphere=true|false (BETA - default=false)CSIMigrationvSphereComplete=true|false (BETA - default=false)CSIStorageCapacity=true|false (ALPHA - default=false)CSIVolumeFSGroupPolicy=true|false (ALPHA - default=false)ConfigurableFSGroupPolicy=true|false (ALPHA - default=false)CustomCPUCFSQuotaPeriod=true|false (ALPHA - default=false)DefaultPodTopologySpread=true|false (ALPHA - default=false)DevicePlugins=true|false (BETA - default=true)DisableAcceleratorUsageMetrics=true|false (ALPHA - default=false)DynamicKubeletConfig=true|false (BETA - default=true)EndpointSlice=true|false (BETA - default=true)EndpointSliceProxying=true|false (BETA - default=true)EphemeralContainers=true|false (ALPHA - default=false)ExpandCSIVolumes=true|false (BETA - default=true)ExpandInUsePersistentVolumes=true|false (BETA - default=true)ExpandPersistentVolumes=true|false (BETA - default=true)ExperimentalHostUserNamespaceDefaulting=true|false (BETA - default=false)GenericEphemeralVolume=true|false (ALPHA - default=false)HPAScaleToZero=true|false (ALPHA - default=false)HugePageStorageMediumSize=true|false (BETA - default=true)HyperVContainer=true|false (ALPHA - default=false)IPv6DualStack=true|false (ALPHA - default=false)ImmutableEphemeralVolumes=true|false (BETA - default=true)KubeletPodResources=true|false (BETA - default=true)LegacyNodeRoleBehavior=true|false (BETA - default=true)LocalStorageCapacityIsolation=true|false (BETA - default=true)LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - default=false)NodeDisruptionExclusion=true|false (BETA - default=true)NonPreemptingPriority=true|false (BETA - default=true)PodDisruptionBudget=true|false (BETA - default=true)PodOverhead=true|false (BETA - default=true)ProcMountType=true|false (ALPHA - default=false)QOSReserved=true|false (ALPHA - default=false)RemainingItemCount=true|false (BETA - default=true)RemoveSelfLink=true|false (ALPHA - default=false)RotateKubeletServerCertificate=true|false (BETA - default=true)RunAsGroup=true|false (BETA - default=true)RuntimeClass=true|false (BETA - default=true)SCTPSupport=true|false (BETA - default=true)SelectorIndex=true|false (BETA - default=true)ServerSideApply=true|false (BETA - default=true)ServiceAccountIssuerDiscovery=true|false (ALPHA - default=false)ServiceAppProtocol=true|false (BETA - default=true)ServiceNodeExclusion=true|false (BETA - default=true)ServiceTopology=true|false (ALPHA - default=false)SetHostnameAsFQDN=true|false (ALPHA - default=false)StartupProbe=true|false (BETA - default=true)StorageVersionHash=true|false (BETA - default=true)SupportNodePidsLimit=true|false (BETA - default=true)SupportPodPidsLimit=true|false (BETA - default=true)Sysctls=true|false (BETA - default=true)TTLAfterFinished=true|false (ALPHA - default=false)TokenRequest=true|false (BETA - default=true)TokenRequestProjection=true|false (BETA - default=true)TopologyManager=true|false (BETA - default=true)ValidateProxyRedirects=true|false (BETA - default=true)VolumeSnapshotDataSource=true|false (BETA - default=true)WarningHeaders=true|false (BETA - default=true)WinDSR=true|false (ALPHA - default=false)WinOverlay=true|false (ALPHA - default=false)WindowsEndpointSliceProxying=true|false (ALPHA - default=false)
4.1.3.ControllerManager不同Controller的配置项
- ControllerManager 把不同 Controller 的配置都分好了,执行
kube-controller-manager -h
可以看到
......
Deployment controller flags:--concurrent-deployment-syncs int32 The number of deployment objects that are allowed to sync concurrently. Larger number = more responsivedeployments, but more CPU (and network) load (default 5)--deployment-controller-sync-period duration Period for syncing the deployments. (default 30s)Statefulset controller flags:--concurrent-statefulset-syncs int32 The number of statefulset objects that are allowed to sync concurrently. Larger number = more responsivestatefulsets, but more CPU (and network) load (default 5)Deprecated flags:Endpoint controller flags:--concurrent-endpoint-syncs int32 The number of endpoint syncing operations that will be done concurrently. Larger number = faster endpointupdating, but more CPU (and network) load (default 5)--endpoint-updates-batch-period duration The length of endpoint updates batching period. Processing of pod changes will be delayed by thisduration to join them with potential upcoming updates and reduce the overall number of endpoints updates.Larger number = higher endpoint programming latency, but lower number of endpoints revision generatedEndpointslice controller flags:--concurrent-service-endpoint-syncs int32 The number of service endpoint syncing operations that will be done concurrently. Larger number = fasterendpoint slice updating, but more CPU (and network) load. Defaults to 5. (default 5)--endpointslice-updates-batch-period duration The length of endpoint slice updates batching period. Processing of pod changes will be delayed by thisduration to join them with potential upcoming updates and reduce the overall number of endpoints updates.Larger number = higher endpoint programming latency, but lower number of endpoints revision generated--max-endpoints-per-slice int32 The maximum number of endpoints that will be added to an EndpointSlice. More endpoints per slice willresult in less endpoint slices, but larger resources. Defaults to 100. (default 100)Endpointslicemirroring controller flags:--mirroring-concurrent-service-endpoint-syncs int32 The number of service endpoint syncing operations that will be done concurrently by theEndpointSliceMirroring controller. Larger number = faster endpoint slice updating, but more CPU (andnetwork) load. Defaults to 5. (default 5)--mirroring-endpointslice-updates-batch-period duration The length of EndpointSlice updates batching period for EndpointSliceMirroring controller. Processing ofEndpointSlice changes will be delayed by this duration to join them with potential upcoming updates andreduce the overall number of EndpointSlice updates. Larger number = higher endpoint programming latency,but lower number of endpoints revision generated--mirroring-max-endpoints-per-subset int32 The maximum number of endpoints that will be added to an EndpointSlice by the EndpointSliceMirroringcontroller. More endpoints per slice will result in less endpoint slices, but larger resources. Defaultsto 100. (default 1000)Garbagecollector controller flags:--concurrent-gc-syncs int32 The number of garbage collector workers that are allowed to sync concurrently. (default 20)--enable-garbage-collector Enables the generic garbage collector. MUST be synced with the corresponding flag of the kube-apiserver.(default true)
......
4.2.常见Controller
4.2.1.通用Controller
4.2.2.Cloud Controller Manager(CCM)
- kubernetes运行在不同的云上,需要和底层云厂商的云平台进行整合。比如底层是Openstack等,这些底层云平台一般提供了一些可用的API,如节点配置API(nova show可以查看节点信息)、LVS配置负载均衡等。此时就希望有一种开箱即用的方法,让kubernetes到不同环境直接和硬件整合起来。
4.2.2.1.早期云厂商集成架构
- 早期与不同云平台的集成,依赖kube-cloud-manager、kube-apiserver、kubelet等与之交互完成
4.2.2.2.引入CCM的新架构
- 后来社区希望把 将云供应商特定代码 和 Kubernetes 核心代码 分离开来,使得 云供应商代码可以 与kubernetes核心管控组件一起运行,也能够以 Kubernetes 插件的形式启动,引入了Cloud Controller Manager。
- 如上图,基于CCM的架构中,将所有与云供应商交互的部分集中到一个组件 cloud-controller-manager 中,便于扩展与维护
- 集成方式:
- 假设当前有一个 基于openstack的云平台,可以通过指定 Cloud Controller Manager 的 Cloud Provider==openstack,并提供 openstack 的一系列配置,就可以将kubernetes 与 该云平台集成起来。kubernetes 通过 CCM 提供的cloud API,调用底层云平台的一些能力,实现对硬件及环境的管理。
- 使用举例:比如有一个基于openstack的云平台 使用nova管理节点,kubernetes就可以通过cloud api调用openstack 的 nova查询到节点信息,然后写入自己的etcd中维护。当node被删除时,kubernetes通过cloud api发现node被删除时,也要在自己这边做node移除动作
4.2.2.3.CCM 的组件
参考:云控制器管理器的基础概念
- CCM 将 Kubernetes 控制器管理器(KCM)的一部分功能剥离,并作为独立的进程运行。具体地说,它将 KCM 中依赖云服务的控制器剥离,KCM 中存在以下依赖云服务的控制器:
- 节点控制器
- 卷控制器
- 路由控制器
- 服务控制器
- 在 kubernetes 1.8 版本中, 已经将 KCM 中 下面3个控制器移入CCM:
- 节点控制器:API 包含节点的 Get、List、Create、Update、Patch、Watch
- 路由控制器:API 包含路由 Get
- 服务控制器:API 包含service的 List、Get、Watch、Patch、Update
- 卷控制器因为涉及比较复杂,没有挪入
4.3.常见Controller详解
- 详见:Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
- 本文是kubernetes的控制面组件ControllerManager系列文章,本篇详细讲解了kubernetes 内置常用的Controller,包括:Job、HPA、ReplicaSet、StatefulSet、Namespace、NodeIpam/NodeLifecycle Controller、DaemonSet、Endpoint、EndpointSlice、Garbege Controller、CronJob、ControllerRevision、Lease
5.Scheduler 与 Controller 高可用性:Leader Election机制
5.1.Leader Election 机制特点
- Scheduler/Controller 都是 基于Leader Election机制 来保证高可用的。不过 这里的 leader-election 机制和 etcd 等组件的选主有所不同
- Controller leader-election 不需要数据同步,也没有主从的概念,这里的 选主 只是选出一个controller成为 工作模式,其他controller作为 故障备选副本,在leader controller发生异常时顶上去处理请求。
- 因此不管controller有几个副本,都只会有一个在工作的,这是为了防止同一个key被多个controller同时处理发生问题
- kubernetes 代码中提供了leader-election机制,开发crd控制器时可以直接使用
5.2.Leader Election 机制原理
- 基本原理:
- 多个Controller pod,或多个Scheduler pod,需要保证只有一个在运行,就需要使用锁。
- 哪个pod抢到锁,谁就是当前的 Leader,负责处理请求。
- 其他没抢到锁的无法处理请求,但也不能放弃,需要定期检查,一旦leader有问题释放了锁,自己抢到了就变成了leader,就可以处理请求了
- 这是一种 多个进程抢占资源的模式,这个资源可以是对象,kubernetes提供了一些公共对象,可以作为 Scheduler/Controller 多个pod的锁。比如使用 endpoint/configmap/lease 等对象作为锁
5.2.1.早期使用 endpoint/configmap 作为公共对象
-
早期是使用endpoint/configmap作为公共对象。
- 如上图的ep,subsets是空的,不过在annotation中使用
control-plane.alpha.kubernetes.io/leader
记录leader信息 - 哪个controller pod先获取到这个对象,就把自己的信息写进去,就代码抢到了锁成为了leader
- 如上图的ep,subsets是空的,不过在annotation中使用
-
记录 leader 信息时,
control-plane.alpha.kubernetes.io/leader
的值包含哪些信息?字段名称 字段作用 示例值或说明 holderIdentity
当前持有领导权的节点/组件标识符 "minikube"
(当前 Leader 名称)leaseDurationSeconds
Leader 租约有效期(秒),超时未续期将触发重新选举 15
(需大于组件续期间隔)acquireTime
当前 Leader 首次获取领导权的时间(RFC 3339 格式) "2018-04-05T17:31:29Z"
renewTime
当前 Leader 最后一次续期时间,用于判断活跃状态 "2018-04-07T07:18:39Z"
leaderTransitions
Leader 切换次数计数器,每次 Leader 变更时递增 0
(表示未发生过 Leader 切换) -
注意事项
-
时间格式:
- 所有时间字段均采用 RFC 3339 格式(例如
"2025-05-04T09:30:00Z"
)
- 所有时间字段均采用 RFC 3339 格式(例如
-
租约机制:
- Leader 需在
leaseDurationSeconds
内通过更新renewTime
证明存活 - 若超时未续期,其他候选节点将触发重新选举
- Leader 需在
-
字段更新逻辑:
- 只有 Leader 有权更新
renewTime
- 当新 Leader 当选时,
holderIdentity
和acquireTime
会被重置 leaderTransitions
由系统自动维护,禁止手动修改
- 只有 Leader 有权更新
-
兼容性说明:
- 此为 Kubernetes 早期(<1.14)基于 Endpoint 的 Leader Election 实现
- 新版(≥1.14)建议使用
coordination.k8s.io/Lease
资源(字段作用相同)
-
5.2.2.新版本使用 Lease 作为公共对象
- 后来提供了一个更轻量级,专用于LeaderElection的类型Lease,记录的leader信息和上面的endpoint类似,只不过是记录在了spec中,比如:
apiVersion: coordination.k8s.io/v1 kind: Lease metadata:creationTimestamp: "2025-04-25T05:10:14Z"name: leader.devops-manager.infra.tce.ionamespace: tcs-systemresourceVersion: "791250083"uid: 6eb9c7a0-fc64-4fa8-85c9-8dbeca459c37 spec:acquireTime: "2025-04-25T05:10:14.000000Z"holderIdentity: devops-manager-controller-66c7578995-6gv24_1c1cc322-ead6-4ba1-9dc7-292a7f4d299fleaseDurationSeconds: 15leaseTransitions: 0renewTime: "2025-05-04T12:40:26.194903Z"
6.来自生产的经验
相关文章:
Kubernetes控制平面组件:Controller Manager详解
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
使用 JavaScript 实现数据导出为 Excel 和 CSV 文件
在 Web 开发中,经常会遇到需要将数据导出为文件的需求,例如将数据导出为 Excel 或 CSV 文件。今天,我们就来探讨如何使用 JavaScript 实现这一功能。 一、实现思路 我们通过 HTML 创建一个按钮,点击按钮时,触发 Java…...
设一个测试情境,新用户注册后显示的名字不完整,测试思路是怎么样的?
问题分析:新用户注册后显示名称不完整 典型表现:用户注册时输入"张三丰",系统仅显示"张"或"张三"等不完整信息 一、测试排查思维导图 二、详细测试方案 1. 前端测试 输入验证: 测试不同长度名称(1字符/10字符/50字符) 测试含空格名称(如…...
NHANES指标推荐:ZJU index
文章题目:Association between ZJU index and gallstones in US adult: a cross-sectional study of NHANES 2017-2020 DOI:10.1186/s12876-024-03553-9 中文标题:ZJU指数与美国成年人胆结石的关联:2017-2020年NHANES横断面研究 发…...
数据存储——高级存储之PV和PVC
一、概述 PV ( Persistent Volume )是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下 PV 由 kubernetes 管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。 PVC &a…...
Astro Canvas 数据中心→设备一览大屏操作指南
✅ Astro Canvas 数据中心→设备一览大屏操作指南 📌 目标 通过API连接器 → 转换器 → 数据源 → 数据集 → Astro大屏设计,展示从 IoTDA 获取的设备影子数据,并在 Astro 大屏中以设备一览形式可视化展示(如设备ID、温度、湿度、烟雾浓度等状态)。 🔁 一、整体流程概…...
Cisco NDO - Nexus Dashboard Orchestrator
目录 一、什么是 Cisco NDO? 二、ND vs. NDO? 三、NDO vs. NDFC 四、NDO 用例: 一、什么是 Cisco NDO? Nexus Dashboard Orchestrator(NDO)可通过单一界面,实现跨多个数据中心的一致性网络与策略编排、可扩展性与灾难恢复等。 当在本地、多种私有云或公有云中同时运…...
Android 控件CalendarView、TextClock用法
一 UI代码 <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto…...
Socket 编程 TCP
Socket 编程 TCP TCP socket API 详解V1 - Echo ServerV2 - Echo Server 多进程版本V3 - Echo Server 多线程版本V4 - Echo Server 线程池版本多线程远程命令执行v5 引入线程池版本翻译 TCP socket API 详解 socket(): socket()打开一个网络通讯端口,如果成功的话,就像 open…...
信息系统项目管理师-软考高级(软考高项)2025最新(七)
个人笔记整理---仅供参考 项目立项管理 7.1项目建议与立项申请 项目建议书内容必背! 7.2项目可行性研究 项目可行性研究必考 7.3项目的评估与决策...
Qt中的UIC
Qt中的UIC(User Interface Compiler, 用户界面编译器):读取由Qt Widgets Designer生成的XML格式(.ui)文件并创建相应的C头文件或Python源文件。如将mainwindow.ui文件生成ui_mainwindow.h。 uic.exe位置在6.8.0\msvc2019_64\bin ,其支持的输入参数如下所…...
【MATLAB例程】基于RSSI原理的Wi-Fi定位程序,N个锚点(数量可自适应)、三维空间,轨迹使用UKF进行滤波,附代码下载链接
本文所述程序实现了一种基于信号强度(RSSI)的Wi-Fi定位算法,并结合无迹卡尔曼滤波(UKF)对动态目标轨迹进行滤波优化。代码支持自适应锚点数量,适用于三维空间定位,可模拟目标运动、信号噪声及非…...
vulkanscenegraph显示倾斜模型(6.5)-vsg::DatabasePager
前言 上章深入分析了帧循环过程中,多线程下的记录与提交机制。本章将分析vsg::DatabasePager在更新场景图过程中的作用,进一步揭露vsg中场景图管理机制,并通过分析代码,详细解释vsg中场景图管理机制中的节点添加、节点删除、节点加…...
利用 Python pyttsx3实现文字转语音(TTS)
今天,我想跟大家分享如何利用 Python 编程语言,来实现文字转换为语音的功能,也就是我们常说的 Text-to-Speech (TTS) 技术。 你可能会好奇,为什么学习这个?想象一下,如果你想把书本、文章、杂志的内容转换…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.1 描述性统计分析(均值/方差/分位数计算)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 5.1 描述性统计分析:均值、方差与分位数计算实战5.1.1 数据准备与分析目标数据集介绍分析目标 5.1.2 均值计算:从整体到分组分析总体均值计算加权均值…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.4 数据抽样(简单随机抽样/分层抽样)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据分析实战:数据抽样核心技术解析5.4 数据抽样:从简单随机到分层策略的深度实践5.4.1 简单随机抽样:概率均等的基础抽样方法…...
时间同步服务核心知识笔记:原理、配置
一、时间同步服务 在 Linux 系统中,准确的时间至关重要。对于服务器集群,时间同步确保各节点间数据处理和交互的一致性,避免因时间差异导致的事务处理错误、日志记录混乱等问题。在分布式系统中,时间同步有助于协调任务调度、数据…...
Leetcode刷题记录32——搜索二维矩阵 II
题源:https://leetcode.cn/problems/search-a-2d-matrix-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述: 思路一: 💡 解题思路:利用矩阵有序特性 双指针法(Z 字形搜索&…...
【最新Python包管理工具UV的介绍和安装】
介绍 uv是一个非常快的 Python 包安装程序和 pip 解析器,用 Rust 编写,设计为pip-tools的直接替代品。 以下是官网给出的UV与其他包管理工具解决依赖(左)和安装包(右)的对比图。 可以看出UV是一个极快的 P…...
第二章-猜数游戏
猜数游戏 纸上得来终觉浅,绝知此事要躬行。实践才能出真知,因此本文内容将通过一个小项目快速帮我们上手Rust语言。其中可能会出现一些目前还不是很了解的知识,但没事,后续通过学习我们会慢慢了解的,现在我们先体会一…...
Go小技巧易错点100例(二十九)
随着 Go 语言的不断迭代,新版本带来了许多实用的标准库函数,使得代码更加简洁、可读性更强。本篇文章主要介绍 Go 1.21 版本中的一些新特性,涵盖 可变类型比较、slice 最大值与最小值、map 转换为 slice 以及 map 合并 等常见场景,…...
游戏开发的TypeScript(5)TypeScript的类型转换
TypeScript的类型转换 游戏开发中,事件经常会携带一些数据,而这些数据会做类型上的转化,在 这种情况下,类型转换(Type Assertion)能够让你手动把某个值指定为特定类型。这在 TypeScript 无法自动推断出正确…...
旋转图像(中等)
借助辅助矩阵来翻转: 第i行第j列的元素会出现在新矩阵的第j行倒数第i列。 class Solution {public void rotate(int[][] matrix) {int n matrix.length;int[][] matrix_new new int[n][n];for (int i 0; i < n; i) {for (int j 0; j < n; j) {matrix_ne…...
慢sql处理流程和常见案例
思维导图: 在 MySQL 数据库管理中,慢查询是影响系统性能的常见痛点。随着 MySQL 8 版本的普及,其新增特性(如 CTE、隐藏索引、JSON 格式执行计划等)为慢查询优化提供了更强大的工具。本文结合 MySQL 8 的特性,通过代码…...
Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
E-R图作业
1.一个图书馆借阅管理数据库要求提供下述服务: (1)可随时查询书库中现有书籍的品种、数量与存放位置。所有各类书籍均可由书号惟一标识。 (2)可随时查询书籍借还情况,包括借书人单位…...
debuginfo详解
debuginfo 是 Linux 系统中存储调试符号和源代码信息的特殊软件包,用于分析内核或用户态程序的崩溃转储文件(如 vmcore、coredump)。它在调试复杂问题(如内核崩溃、程序段错误)时至关重要。以下是其核心作用、安装方法…...
Android学习总结之GetX库篇(场景运用)
状态管理 在一个复杂的 Flutter 应用里,怎样借助 GetX 管理多个相互关联的状态,并且保证代码的可维护性和性能? 考察点:对 GetX 状态管理的深入理解,以及在复杂场景下运用它的能力。 解答思路: 采用模块…...
android-ndk开发(5): 编译运行 hello-world
android-ndk开发(5): 编译运行 hello-world 2025/05/05 1. 概要 hello-world 是每一门语言的第一个样例程序, 跑通它, 在一段时间内你会相当顺畅: 可以边学边实验, 根据运行结果得到反馈。 而对于 android-ndk 开发而言&#…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】6.1 客户分群分析(RFM模型构建)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据分析实战:RFM模型构建实现客户分群分析6.1 客户分群分析——RFM模型构建6.1.1 RFM模型核心指标解析6.1.2 数据准备与清洗规范数据表结构设计数据清…...
stm32之TIM定时中断详解
目录 1.引入1.1 简介1.2 类型1.2.1 基本定时器1.2.2 通用定时器1. 触发控制单元 (Trigger Control Unit)2. 输入捕获单元 (Input Capture Unit)3. 输出比较单元 (Output Compare Unit)4. CNT 计数器5. 自动重装载寄存器 (ARR)6. 预分频器 (PSC)7. 中断与 DMA 事件8. 刹车功能 (…...
【Hive入门】Hive安全管理与权限控制:用户认证与权限管理深度解析
目录 引言 1 Hive安全管理体系概述 2 Hive用户认证机制 2.1 Kerberos集成认证 2.1.1 Kerberos基本原理 2.1.2 Hive集成Kerberos配置步骤 2.1.3 Kerberos认证常见问题排查 2.2 LDAP用户同步 2.2.1 LDAP协议概述 2.2.2 Hive集成LDAP配置 2.2.3 LDAP与Hive用户同步架构…...
解决DNS劫持问题
什么是DNS劫持? DNS劫持(DNS Hijacking)是指通过篡改DNS配置,将用户的域名解析请求引导到恶意服务器的攻击方式。这种攻击常见于恶意软件、路由器漏洞或DNS配置被修改的情况下。攻击者通过这种方式控制了用户访问的网站ÿ…...
android-ndk开发(1): 搭建环境
android-ndk开发(1): 搭建环境 2025/05/05 1. 目的 写一些 C/C 代码, 例如 cv 基础算法, 并交叉编译到 android 平台。 不涉及 JNI、 Java、 Kotlin, 暂不涉及 rust。 基本上能适用于华为鸿蒙的 ohos ndk。 那么, 为了完成交叉…...
力扣面试150题-- 翻转二叉树
Day 41 题目描述 做法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…...
开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM(一)
一、前言 随着大语言模型的参数规模持续膨胀,如何在有限算力下实现高效推理成为行业焦点。阿里云推出的Qwen3-8B,凭借其卓越的语言理解与生成能力,已在多个基准测试中展现竞争力。而vLLM框架作为大模型部署的“加速器”,通过PagedAttention实现内存的高效管理,并支持连续批…...
brep2seq kaggle安装 micromamba conda环境
https://github.com/zhangshuming0668/Brep2Seq Micromamba Installation — documentation !curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba A Synthetic CAD Models Dataset for Deep Learning kaggle只有20g,等我有…...
钩子函数和参数:Vue组件生命周期中的自定义逻辑
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
SpringBoot企业级开发之【文件上传】
看一下我们的需求: 接口文档: 分析思路: 现在我们先实现后端先: 实操: 一.存储到本地磁盘: 1.Controller 创建一个FileUploadController类 package org.huangyingyuan.controller;import org.huangyingyu…...
Linux系统安装PaddleDetection
一、安装cuda 1. 查看设备 先输入nvidia-smi,查看设备支持的最大cuda版本,选择官网中支持的cuda版本 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/conda/linux-conda.html 2. 下载CUDA并安装 使用快捷键…...
JVM 内存结构全解析
带你深入 JVM 内存结构,搞懂运行时数据区到底是怎么回事 JVM 的内存结构到底长什么样?程序计数器、虚拟机栈、堆、方法区、直接内存到底有什么用?这篇文章将从实际运行角度出发, 用一篇文章彻底讲透 JVM 的运行时数据区。一、为什么你必须搞懂 JVM 内存结构? 在一次线上…...
K8S node ARP 表爆满 如何优化
当 Kubernetes 节点的 ARP 表爆满时,可能会导致网络通信故障。以下是针对该问题的优化策略和解决方案: 一、ARP 表爆满的危害 网络不通:新的 ARP 请求无法被处理,导致数据包无法转发。性能下降:ARP 表查找效率降低&a…...
SpringMVC——第7章:HttpMessageConverter
一、HttpMessageConverter HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为:HTTP消息转换器。该接口下提供了很多实现类,不同的实现类有不同的转换方式。 1.什么是HTTP消息 HTTP消息其实就是HTTP协议。HTTP协议包括请求协议和响应协议。…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.4 异构数据源整合(CSV/JSON/Excel数据导入)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL异构数据源整合:CSV/JSON/Excel数据导入全攻略4.4 异构数据源整合:多格式数据导入实战4.4.1 CSV数据导入:高效批量处理4.4.1.1…...
在macOS上安装windows系统
使用Boot Camp 1. 准备工作:确认Mac满足Boot Camp系统要求,准备好Windows安装光盘或ISO映像文件,以及一个至少8GB的空白USB闪存驱动器用于保存驱动程序。 2. 打开Boot Camp助理:在“应用程序”文件夹的“实用工具”中找到“Boot…...
最长回文子串(动规 + 中心拓展)
目录 [BM73 最长回文子串](https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af?tpId295&tags&title&difficulty0&judgeStatus0&rp0&sourceUrl/exam/oj?questionJobId10&subTabNameonline_coding_page)1. 动态规划(1)状态表示:…...
学习海康VisionMaster之亮度测量
一:进一步学习了 今天学习下VisionMaster中的亮度测量:这个和前面学习的都不一样了,这个是测量ROI区域内的平均亮度等 1:什么是亮度测量? 我们工业上用的相机里面有一个感光芯片(CCD/CMOS)&…...
LeetCode 238:除自身以外数组的乘积(Java实现)
文章目录 **题目描述**解决思路1. 两次遍历法(左右乘积法)2. 核心思想 Java代码实现复杂度分析示例说明步骤分解 注意事项总结 题目描述 给定一个整数数组 nums,返回一个数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外…...
LintCode第23题-判断数字与字母字符 第145题-大小写转换 第283题-三数之中的最大值
思路: 直接使用包装类的方法来判断 比如: isLetter(char c)判断是否是字母(包括大小写、非英语字母也行) isDigit(char c)判断是否是数字(0~9) isLetterOrDigit(char c)是否是字母或数字(等价于 isLetter isLower…...
Visual Studio 项目转Qt项目
1. 先确保qmake 和 minGW (g) 路径都在系统变量内;或者通过WinR -> cmd 来检测, 如果能够 显示qmake 的信息 , g 的信息 , 就说明设置环境变量成功。 2. 打开项目文件夹,在这里打开cmd, 换…...