K8s 核心组件——API Server

1. Kubernetes API Server 概述

1.1 基本概念

Kubernetes API Server(API Server)是 Kubernetes 的核心组件之一,负责暴露 Kubernetes API 给用户和客户端,接收和处理来自客户端的请求,并将其存储到 etcd 中。Kubernetes API Server 主要作用是提供 Kubernetes 各类资源对象(如 Pod、Deployment、Service等)的增、删、改、查及 Watch 等 HTTP REST 接口,是集群内各个功能模块直接数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。同时,它还是集群管理的 API 入口,提供了认证、授权、准入控制、资源配额等集群安全机制

除了提供 RESTful API 之外,API Server 还可以通过 kubectl 命令行工具、客户端库和第三方工具与 Kubernetes 集群进行交互。同时,它也是整个 Kubernetes 集群的中心化组件之一,对整个 Kubernetes 系统的运行状态、节点健康等信息进行监控和管理。

我们之前讲解的针对 Kubernetes 资源的各种操作,都是将请求先发给了 Kubernetes API Server,再由它帮我们处理。所以它的地位确实是很重要的。

Kubernetes API Server 通过一个名为 kube-apiserver 的进程提供服务,该进程运行在 Master 上。属于静态 pod。

[root@master mtuser]# kubectl get pod -A | grep kube-apiserver
kube-system   kube-apiserver-master              1/1     Running   1          22d

在默认情况下, kube-apiserver 进程在本机的 8080 端口(对应参数 --insecure-port)提供 REST 服务。我们可以同时启动 HTTPS 安全端口(--secure-port=6443)来启动安全机制,加强 REST API 访问的安全性。

这里我们要简单说一下,Kubernetes API Server 本身也是一个 Service,它的名称是 kubernetes,并且它的 ClusterIP 地址是 ClusterIP 地址池里的第一个地址,另外,它的端口是 HTTPS 端口 443,可以查看:

[root@master mtuser]# kubectl get svc
NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes        ClusterIP   10.96.0.1    <none>        443/TCP    25d

1.2 小实验

我们简单测试下 Kubernetes API Server 提供的接口,我们可以使用 curl 命令行:

登录 Master 并运行下面的 curl 令,得到 JSON 方式返回的 Kubernetes API的版本信息

[root@master mtuser]# curl localhost:8080/api
{"kind": "APIVersions","versions": ["v1"],"serverAddressByClientCIDRs": [{"clientCIDR": "0.0.0.0/0","serverAddress": "192.168.18.129:6443"}]
}

运行下面的 curl 命令,分别返回集群中的 Pod 列表、Service 列表、RC 列表:

curl localhost:8080/api/v1/pods
curl localhost:8080/api/v1/services
curl localhost:8080/api/v1/replicationcontrollers

2. etcd 简介

etcd 是一个开源的分布式键值存储系统,主要用于存储分布式系统中的关键数据。它由 CoreOS 团队开发,并使用 Go 语言编写,基于 Raft 协议实现了数据的分布式复制和一致性保证。etcd 能够在分布式环境中实现数据的高可用和可靠性,广泛用于容器编排系统(如 Kubernetes)、分布式锁、配置管理等领域。

Kubernetes 将 etcd 作为集群的数据库用于存储集群状态信息、配置信息等

etcd 的数据模型类似于一个简单的键值数据库(key-value),其中的每个键都关联着一个对应的值。etcd 还支持监视(watch)机制,即客户端可以注册对指定键值的监视,一旦该键值发生变化,etcd 就会立即通知相应的客户端。这使得 etcd 能够作为分布式系统中的重要协调工具,例如在 Kubernetes 集群中用于存储集群状态信息、配置信息等。

3. API Server 架构解析

