September 1, 2023
Prometheus性能压测与高可用设计 # Prometheus原理 # 名词 # Series(系列) 是指具有相同标签集的一组时间序列。它们是根据标签的组合唯一确定的。<指标名称>{<标签键>=<标签值>, ...},如:
|<------------------------Series-------------------------->| avalanche_metric_0_0{cycle_id="0",label_key_0="label_val_0"} 18 Sample(样本) 是指一个数据点,它包含了一个时间戳和相应的数值。样本是 Prometheus 时间序列数据的基本单位。每个样本都与一个唯一的时间序列(Series)标识符相关联,该标识符由一组键值对(标签)唯一确定。这些标签可以用来标识和区分不同的时间序列。<时间戳> <数值>,如:
|<------------------------------Series-------------------->|<--时间戳->|<值> avalanche_metric_0_0{cycle_id="0",label_key_0="label_val_0"} @125465645 2 -> 一个Sample @125465646 5 ... Prometheus缺点 # 原生Prometheus并不支持高可用,也不能做横向扩缩容,当集群规模较大时,单一Prometheus会出现性能瓶颈,无法正常采集数据。
在集群场景下 单一Prometheus只能查询本地的指标,而不能跨区域查询,因此需要一个统一的管理。
单节点Prometheus性能压测 # 压测环境 # garden v3.2 3节点环境:
节点 CPU(Core) Memory(GiB) 存储 IOPS 写速率(1MB) master01 8 16GiB 280GiB 261 10.6 MB/s master02 8 24GiB 280GiB 238 9.6 MB/s master03(Prometheus所在节点) 8 24GiB 280GiB 274 9.5 MB/s 组件版本:
组件 Version prometheus v2.
...
July 19, 2023
Prometheus GO SDK # 1. 介绍Prometheus # Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。
Prometheus生态有很多丰富的组件以及SDK。其中常见的组合是 SDK + Prometheus + Alert Manager + Grafana + Loki。
2. Prometheus Go客户端库概述 # Github地址: https://github.com/prometheus/client_golang
. ├── api │ └── prometheus ├── examples # 官方例子 │ ├── exemplars │ ├── gocollector │ ├── middleware │ ├── random │ └── simple ├── prometheus # 核心代码定义各种指标接口、结构等 │ ├── collectors # 定义收集器等 │ ├── graphite # 设计模式相关 │ ├── internal # 内部实现 │ ├── promauto # 与Prometheus实例之间维护一个全局注册表,用于维护指标信息 │ ├── promhttp # 通过 HTTP 服务暴露出来的方法集合 │ ├── push # 推送指标到Prometheus相关的包 │ └── testutil # test相关的 3.
...
April 27, 2023
kube-ovn网络 # 此项预研包括了多网卡、集群互联、混合部署、OVS/OVN、CNI、kubevirt等基础组件,并探讨基于K8s实现的OVN平台所实现的功能以及能否满足公司不同场景的容器、虚拟机网络需求。
kube-ovn # Kube-OVN是一个基于Open Virtual Network (OVN)的Kubernetes网络解决方案。它使用OVN作为底层网络虚拟化平台,为Kubernetes集群提供高性能、高可用、可扩展的网络服务。
下面是Kube-OVN的整体架构:
OVN控制平面(与传统OVN类似) 负责管理Kubernetes集群的网络资源和配置,包括虚拟网络(VPC)、子网(Subnet)、路由、ACL等。这些组件部分来自 OVN/OVS 社区,Kube-OVN 对不同的使用场景做了特定修改。
OVN控制平面由多个组件组成,包括:
ovn-central:运行 OVN 的管理平面组件,负责处理逻辑网络拓扑,包括虚拟网络、子网、路由等。包括ovn-nb, ovn-sb,和ovn-northd。 ovn-controller: 执行所有Kubernetes内资源到OVN资源的翻译工作。 ovs-ovn:运行了 openvswitch, ovsdb,和ovn-controller。这些组件作为 ovn-central 的 Agent 将逻辑流表翻译成真实的网络配置。 OVN数据平面(由内核提供) 负责实现虚拟网络的转发和隔离。OVN数据平面利用Linux内核提供的虚拟化技术,如Linux内核自带的Open vSwitch (OVS)和Virtual Extensible LAN (VXLAN),实现高性能、高可扩展性的虚拟网络。
Kubernetes控制平面(结合k8s资源) 负责管理Kubernetes集群的各种资源,如Pod、Service、Endpoint、CR等,并将这些资源转换(翻译)为对应的OVN网络配置,以实现Kubernetes网络服务。
除此之外,Kube-OVN还提供了一些额外的组件和工具:
kube-ovn-cni:实现 CNI 接口,并操作本地的 OVS 配置单机网络。 kube-ovn-operator:用于简化Kube-OVN的安装、配置和管理。 kube-ovn-monitor:监控指标。 kube-ovn-pinger:收集 OVS 运行信息,节点网络质量,网络延迟等信息。 kubectl-ko:OVN 运维平面用到的命令行工具。 kube-ovn-speaker:对外发布容器网络的路由,使得外部可以直接通过 Pod IP 访问容器。 kube-ovn部署使用 # kube-ovn有两种方式部署Overlay和Underlay模式。
默认是Overlay模式。
Underlay:容器运行在虚拟机中,ovs运行在k8s上(POD部署),kube-ovn将容器网络和虚拟机网络连接在同一平面,可以直接给容器分配物理网络中的地址资源,达到更好的性能以及和物理网络的连通性。
Overlay:容器运行在虚拟机中,ovs运行在k8s上(POD部署),kube-ovn的默认子网使用 Geneve 对跨主机流量进行封装,在基础设施之上抽象出一层虚拟的 Overlay 网络。对于容器IP直通的场景可以配合multus-cni为容器添加额外的虚拟机层IP。或者参考高级功能采用路由或者BGP方式将容器网络和物理网络打通。
Underlay模式下能够获得更好网络性能,但是无法使用Overlay模式下的SNAT/EIP,分布式网关/集中式网关等 L3 功能,VPC 级别的隔离也无法对 Underlay 子网生效。
...
July 19, 2022
简介 # client-go是k8s的一个基础组件库,是用于与API-Server交互的http客户端。K8s中大部分组件都使用了这个库实现与API-Server的通信功能。除了能够对资源对象的增删改查,还可Watch一个对象、升级成websocket链接等等功能。
client-go支持四种客户端:RESTClient、ClientSet、DynamicClient、DiscoveryClient。这几个client可以相互转换。
RESTClient # RESTClient是最基础的客户端,相当于最底层的基础结构,可以直接通过RESTClient提供的RESTful方法如Get()、Put()、Post()、Delete()进行交互。
一般而言,为了更为优雅的处理,需要进一步封装,通过Clientset封装RESTClient,然后再对外提供接口和服务。
可以通过ClientSet客户端获得:
client := cli.CoreV1().RESTClient().(*rest.RESTClient) ClientSet # Clientset是调用Kubernetes资源对象最常用的client,可以操作所有的资源对象,包含RESTClient。需要制定Group、Version,然后根据Resource获取。
clientset,err := kubernetes.NewForConfig(config) sa, err := clientset.CoreV1().ServiceAccounts("kube-system").Get("kube-shell-admin", metav1.GetOptions{}) DynamicClient # Dynamic client是一种动态的client,它能处理kubernetes所有的资源。不同于clientset,dynamic client返回的对象是一个map[string]interface{}。
dynamicClient,err := dynamic.NewForConfig(config) gvr := schema.GroupVersionResource{Version: "v1",Resource: "pods"} unstructObjList,err := dynamicClient.Resource(gvr).Namespace("dev").List(context.TODO(),metav1.ListOptions{Limit: 100}) DiscoveryClient # DiscoveryClient是发现客户端,主要用于发现kubernetes API Server所支持的资源组、资源版本、资源信息。除此之外,还可以将这些信息存储到本地,用户本地缓存,以减轻对Kubernetes API Server访问的压力。 kubectl的api-versions和api-resources命令输出也是通过DisconversyClient实现的。
discoveryClient,err := discovery.NewDiscoveryClientForConfig(config) APIGroup,APIResourceListSlice,err := discoveryClient.ServerGroupsAndResources() 这几种客户端的初始化都涉及到了入参config,即*rest.Config,这个是用于初始化客户端的所有配置信息。
rest.Config初始化 # 创建client前,需要先从初始化*rest.Config,这个*rest.Config可以从集群外的kubeconfig文件或者集群内部的 tokenFile 和 CAFile初始化(通过ServiceAcount自动挂载)。有以下几种方式:
集群外通过kubeconfig初始化 # BuildConfigFromFlags方法从给定的url或者kubeconfig文件的文件夹路径去初始化config,如果不成功则会使用集群内部方法初始化config,如果不成功则返回一个默认的config。
// "k8s.io/client-go/tools/clientcmd" config, err := clientcmd.
...
July 18, 2022
欢迎来到hindung的部落格 Copy from @ 马克飞象 # @(示例笔记本)[飞驰|人生|Markdown]
马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器,通过精心的设计与技术实现,配合印象笔记强大的存储和同步功能,带来前所未有的书写体验。特点概述:
功能丰富 :支持高亮代码块、LaTeX 公式、流程图,本地图片以及附件上传,甚至截图粘贴,工作学习好帮手; 得心应手 :简洁高效的编辑器,提供 桌面客户端以及 离线Chrome App,支持移动端 Web; 深度整合 :支持选择笔记本和添加标签,支持从印象笔记跳转编辑,轻松管理。 [TOC]
Markdown简介 # Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— 维基百科
正如您在阅读的这份文档,它使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个 链接或一个脚注1。下面列举了几个高级功能,更多语法请按Ctrl + /查看帮助。
代码块 # @requires_authorization def somefunc(param1='', param2=0): '''A docstring''' if param1 > param2: # interesting print 'Greater' return (param2 - param1 + 1) or None class SomeClass: pass >>> message = '''interpreter ... prompt''' LaTeX 公式 # 可以创建行内公式,例如 $\Gamma(n) = (n-1)!
...
July 23, 2021
容器技术 # 什么是容器呢?
印象中第一次接触“容器”这个词,是在化学课上,不就是一装东西的瓶子嘛有啥特别的。
仔细想想,“装”东西即在某种程度上与其他物体隔离开来了。所以称这个「装东西的东西」为容器。
是吧!那现在所说的“容器”到底是啥概念,他能装什么东西,又把什么东西在某种程度上隔离开?
我的理解就是:「把资源隔离开的东西」。
资源泛指OS上的资源,如CPU、内存、设备、文件系统等等。如何进行隔离呢?Linux内核提供了某种机制能让上诉所说的“资源”隔离开来,即Namespace和CGroups。
容器技术就是基于这两个内核特性进行设计和开发。
Namespace # 命名空间在 维基百科上的广义解释是:
“在计算机中,命名空间是一组用于标识和引用各种对象的符号(名称)。命名空间可确保所有给定的对象集都具有唯一的名称,以便可以轻松识别它们。”
根据这个定义,Linux内核提供的命名空间定义为:
“命名空间是Linux内核的一项功能,该功能对内核资源进行分区,以使一组进程看到一组资源,而另一组进程看到另一组资源。该功能通过为一组资源和进程具有相同的名称空间而起作用,但是这些名称空间引用了不同的资源。资源可能存在于多个空间中。这样的资源有进程ID、主机名、用户ID、文件名以及一些与网络访问和进程间通信相关。”
从内核版本5.6开始,存在8种名称空间。命名空间功能在所有类型上都是相同的:每个进程都与一个命名空间相关联并且只能查看或使用与该命名空间以及后代命名空间相关联的资源。 这样,每个进程(或其进程组)可以在资源上拥有唯一的视图。隔离哪个资源取决于已为给定进程组创建的名称空间的类型。
Mount (mnt) # 挂载命名空间控制隔离挂载点。即隔离文件系统目录结构。
比如你在每个容器里都有/usr目录,你们都可以访问这个目录,但他们是不一样的。
Process ID (pid) # PID命名空间为进程提供了一套独立于其他命名空间的进程ID(PID)。
PID命名空间是嵌套的,这意味着当一个新的进程被创建时,它将有一个从其当前命名空间到初始PID命名空间的每个命名空间的PID。因此,初始PID命名空间能够看到所有进程,尽管其PID与其他命名空间看到的进程不同。
比如用于创建容器的Runc Daemon进程。
Network (net) # 网络名称空间可虚拟化网络堆栈。由于每个容器有不同的网络接口,每个地址信息,包括IP地址,都可以分开。
Interprocess Communication (ipc) # IPC命名空间将进程与SysV风格的进程间通信隔离。
UTS # UTS(UNIX时间共享)命名空间允许一个系统在不同的进程中出现不同的主机名和域名。
User ID (user) # 用户命名空间是一个提供权限隔离和用户识别隔离的功能,跨越多组进程,从内核3.8开始可用。
在管理员的协助下,有可能建立一个看起来有管理权限的容器,而实际上没有给用户进程提升权限。像PID命名空间一样,用户命名空间是嵌套的,每个新的用户命名空间都被认为是创建它的用户命名空间的子空间。
Control group (cgroup) Namespace # 控制组命名空间,隐藏了进程作为成员的控制组的身份。
在这样的命名空间中的进程,在检查任何进程属于哪个控制组时,会看到一个实际上是相对于创建时设置的控制组的路径,隐藏其真实的控制组位置和身份。
Time Namespace # 时间命名空间允许进程以类似于UTS命名空间的方式看到不同的系统时间。 它在2018年被提出,并在2020年3月发布的Linux 5.6上登陆。
规划中的命名空间 # syslog namespace、Syscalls、Destruction,具体信息请参阅 维基百科
CGroup # 控制组cgroups是Linux内核提供的一个功能,用于从硬件和相关方面限制一组特定的分组进程。
...
June 1, 2021
iptable是啥 # 参考 维基百科:iptables是运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的处理和转发。
iptables规则 # iptables主要有raw、mangle、filter、nat这几个表,对应几个规则:PREROUTING 、INPUT 、FORWARD 、OUTPUT、POSTROUTING 。
NAT 包括 SNAT (源地址转换)和 DNAT (目的地址转换)。两者的区别在于做地址转换是在路由前还是路由后,SNAT和DNAT总是成对出现的。
对应的含义可以简单理解为:
表名 用途 包含的规则 表名 用途 包含的规则 raw 关闭nat表上启用的连接追踪机制 PREROUTING,OUTPUT mangle 拆解报文,做出修改,并重新封装的功能 PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat 网络地址转换功能 PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有) filter 负责过滤功能,防火墙 INPUT,FORWARD,OUTPUT 规则的意义:
规则 意义 PREROUTING 报文刚刚到达主机,还没经过路由 INPUT 报文已经经过路由,判断是发送给本机的报文 FORWARD 报文已经经过路由,判断不是本机的报文,如果内核开启转发功能则转发出去,否则丢弃 OUTPUT 报文从应用发出报文已经经过路由 POSTROUTING 报文从应用发出已经经过路由,准备从网卡发出 数据从网络到达主机,再从主机到达应用的过程,以集群中traefik部署的Ingress为例,可以理解为: iptable相关命令 # 查看iptables规则:
iptables -L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则 参考 https://wangchujiang.com/linux-command/c/iptables.html
June 1, 2021
前言 # 环境采用了calico+ebgp/ibgp+交换机组成了一个扁平化网络,使用calico宣告POD IP,做到了POD与其他虚拟机和开发网落处在同一个平面的效果。
具体组网信息可以参考calico网站。
东西流量 # Pod到Service流量 # 一般的应用大多数是以Pod到Service的形式去请求服务,从而出现东西方向的流量,目前集群的网络采用Calico作为网络插件,POD的IP由Calico进行统一分配,Service IP由集群K8s分配,并且配合Kube-proxy操作Iptable创建对应的规则。
首先,创建一个POD时,calico会同时在POD对应的主机生成对应的calico网桥calixxx,并且分配IP,并且通过calico组件路由宣告出去:
发送到calixxx的流量会转发至POD的eth0网卡,而从POD发出来的报文则是通过ARP 代理的方式转发至calixxx网桥。
而当一个Service创建之后,会根据选择器与POD标签配对,对应上POD IP并且被Kube-Proxy监控到,K8s会随即生成对应的DNS记录service.namespace.local.cluster:serviceclusterIP,然后在Iptables添加相应的规则记录,如(10.88.145.173为ServiceIP,10.90.1.127为POD IP):
一般的,在集群中从POD访问Service,再从Service到达对应的POD流程为(正向请求用①表示,回复报文用(1)表示):
下面梳理一下请求的主要过程:
①POD向domian发送请求 ②由于没有IP,POD先向CoreDNS查询域名对应的IP地址 ③CoreDNS返回对应的Service IP ④POD拿到IP之后,向该IP发送数据,对应的报文从calixxx网桥出来 ⑤从calixxx网桥出来后,进入Host Iptables链,进入IP tables之后,进入对应的链路如上图规则,最后得到Service对应的POD IP,并转发到此IP,此时会经过路由,分为两种情况,目标IP在同一节点上(路由表有记录)或者不在同一节点上(路由表无记录) ⑥如果在同一节点上,根据路由表则会路由到目标IP对应的calixxx网桥 ⑦如果不在同一节点上,则根据路由表规则,会从bond1口出去 ⑧到达交换机,交换机有对应的路由条目,则会走到(3)和(4)过程进入Host,并且走到Iptables,通过路由,转到⑥过程 ⑨到达calixxx网桥之后会转发至POD eth0网卡,到达POD 应答过程:
(1)POD以传过来的源POD IP作为目的IP从eth0发出,通过ARP代理转发到calixxx网桥 (2)达到calixxx网桥之后会经过POD所在的节点的Host路由表,同样分为两种情况 (3)如果不在同一节点上,则会走bond1到交换机 (4)再从交换机到达对应的节点,之后便到达过程(5) (5)经过路由表,到达目的IP 对应calixxx网桥 (6)再从网桥到达POD eth0 Pod到Pod流量 # 由于网络平面化,POD IP可以直通,所以会存在POD相互访问的场景,如隐私号应用等:
主要过程:
①POD以目标POD的IP作为目的IP,从eth0发出,到达calixxx ②到达calixxx网桥之后会进入Host内核Iptables链到达PREROUTING(路由前) ③之后进入路由模块进行路由,路由判断该报文是否是发给本机的,如果是则往上收将进入INPUT链,此过程不在讨论范围,由于报文目的地址是POD IP,所以会转发出去 ④到达FORWARD链后进入POSTROUTING(路由后) ⑤进入POSTROUTING会进行一些地址转换等操作后发往对应网卡或者网桥,如果路由结果表明该报文要通过网卡Bond1出去则会走到⑧过程,否则会走到⑥ ⑥表明目的IP在本机网桥上(即POD在同一节点上),则进入目的地址对应的calixxx网桥 ⑦再转发至POD eth0网卡到达目的地 ⑧报文从内核出来进入网卡,准备向外发出 ⑨到达交换机,由于交换机有所有POD的路由信息,所以他能正确处理经过的报文 ⑩经过路由后到达POD所在节点的入口网卡Bond1 11.到达网卡之后会进入内核Linux协议栈进行Iptables规则链匹配(可能的路径为到③->④->⑤->⑥->⑦到达对应的POD) 回复过程:
(1)到达目的POD之后,应用根据源IP进行回应,转发至calixxx网桥 (2)到达网桥之后进入Linux协议栈,其过程会从③->④->⑤->(3)到达源POD (3)到达源POD对应的网桥 (4)从网桥转发至POD eth0网卡,此时会经过Linux协议栈,最终报文从内核到用户空间送到应用。 南北流量 # 外部流量从Ingress(越过service)到Pod # client客户端请求POD应用,首先要创建对应的Service,并且创建Ingress路由。集群中采用Traefik作为Ingres Controller,以DeamonSet的方式部署,并且开启hostNetwork模式,与主机公用网络协议栈。并且接管所有到达主机的80端口、8080端口的报文。Traefik的原理主要是通过监控APIserver来监控Service、POD的变化,并维护路由,而且接管80端口的流量,转发到对应路由的POD IP上。
...
June 1, 2021
注:基于Kubenetes 版本:Server v1.17.2、Client v1.17.9
kubectl命令行全景图 # kubectl🔗
有趣的kubectl命令 # 获取正在Running的Pod # kubectl get pods -A --field-selector=status.phase==Running NAMESPACE NAME READY STATUS RESTARTS AGE kelu cka2-75dbf7c54-gm4r4 1/1 Running 0 23h kube-system calico-kube-controllers-ccf66db4-cpvqp 1/1 Running 0 3d20h kube-system calico-node-8d4th 1/1 Running 0 3d2h kube-system calico-node-szmzb 1/1 Running 0 3d20h 查看节点内存容量 # kubectl get no -o json | jq -r '.items | sort_by(.status.capacity.memory)[]|[.metadata.name,.status.capacity.memory]| @tsv' rq-bjptest01 3848040Ki rqinterntest2 7986060Ki 查看各个节点上的Pod数量 # kubectl get po -o json --all-namespaces | jq '.
...
June 1, 2021
总体架构 # Kubernetes系统采用C/S架构,分为Master和Node两个部分,Master作为Server端,Node作为Client端。
多Master的方式可以实现集群的高可用。
Master也叫做主控节点,它主要负责:
管理所有的节点 调度POD 控制集群运行过程中的所有状态 包含了以下几个组件: API-Server:集群的HTTP REST接口,统一入口 Controller-Manager:所有资源的自动化控制中心 Scheduler:POD调度 Node也叫做工作节点,主要负责:
管理所有容器 监控、上报所有POD的运行状态 包含了以下几个组件: Kubelet:管理节点上容器的生命,与Master节点通信 Kube-Proxy:服务通信、负载均衡 CRI容器运行时:接收kubelet的容器相关的指令并执行 Master节点也拥有Node相关的组件,即该Master也可以作为工作节点进行计算。
除此之外,k8s内部的存储采用ETCD作为唯一存储,一般采用集群高可用的方式部署。
Etcd集群是分布式K/V存储集群,提供了可靠的强一致性服务发现。Etcd集群存储Kubernetes系统的集群状态和元数据,其中包括所有Kubernetes资源对象信息、资源对象状态、集群节点信息等。Kubernetes将所有数据存储至Etcd集群前缀为/registry的目录下。
各个组件的功能 # 在k8s集群中主要有以下几种组件:
kubectl # kubectl是K8s官方提供的命令行工具,它主要与API-Server交互,通信协议采用HTTP/Json。
client-go # 除了有命令行工具对K8s进行管理之外,还提供了编程方式。client-go用golang进行开发,它最初是K8s的部分代码,现在抽成了独立的仓库。
K8s任何组件与API-Server通信都是基于client-go。
API-Server # 负责将K8s “资源组/资源版本/资源” 以RESTful形式对外提供服务。API-Server是集群中唯一与ETCD交互的组件。并且实现了集群的安全访问机制以及认证、授权、准入控制等。
Controller-Manager # 管理控制器负责管理、维护集群内的状态,如维护POD的副本个数为期望的状态值等。
包含了多个控制器:
DeploymentControllers控制器 StatefulSet控制器 Namespace控制器 PersistentVolume控制器 等等 每个控制器通过kube-apiserver组件提供的接口实时监控整个集群每个资源对象的当前状态,当因发生各种故障而导致系统状态出现变化时,会尝试将系统状态修复到“期望状态”。 Scheduler # 负责调度POD在某个节点上运行。Kubelet上报节点信息,Scheduler通过监控这些信息,当有新的POD需要调度时,会根据这些节点信息进行调度算法计算最有节点。
调度算法分为两种,分别为预选调度算法和优选调度算法。除调度策略外,Kubernetes还支持优先级调度、抢占机制及亲和性调度等功能。
kube-scheduler组件支持高可用性(即多实例同时运行),即基于Etcd集群上的分布式锁实现领导者选举机制,多实例同时运行,通过kube-apiserver提供的资源锁进行选举竞争。抢先获取锁的实例被称为Leader节点(即领导者节点),并运行kube-scheduler组件的主逻辑;而未获取锁的实例被称为Candidate节点(即候选节点),运行时处于阻塞状态。在Leader节点因某些原因退出后,Candidate节点则通过领导者选举机制参与竞选,成为Leader节点后接替kube-scheduler的工作。
Kubelet # kubelet组件用来接收、处理、上报kube-apiserver组件下发的任务。kubelet进程启动时会向kube-apiserver注册节点自身信息。它主要负责所在节点(Node)上的Pod资源对象的管理,例如Pod资源对象的创建、修改、监控、删除、驱逐及Pod生命周期管理等。
kubelet组件实现了3种开放接口:
Container Runtime Interface:简称CRI(容器运行时接口),提供容器运行时通用插件接口服务。CRI定义了容器和镜像服务的接口。CRI将kubelet组件与容器运行时进行解耦,将原来完全面向Pod级别的内部接口拆分成面向Sandbox和Container的gRPC接口,并将镜像管理和容器管理分离给不同的服务。
Container Network Interface:简称CNI(容器网络接口),提供网络通用插件接口服务。CNI定义了Kubernetes网络插件的基础,容器创建时通过CNI插件配置网络。
Container Storage Interface:简称CSI(容器存储接口),提供存储通用插件接口服务。CSI定义了容器存储卷标准规范,容器创建时通过CSI插件配置存储卷。
Kube-Proxy # kube-proxy组件,作为节点上的网络代理,运行在每个Kubernetes节点上。它监控kube-apiserver的服务和端点资源变化,并通过iptables/ipvs等配置负载均衡器,为一组Pod提供统一的TCP/UDP流量转发和负载均衡功能。
...