Kube-scheduler(OverView)
Kube-scheduler(OverView) 基于1.25 Kube-schedule是K8s的控制平面组件之一,负责调度整个集群的Pod kube-scheduler调度模型kube-schedule的调度过程主要可以分为两个周期、三个阶段 两个周期主要是调度周期和绑定周期 三个阶段主要是预选(Filter)、优选(score)、绑定(Bind)三个阶段 kube-schedule在调度周期使用出串行策略,每次调度一个Pod 在绑定周期,使用并行策略 kube-scheduler调度Pod有俩种最优解: 全局最优解:执行调度策略会遍历所有的节点,找出全局最优节点 局部最优解,执行调度策略只遍历部分你节点,找出部分最优解 kube-schduler通过自动调度方法执行调度最优解,默认节点小于等于100,寻找最优解 kube-scheduler内部架构主要包含Informer、Scheduling Quque,Cache以及Scheduling Framework组件 Scheduling Queue主要是用于缓存待调度的Pod,以便在调度的时候高效获取...
K8s-kube-apiserver(List-Watch实现原理)
K8s-kube-apiserver(List-Watch实现原理) 基于1.25 List-Watch是K8s的核心机制,基于List-Watch实现了资源变化的感知 List调用ListAPI列出所有资源,基于HTTP短链实现 Watch调用WatchAPI监听资源变更事件,基于HTTP长连接事件 长连接通信协议支持Watch操作碧玺实现客户端和服务端的长连接。 kube-apiserver的Watch支持3种类型的长连接 HTTP/1.1 Chunked Transfer Encoding HTTP/2 WebSocket HTTP/1.1 Chunked Transfer EncodingHTTP/1.1 Chunked Transfer Encoding(分块传输编码)是HTTP中数据传输的一种机制,允许吧服务端发送给客户端的数据分为多个部分,分批次发送 12345# 验证支持HTTP/1.1 Chunkedcurl -ik --http1.1 \--cert /etc/kubernetes/pki/apiserver-...
K8s-kube-apiserver(信号处理机制)
K8s-kube-apiserver(信号处理机制) 基于1.25 K8s基于UNIX信号实现常驻进程以及进程的优雅退出 例如,当kube-apiserver进程接收到SIGTERM或SIGINT信号时,先通知kube-apiserver内部的Gouroutine协程优先退出,再退出主线程退出 例如,Prometheus基于监听SIGHUP信号,实现热加载配置文件 常驻进程实现Kube-apiserver的实现如下,其他类似: Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/cmd/kube-apiserver/app/server.go#L93 123456789101112131415161718192021222324252627282930313233343536373839404142// NewAPIServerCommand creates a *cobra.Command object with default parame...
K8s-kube-apiserver(准入控制器)
K8s-kube-apiserver(准入控制器) 基于1.25 准入控制器会通过在请求经过认证、授权等前置检查后,对象被真正持久化前行最后的拦截,对请求的资源对象进行存储前的变更或验证 准入控制器以插件的形式,支持有命令行参数动态启用(–enable-adminssion-plugins)或禁用(–disable-adminssion-pkugins)指定准入控制器插件 内置插件介绍 名称 说明 AlwaysAdmit 已弃用,允许所有的请求 NamespaceAutoProvsion 检查所有进入的具备命名空间的资源请求,如果引用的命令空间不存在,则自动创建命名空间 NamespaceLifecycle 禁止在一个正在被终止的空间中创建新对象,确保对不存在的命名空间的请求被拒绝。在删除一个命名空间时,触发删除该命名空间下的所有对象(如Pod、Service等)的操作。同时,禁止删除系统保留的命令空间(default、kube-system、kube-public) NamespaceExists 检查所有进入的具备命名空间的资源请求,如果其引用的命...
K8s-kube-apiserver(授权)
K8s-kube-apiserver(授权) 基于1.25 kube-apiserver的授权客户端请求通过认证之后,进入授权阶段,校验对应用户是否具有对应数据读写的权限 支持多种授权机制,并且支持开启多个授权功能 如果开启多个授权,按照授权顺序执行 只要有一个授权器通过,授权就成功 目前支持六种授权模式: AlwaysAllow:允许所有请求 AlwaysDeny:阻止所有请求 ABAC:基于属性的访问控制 Webhook:基于Webhook的一种HTTP回调,远程授权管理 RBAC:基于角色的访问控制 Node:节点模式,专门授权kubelet发出的API请求 集群默认开启Node和RBAC模式 在kube-apiserver中,Authorization授权有三个概念,分别是Decision决策状态、授权器接口和Rule Resolver规则解析器 Decision决策状态 Decision决策状态类似于身份认证中的true和false,用来表示授权是否成功 Ref:https://github.com/kubernetes/apiserver/blob/ba...
K8s-kube-apiserver(请求与认证)
K8s-kube-apiserver(请求与认证) 基于1.25 kube-apiserver请求处理流程: 权限控制体系 认证kube-apiserver支持多种认证机制,并且支持同时开启多个认证功能,组成认证链路 目前支持8种: RequestHeader ClientCA TokenAuth ServiceAccountAuht BootstrrapToken OIDC WebHookTokenAuth Anonymous RequestHeader认证kubeapiserver通过制定以下参数开启RequestHeader认证 --requestheader-client-ca-file制定认证代理客户端证书签发所使用的CA证书,必选 --requestheader-allowed-names:指定允许的通用名称(CN)列表。如果设置则客户端中列表中,不然任选 --requestheader-username-headers:指定HTTP Header中用于设置用户名的字段名称列表,API Server按照顺序检查用户身份,第一个匹配结果作为用户名,必选 --r...
基于OpenVPN建立局域网
基于OpenVPN建立局域网搭建Server安装依赖1234// curl 下载centos7依赖// curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum updateyum install epel-release 官方一键安装123456789101112131415wget https://raw.githubusercontent.com/Angristan/openvpn-install/master/openvpn-install.shsudo chmod +x openvpn-install.shsudo ./openvpn-install.shsystemctl start openvpn@serversystemctl status openvpn@servervim /etc/openvpn/server.conf // 监听网卡tcpdump -i tun0 选择绑定公网IP 选择协议UDP/TCP,记得打开对应端...
K8s-kube-apiserver(启动流程)
K8s-kube-apiserver(启动流程) 基于1.25 APIServer启动流程: Schema资源注册 Cobra命令桉树解析 创建API Server通用配置 创建API EXtensionsServer 创建KubeAPIServer 创建AggregatorServer GenericAPIServer初始化 准备和启动HTTPS服务 Scheme资源注册使用Scheme所有资源注册到APIServer中 Scheme资源注册不算使用显式代码触发,通过init注册。 初始化Scheme资源注册表 Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/pkg/api/legacyscheme/scheme.go#L24 1234567891011121314151617var ( // Scheme is the default instance of runtime.Scheme to which types in the Ku...
K8s-kube-apiserver(Overview)
K8s-kube-apiserver(Overview) 基于1.25 什么是Kube-apiserverkube-apiserver是K8s控制面的组件之一 主要提供集群管理的RESTAPI接口,包括认证授权、数据校验、配置变更 只有kube-apiserver才能直接操作etcd集群中的数据 Pod创建的关键流程: 用户通过客户端向kube-apiserver发起Pod请求 kube-apiserver验证请求的有效性,并将其持久化保存到etcd集群 kube- schedule基于Watch机制感知到新Pod创建的事件 kube- schedule执行调度算法 kube-apiserver验证Bind请求,将结果持久化道etcd集群 kubelet基于Watch机制感知到Pod完成绑定事件 kubelet对应节点的容器运行时交互,启动容器,并向kube-apiserver上报Pod的运行状态 kube-apiserver将Pod的最新状态持久化到etcd集群 用户通过客户端向kube-apiserver发起Pod查询请求 网络通信框架kube-apiserver...
K8s-etcd核心存储实现
K8s-etcd核心存储实现 基于1.25 什么是Etcdetcd是K8s默认的数据持久化端存储,主要用于保存集群配置和状态 etcd是分布式键值存储集群 基于Raft协议提供可靠强一致性数据存取服务 架构设计REST Storage genericregistory.Storegenericregistory.Store封装了资源对象的CRUD操作,并且支持资源版本ResourceVersion的冲突检查 在存储资源对象前执行Beofre Func,存储资源对象后执行(After Func),以及处理DryRun storage.Interface底层通用存储接口,定义了资源的操作方法,Create|Delete|Watch|Get|Count|GETList|GuranteedUpdate|Versioner cachestorage.Cacher为了减轻etcd读取压力和提供了Cache,可以通过设置kube-apiserver的–watch-cache启动或者关闭Cacher,默认开启 Underlying Storage后端存储,默认K8s使用etcd3,使用...