API Server 架构从上到下可以分为以下几层,如图:

  • API 层:主要是 REST 方式提供各种 API 接口,除了有 Kubernetes 资源对象的 CRUD (创建、读取、更新、删除)和 watch 等主要 API,还有健康检查、UI、日志、性能指标等运维监控相关的 API。Kubernetes 从 1.11 版本开始废弃 Heapster 监控组件,转而使用 Metrics Server 提供 Metrics 的 API 接口,进一步完善自身的监控能力
  • 访问控制层:当客户端访问 API 接口时,访问控制层负责对用户身份鉴权、验明用户身份,核准用户对 Kubernetes 资源对象的访问控制权限,然后根据配置的各种资源访问许可逻辑(Admission Control),判断是否允许访问
  • 注册表层:Kubernetes 把所有资源对象都保存在注册表中(Registry)中,针对注册表中各种资源对象都定义了资源对象的类型、如何创建资源对象、如何转换资源对象不同的版本,以及如何将资源编码和解码为 JSON 和 ProtoBuf 格式存储
  • etcd 数据库:用于持久化存储 Kubernetes 资源对象的 KV 数据库。etcd 的 watch API 接口对于 API Server 来说至关重要,因为通过这个接口,API Server 创新性的设计了 List-Watch 这种高性能的资源对象实时同步机制,使 Kubernetes 可以管理超大规模的集群、及时响应和快速处理集群中的各种事件。

4. API Server 的 List-Watch 机制

Kubernetes API Server 使用了一种 List-Watch 机制来实现资源对象的监控和更新。该机制可以用来实现对 Kubernetes 资源对象的实时监控,从而支持实时状态查询和事件响应。

在 Kubernetes 中,每一个 API Server 实例都维护着一个 etcd 集群的连接,通过该连接可以与 etcd 存储中心进行数据交互。当一个客户端向 API Server 发送一个资源对象的请求时,API Server 会首先查询 etcd 存储中心,以获取当前资源对象的状态如果客户端需要实时监控资源对象的状态,则 API Server 将会启用 List-Watch 机制,将监控请求注册到 etcd 存储中心中,并返回一个带有当前资源对象状态的响应。随着 etcd 存储中心中的资源对象状态发生变化,API Server 将会自动通知客户端,客户端可以通过 Watch 事件机制获取这些状态变化的通知

我们以一个 Pod 完整的调度过程,来说明一下 API Server 的 List-Watch 机制。

首先,借助 etcd 提供的 Watch API 接口,API Server 可以监听(Watch) 在 etcd 上发生的数据操作事件,比如 Pod 创建事件、更新事件、删除事件等,在这发生之后,etcd 会及时通知 API Server。上图中 API Server 和 etcd 之间的交互箭头表名了这个过程:当一个 ReplicaSet 对象被创建并保存到 etcd 中后(图中 2. 创建 ReplicaSet 箭头),etcd 会立即发送一个对应的 Create 事件给 API Server (图中 3.发送创建 ReplicaSet 事件箭头),与其类似的 (6、7、10、11) 箭头都是针对 Pod 的创建、更新事件。

然后,为了让 Kubernetes 中的其它组件在不访问 etcd 数据库的情况下,也能及时获取资源的变化事件,API Server 模仿 etcd 的 Watch 接口提供自己的 Watch 接口,这样一来,这些组件就能近乎实时的获取自己感兴趣的任意资源对象的相关事件通知了。上图中 controller-manager、scheduler、kubelet 等组件与 API Server 之间的 3 个标记为 “List-Watch” 的虚线框表明了这个过程。同时,在监听自己感兴趣的资源时,客户端可以增加过滤条件,以 List-Watch 为例,node1 节点上的 kubelet 进程只对自己节点上的 Pod 事件感兴趣。

最后,Kubernetes List-Watch 用于实现数据同步的代码逻辑。客户端首先调用 API Server 的 List 接口获取资源对象的全量数据并将其缓存到内存中,然后启动对应资源对象的 Watch 协程,在接收到 Watch 事件后,再根据事件类型(比如新增、修改或删除)对内存中的全量资源对象列表做出相应的同步修改。从实现来看,这是一种全量结合增量的、高性能的、近乎实时的数据同步方式。

在资源对象的增删改查操作中,最复杂的应该是"改"更新操作,因为关键资源对象都是有状态的对象,例如 Pod、Deployment 等。很多时候,只需要修改已有的某个资源对象的某些属性,并保持其属性不变,对于这样的特殊又实用的更新操作,用户无需提供完整资源对象 yam 文件,只需将修改属性写入 YAML 文件中提交就可以。

5. 独特的 Kubernetes Proxy API 接口

