K8S基础学习-了解kubernetes机理
kubernetes集群分为俩部分:
kubernetes控制平面
工作节点
控制平面的组件:
etcd分布式持久化存储
API服务器
调度器
控制器管理器
这些组件用来存储,管理集群状态。但他们不是运行应用的容器。
工作节点上的组件:
kubelet
kube-proxy
docker
附加组件:提供额外的功能
DNS服务器
仪表板DASHBOARD
INGRESS控制器
性能监控工具 HEAPSTER METRICS
容器网络接口插件 FLANNEL CALICO
组件间如何通信
组件间只能通过API服务器通信,它们之间不会直接通信。API服务器是和ETCD通信的唯一组件,其他组件不会直接和ETCD通信,而是通过API服务器来修改集群状态。
API服务器和其他组件的连接基本都是由组件发起的。
如果使用kubectl来连接容器时,API服务器会向kubelet发起连接。
高可用性: etcd和api服务器的多个实例可以同时并行工作,但是,调度器和控制器管理器只能有一个实例起作用,其他实例处于待命模式。
etcd是k8s存储集群状态和元数据的唯一的地方。
ETCD集群需要对系统的实际状态保持一致,使用的是一致性算法(脑裂算法)如果分裂成不互联的节点组,包含节点多的可以更改状态,小的不可以。恢复连接后,第二个组会更新成第一个的状态。
因此,etcd实例数量应该是奇数,偶数分裂更加容易因为数量相同而宕机。
k8s API服务器作为中心组件,其他组件或客户端都会去调用它,以RESTful的形式提供了可以查询,修改集群状态的CRUD(Create,Read,Update,Delete),并将状态存储到etcd中。
API服务器除了提供一种一致的方式将对象存储到etcd,也对这些对象做校验,这样客户端就无法存入非法对象。
通过认证插件认证客户端,用户信息可以从客户端证书或者HTTP标头获取。插件抽取客户端的用户名,用户ID和归属组。
通过授权插件授权客户端,确认用户是否有权限执行操作。
通过准入控制插件验证资源请求
验证资源以及持久化存储
请求通过了所有的准入控制插件后,API服务器会验证存储到ETCD的对象,然后返回一个响应给客户端。
API服务器如何通知客户端资源变更。
API服务器没有做其他额外的工作。当你创建一个RS资源时,他不会去创建pod,同时它不会去管理服务的端点。那是控制器管理器的工作。
API服务器甚至没有告诉这些服务器去做什么。
调度器:
调度器做的就是通过API服务器更新pod的定义,然后API服务器再去通知kubelet。当目标节点上的kubelet发现该pod被调度到本节点,他就会创建并且运行pod的容器。
控制器:
API服务器只做了存储资源到ETCD和通知客户端有变更的工作。调度器只是给POD分配节点。控制器包括
控制器做了许多不同的事情,都通过API服务器监听资源(部署,服务),不论是创建新对象还是更新,删除已有对象,都对变更执行相应操作。
控制器执行一个"调和"循环,将实际状态调整为期望状态,然后将新的实际状态写入资源的status部分。
控制器之间不会直接通信,他们甚至不知道其他控制器的存在。
RC控制器自己不会去运行pod,会创建新的pod清单,发布到API服务器。让调度器和kubelet来做调度工作并运行pod。
在POD中,有应用容器和基础容器,