K8s-kubelet(Overview)
K8s-kubelet(Overview) 基于1.25 kubelet是K8s中最重要的节点代理程序,运行在集群的每个节点上。 能够自动将节点注册到集群 将节点上、Pod运行状态和资源使用情况周期性上报到控制平面 同时接受控制平面发送到工作任务、启动停止容器、维护管理Pod 也包含对cAdvusor资源用量监控、容器和镜像垃圾回收 kubelet架构设计kubelet整体架构采用了基于事件的处理模型,通过syncLoop和不断调谐Podtatus和PodSpec差距 PodSpec主要来源自三个来源,kube-apiserver、file和HTTP。 file和HTTP主要用于发现Static类型的Pod kubelet默认每隔20s执行一次检测 PodStatus实际状态主要是通过PLEG周期性扫描冗余运行时的运行状态获取。 PLEG每隔1s,从容器运行时获取Pod和Container信息,并于本地缓存进行对比,发生变更的时候,生成PLEG事件,并且发送给事件订阅者触发执行事件处理程序。 默认,当产生PLEG事件,kubelet会执行sync调谐 kubelet...
K8s-kube-proxy(ipvs代理模式)
K8s-kube-proxy(ipvs代理模式) 基于1.25 在ipvs代理模式,kube-proxy主要通过宿主节点上配置的iptables规则、ipvs规则、IPSet内容、Dummy网卡等信息实现Service的功能,这些配置syncProxyRules func 与ipatbles代理模式,ipvs模式对于新增一个Service,只会在IPSet、ipvs规定上有新增内容,而不产生新的iptables链和规则 ipvs代理模式使用IPSet和ipvs实现IP地址匹配和DNAT操作,因此比iptables线性执行效率更高,更适合较大规模集群的场景 统计Stale Service和Stale Endpoints在ipvs代理模式中,Stale Service和Stale Endpoints的判定逻辑与iptables代理模式相同 初始化iptables内容缓冲区kube-proxy也涉及到一些iptables链和规则的创建,因此使用iptables-restore字节流的形成缓存和刷新iptables规则 在kube-proxy同步开始阶段,会初始化四个内容缓冲区。...
K8s-kube-proxy(iptables代理模式执行流程)
K8s-kube-proxy(iptables代理模式执行流程) 基于1.25 kube-proxy 通过宿主节点上的配置iptables实现Service功能,都有syncProxyRule实现 统计State Service和Stale Endpointsiptables代理模式第一步是针对UDP协议,统计Stale Service和Stable Endpoints Endpoints是所有Service的后端地址 为什么需要针对UDP协议进行统计Stale Service和Stale Endpoints的原因? 客户端访问Service负载均衡需要依赖NAT协议,而NAT机制又依赖conntrack模块 UDP协议不会TCP协议一样,存在断开链接,客户端和服务端之间的Conntrack记录不会马上被清除,客户端的发出的UDP数据以来按照原有的NAT发送给不存在的服务端,导致丢包,所以UDP Endpoints被销毁的时候,需要手动清除Conntrack记录 如果一个Service不存在任何后端Pod,则NAT机制由于没有服务端的存在,会丢弃UDP数据包。如果此时S...
K8s-kube-proxy(初始化过程)
K8s-kube-proxy(初始化过程) 基于1.25 kube-proxy也使用Cobra解析用户输入参数,初始化Options对象、验证参数有效性,调用Run启动 Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/cmd/kube-proxy/app/server.go#L483 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162// NewProxyCommand creates a *cobra.Command object with default parametersfunc NewProxyCommand() *cobra.Command { opts := NewOptions() cmd := &cobra.Command{...
K8s-kube-proxy(Overview)
K8s-kube-proxy(Overview) 基于1.25 什么是kube-proxykube-proxy是K8s控制面组件之一,需要在每个节点部署。 kube-proxy根据Service定义和Endpoints、EndpointSlice资源对象中存储的内容,在宿主机上配置iptables、ipvs等规则,实现Service的负载均衡和服务发现功能 kube-proxy主要支持俩种模式:iptables和ipvs ipatbles:通过配置iptables规则实现DNAT、SNAT、源IP地址检查等 ipvs:通过配置ipvs实现DNAT,而SNAT、源IP地址检查等继续配置iptables实现,并且使用IP Set降低查找IP地址和端口的时间复杂度 Service资源K8s中的Service中,有ClusterIP、NodePort、LoadBalancer和ExternalName ClusterIP:最基本的Service 类型,在不考虑双栈的情况下,通常包含一个IP地址和若干个Port,并且通过标签选择器关联后端Pod。集群内应用可以通过”Cluste...
Kube-controller-manager(NodeLifecycleController)
Kube-controller-manager(NodeLifecycleController) 基于1.25 K8s的Pod分配到某个Node中运行。当Node出现异常,集群需要把Node状态更新为异常,并且驱逐上面的Pod到其他Node上运行。 NodeLifecycle Controller负责监视Node状态,根据状态调整Node的Taint NodeLifecycle Controller有一个--enable-taint-manager启动参数,默认为启用状态,在1.27中移除 如果为true:则NodeLifecycle Controller在node异常的时候,通过在node上添加NoExecute Taint来驱逐Node上的Pod 如果是false:则NodeLifecycle Controller,在node异常的时候,会直接驱逐Pod,不会添加Taint 控制器初始化 Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d...
Kube-controller-manager(GarbageController)
Kube-controller-manager(GarbageController) 基于1.25 GarbageController负责资源对象的级联删除(GC) K8s中,主要通过OwnerReference来记录资源的级联关系 OwnerReference结构定义: UID:资源对象父级资源的UID BlockOwnerDeletion:true表示父级资源在以Foregroud删除策略执行删除(在删除这个资源之前,不可删除父资源) GC Controller支持三种删除策略 Orphan(孤儿删除):仅删除当前资源对象,不级联删除当前资源对象的子级资源对象 Foreground(前台删除):先删除当前资源对象子对象,再删除这个对象 Backgroud(后台删除):先删除当前资源对象,再级联删除这个资源的子级对象 使用Orphan和Foreground,资源对象会被加上Finalizer,并且在删除中由GC Controller负责移除 Ref:https://github.com/kubernetes/apimachinery/blob/fdcfc272...
Kube-controller-manager(EndpointSlice)
Kube-controller-manager(EndpointSlice) 基于1.25 EndpointSlice Controller可以把巨大的Endpoints资源对象拆分成多个EndpointSlice,为了解决Endpoints资源对象 一个Service资源对象关联的所有POd地址存储在一个或者多个EndpoineSlice中 控制器初始化 Service EndpointSlice Pod 主要执行逻辑 c.serviceLister.Services 获取Service资源对象 c.podLister.Pods 获取Service的关联Pod c.endpintSliceLister.EndpointSlice 获取Service关联的EndpointSlice dropEndpointSlicesPendingDeletion 过滤删除中的EndpointSlice c.reconclier.reconclie 计算和更新各个EndppintSlice reconcile步骤如下: geAddressTypesForService 获取S...
Kube-controller-manager(Endpoint)
Kube-controller-manager(Endpoint) 基于1.25 Endpoint Controller主要控制Endpoint资源 Endpoints资源对象主要包含Subsets属性,用于存储同命名空间内同名称的Service资源对象关联的Pod的IP地址和端口号 Endpoints Controller为每一个Service资源对象创建一个与命名空间相同的Endpoints对象,并且在Service和Pod变化的时候,重新统计对应Service关联的Pod的IP地址和端口号,更新到Endpoints的Subsets属性中 这些地址和端口被各个节点的kube-proxy用于更新本机的iptables或ipvs 控制器初始化 Service Endpoints Pod 主要执行逻辑 e.serviceLister.Sevice 获取Service e.podLister.Pods 获取Service资源对象关联的POd For _,pod:=range pods 遍历Pod统计所有的IP地址和端口号 Endpoint Controller...
Kube-controller-manager(CronJob)
Kube-controller-manager(CronJob) 基于1.25 CronJob Controller 操作控制CronJob CronJob资源主要包含Job模版(Spec.JobTemplate)和计划表(Spec.Schedule) CronJob 控制器通过资源对象的计划配置,到达预定时间后,创建新的Job对象,并且清理过去成功或者失败的Job资源对象 Spec.Schedule字段定义和Linux终端crontab一致 控制器初始化 Job资源对象 CronJob资源对象 主要执行逻辑 jm.cronJobLister.CronJobs 获取CronJob对象 getJobsToBeReconciled 获取关联的Job对象 syncCronJob 计算Job的启动时间并启动新的Job 获取当前的CronJob对象关联的Job资源对象,更新Status.Active字段,从中去掉已经执行结束的Job,加入正在执行的Job,确保Status.Active都是正在执行的Job 判断CronJob资源对象的状态。如果是删除...