Kubernetes API Server 最主要的 REST 接口是资源对象的增、删、改、查,另外还有一类特殊的 REST 接口——k8s Proxy API 接口,这类接口的作用是代理 REST 请求,即 Kubernetes API Server 把收到的 REST 请求转发到某个 Node 上的 kubelet 守护进程的 REST 端口上,由该 kubelet 进程负责响应

5.1 Kubernetes Proxy API 关于Node 的相关接口

关于 Node 相关的接口的 REST 路径为:/api/v1/proxy/nodes/{name},其中 {name} 为节点的名称或 IP 地址。

包括以下几个具体的接口:

/api/v1/proxy/nodes/{name}/pods/    #列出指定节点内所有Pod的信息
/api/v1/proxy/nodes/{name}/stats/   #列出指定节点内物理资源的统计信息
/api/v1/prxoy/nodes/{name}/spec/    #列出指定节点的概要信息

例如,当前 Node 的名称为 node1,用以下命令即可获取在该节点上运行的所有 Pod :

curl localhost:8080/api/v1/nodes/node1/proxy/pods

需要说明的是:这里获取的 Pod 信息来自 Node 而非 etcd,两者时间点可能存在偏差。



 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

花几千上万学习Java,真没必要!(三十一)

集合&#xff1a; 1、数组的特性&#xff1a; 2、ArrayList&#xff08;动态数组&#xff09;&#xff1a; 测试代码1&#xff1a; package listtest.com; import java.util.ArrayList; import java.util.List; public class HashCodesArrayList { public static void ma…

深入分析 Android ContentProvider (六)

文章目录 深入分析 Android ContentProvider (六)ContentProvider 的性能优化和实践案例&#xff08;续&#xff09;1. 性能优化技巧&#xff08;续&#xff09;1.6. 使用批量插入优化性能示例&#xff1a;批量插入实现 1.7. 使用 Projections 优化查询示例&#xff1a;使用 Pr…

本周热点丨快手《可灵》国际版正式上线、《王者荣耀》国际服海外下载量破5000万

7月第4周 秦彻带动《恋与深空》2.0霸榜全球 《蔚蓝档案》上线3.5周年庆典版本&#xff0c;登顶日服iOS畅销榜 《Honor of Kings》下载量突破五千万 英伟达将开发"Blackwell"的中国定制版芯片 人工智能初创公司Cohere获得5亿美元融资 Fal AI推出全新开源图像生成模型A…

reshape函数及MATLAB应用

reshape 函数在 MATLAB 中是一个非常有用的函数&#xff0c;通过重新排列现有元素来重构数组。它允许你重新调整数组&#xff08;或矩阵&#xff09;的尺寸&#xff0c;而不改变其数据。这个函数特别适用于当你需要将一个矩阵或数组从一种结构转换为另一种结构时&#xff0c;只…

AFSim 仿真系统--任务处理器入门指南

任务处理器 任务处理器&#xff08;WSF_TASK_PROCESSOR&#xff09;是一个WSF处理器&#xff0c;它提供了检查轨迹管理器中的数据&#xff08;轨迹&#xff09;并对其采取行动的能力。这些行动包括&#xff1a; *向下属分配任务 *激活或停用传感器或干扰器 *开火武器 *操纵平台…

昇思MindSpore 应用学习-DCGAN生成漫画头像-CSDN

日期 心得 昇思MindSpore 应用学习-DCGAN生成漫画头像&#xff08;AI代码学习&#xff09; DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动…

vue2和el-input无法修改和写入,并且不报错

文章目录 一. 业务场景描述二. 原因分析三.解决方案3.1 方案一 原生标签&#xff08;不建议&#xff09;3.2 方案二 父子传递&#xff08;不建议&#xff09;3.3 方案三 vuex&#xff0c;pinia 状态传值&#xff08;不建议&#xff09;3.4 方案四 vue初始化属性 &#xff08;建…

Java从入门到精通(十三)~ 枚举和注解

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 一、枚举 1.1 枚举的概念 ​编辑 1.2 枚举的特点 1.3 枚举的实际运用 1. 状态机&#xff0c;描述属性的…

Nginx配置详解

