一、前言
本篇是Kubernetes第十四篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战。
Kubernetes系列文章:
- Kubernetes介绍
- Kubernetes环境搭建
- Kubernetes-kubectl介绍
- Kubernetes-Pod介绍(-)
- Kubernetes-Pod介绍(二)-生命周期
- Kubernetes-Pod介绍(三)-Pod调度
- Kubernetes-Pod介绍(四)-Deployment
- Kubernetes-Service介绍(一)-基本概念
- Kubernetes-Service介绍(二)-服务发现
- Kubernetes-Service介绍(三)-Ingress(含最新版安装踩坑实践)
- Kubernetes-网络
- Kubernetes-存储(一)
- Kubernetes-存储(二)
二、什么是API Server
Kubernetes API Server 是运行在Master节点上的kube-apiserver进程提供的服务。 该服务是集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。由于API Server承担了系统内关键的数据通信部分,所以API Server的性能高低决定了集群性能的高低。
Kubernetes API Server的功能:
- 提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd;
- 资源配额控制的入口;
- 拥有完备的集群安全机制;
三、API Server工作原理图
- API层,提供针对资源CRUD的和监控的接口和健康检查、日志、性能指标等运维相关接口;
- 访问控制层,当客户端访问API的时候,负责对用户的权限做验证,根据配置的的各种资源访问权限判断是否可以访问;
- 注册表层,Kubernetes把所有资源对象都保存在注册表中,针对注册表中的各种资源对象定义了相关数据类型和创建、转换、编码的方法;
- ETCD数据库层,用于持久化存储资源对象的。K8S使用etcd的watch API接口设计了List-Watch高性能资源同步机制,使得系统可以管理大规模的集群和快速及时的处理集群中的各种事件;
四、Kubeetes API介绍
如何访问kubernetes API
Kubernetes通过kube-apiserver这个进程提供服务,该进程运行在单个k8s-master节点上。默认有两个端口。
本地端口
- 该端口用于接收HTTP请求;
- 该端口默认值为8080,可以通过API Server的启动参数--insecure-port的值来修改默认值;
- 默认的IP地址为localhost,可以通过启动参数--insecure-bind-address的值来修改该IP地址;
- 非认证或授权的HTTP请求通过该端口访问API Server;
安全端口
- 该端口默认值为6443,可通过启动参数--secure-port的值来修改默认值;
- 默认IP地址为非本地localhost网络端口,通过启动参数--bind-address设置该值;
- 该端口用于接收HTTPS请求;
- 用于基于Token文件或客户端证书及HTTP Base的认证;
- 用于基于策略的授权;
- 默认不启动HTTPS安全访问控制;
Kubernetes API访问方式
img
curl
curl localhost:8080/api curl localhost:8080/api/v1/pods curl localhost:8080/api/v1/services curl localhost:8080/api/v1/replicationcontrollers
Kubectl Proxy
Kubectl Proxy代理程序既能作为API Server的反向代理,也能作为普通客户端访问API Server的代理。通过master节点的8080端口来启动该代理程序。
kubectl客户端
命令行工具kubectl客户端,通过命令行参数转换为对API Server的REST API调用,并将调用结果输出。
编程方式调用
开发基于Kubernetes的管理平台,比如调用Kubernetes API来完成Pod、Service、RC等资源对象的图形化创建和管理界面。可以使用Kubernetes提供的Client Library。
通过API Server访问Node、Pod和Service
Kubernetes API Server最主要的REST接口是资源对象的增删改查,另外还有一类特殊的REST接口—Kubernetes Proxy API接口,这类接口的作用是代理REST请求,即Kubernetes API Server把收到的REST请求转发到某个Node上的kubelet守护进程的REST端口上,由该kubelet进程负责响应。
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/ #列出指定节点的概要信息
这里获取的Pod信息来自Node而非etcd数据库,两者时间点可能存在偏差。如果在kubelet进程启动时加–enable-debugging-handles=true参数,那么kubernetes Proxy API还会增加以下接口:
/api/v1/proxy/nodes/{name}/run #在节点上运行某个容器 /api/v1/proxy/nodes/{name}/exec #在节点上的某个容器中运行某条命令 /api/v1/proxy/nodes/{name}/attach #在节点上attach某个容器 /api/v1/proxy/nodes/{name}/portForward #实现节点上的Pod端口转发 /api/v1/proxy/nodes/{name}/logs #列出节点的各类日志信息 /api/v1/proxy/nodes/{name}/metrics #列出和该节点相关的Metrics信息 /api/v1/proxy/nodes/{name}/runningpods #列出节点内运行中的Pod信息
Pod相关接口
/api/v1/proxy/namespaces/{namespace}/pods/{name}/{path:*} #访问pod的某个服务接口 /api/v1/proxy/namespaces/{namespace}/pods/{name} #访问Pod
Service相关接口
/api/v1/proxy/namespaces/{namespace}/services/{name}
Pod的proxy接口的作用:在Kubernetes集群之外访问某个pod容器的服务(HTTP服务),可以用Proxy API实现,这种场景多用于管理目的,比如逐一排查Service的Pod副本,检查哪些Pod的服务存在异常问题。
五、集群功能模块之间的通信
Kubernetes API Server作为集群的核心,负责集群各功能模块之间的通信,集群内各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据时,通过API Server提供的REST接口(get/list/watch方法)来实现,从而实现各模块之间的信息交互。
kubelet与API Server交互
每个Node节点上的kubelet定期就会调用API Server的REST接口报告自身状态,API Server接收这些信息后,将节点状态信息更新到etcd中。kubelet也通过API Server的Watch接口监听Pod信息,从而对Node机器上的Pod进行管理。
![image-20211222071300489](/Users/wangtongzhou/Library/Application Support/typora-user-images/image-20211222071300489.png)
kube-controller-manager与API Server交互
kube-controller-manager中的Node Controller模块通过API Server提供的Watch接口,实时监控Node的信息,并做相应处理。
kube-scheduler与API Server交互
Scheduler通过API Server的Watch接口监听到新建Pod副本的信息后,它会检索所有符合该Pod要求的Node列表,开始执行Pod调度逻辑。调度成功后将Pod绑定到目标节点上。