1. Nginx安装 进入到/usr/local目录下&#xff0c;执行命令&#xff1a; yum install -y nginx通过如下命令启动nginx服务 systemctl start nginx通过如下命令&#xff0c;设置nginx开启自启动 systemctl enable nginxnginx默认占用80端口。 访问ip:80&#xff0c;可以看到…

Open3D 点云按xyz轴等距切片

目录 一、概述 1.1原理 1.2实现步骤 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2按x轴切片 3.3按y轴切片 3.4按z轴切片 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff…

Java中线程池的基本使用

参考这个课程&#xff0c;讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池&#xff08;让我们了解底层逻辑的&#xff09; 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…

Aria2 任意文件写入漏洞

目录 Aria2介绍漏洞描述漏洞复现 Aria2介绍 Aria2是一个在命令行下运行&#xff0c;多协议&#xff0c;多来源下载工具&#xff08;HTTP / HTTPS&#xff0c;FTP&#xff0c;BitTorrent&#xff0c;Metalink&#xff09;&#xff0c;内建XML-RPC用户界面。Aria提供RPC服务器&a…

流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器

1 安装和测试srs流媒体服务器 服务器&#xff1a;SRS(Simple RTMP Server&#xff0c;⽀持RTMP、HTTP-FLV&#xff0c;HLS) 推流端&#xff1a;ffmpeg OBS 拉流端&#xff1a;ffplay VLC srs播放器 1.1 安装srs流媒体服务器 官网 SRS (Simple Realtime Server) | SRS 码…

18746 逆序数

这个问题可以使用归并排序的思想来解决。在归并排序的过程中&#xff0c;我们可以统计逆序数的数量。当我们合并两个已经排序的数组时&#xff0c;如果左边的数组中的元素&#xfffd;&#xfffd;于右边的数组中的元素&#xff0c;那么就存在逆序&#xff0c;逆序数的数量就是…

IEC104转MQTT网关支持MQTT对接Ignition、阿里云、华为云、亚马逊AWS、ThingsBoard、Zabbix平台助力远程管理

钡铼推出了一款专为电力系统设计的数据采集网关——IEC104转MQTT网关BE113&#xff0c;感兴趣的朋友接着往下看&#xff1a; 一、网关概述 IEC104转MQTT(Ignition)网关BE113是一款专为电力系统设计的数据采集网关&#xff0c;支持DL/T645和IEC104等协议的设备。上行支持MQTT协…

二、3 函数递归

自己间接或直接调用自己&#xff08;可大大减少代码量&#xff09; 1、举例 2、递归必须有停下来的条件 3、举例 普通求解数组长度 递归求解

Java进制,进制的转换

目录 进制 进制介绍 案例演示 进制的图示 进制的转化&#xff08;基本功&#xff09; 二进制转换成十进制 八进制转换成十进制 十六进制转换成十进制 十进制转换成二进制 十进制转换成八进制 十进制转换成十六进制 二进制转换成八进制 二进制转换成十六进制 …

Linux信号上

信号 概念 信号是由于进程产生&#xff0c;但是由内核调度传递给另一个进程&#xff1a; 产生信号 按键产生信号: Ctrc --> 2)SIGINT(终止/中断) Ctrz --> 20)SIGTSTOP(终端暂停) Ctr\ --> 3)SIGQUIT(退出) 系统调用产生: kill(2), raise, abort软件条件产生: 如定…

从与原始的Transformer architecture比较来理解GPT

从与原始的Transformer architecture比较来理解GPT flyfish 一、Transformer architecture 先说名词 不同的文献和资料中有不同的名字&#xff0c;其实是一样的意思 1 编码器-解码器多头注意力机制&#xff08;Encoder-Decoder Multi-Head Attention Mechanism&#xff09; …

爬虫-实战爬取虎扑ACG帖子

要求如下: 爬取虎扑步行街 ACG 版面的数据,要求使用多线程来并发爬取。范围是第一页的所有帖子,每个帖子包含标题、主题内容和第一页的所有回复内容。最后打印出爬到的所有帖子的标题。 网址是:ACG圈 - 虎扑社区。 针对上面的要求,我们进行分析: 首先是要使用多线程范…