0%

Kubernetes架构

Kubernetes集群中分为两个部分

  • Kubernetes控制平面
  • 工作节点

控制平面负责存储管理集群状态、控制并使得整个集群正常运转,包含以下组件

  • etcd分布式持久化存储
  • API服务器
  • 调度器
  • 控制器管理器

工作节点上的组件包括

  • Kubelet
  • Kubelet服务代理(kube-proxy)
  • 容器运行时

除此之外还包括几个附加组件,包含

  • Kubernetes DNS 服务器
  • 仪表盘
  • Ingress 仪表器
  • Heapster(容器集群监控)
  • 容器网络接口插件

Kubernetes系统组件间只能通过API服务器进行通信,API服务器是和etcd通信的唯一组件,其他组件不会直接和etcd进行通信,而是通过API服务器来修改集群状态。

控制平面的组件以及kube-proxy可以直接部署在系统上或者作为Pod来运行。Kubelet是唯一一个作为常规系统组件来运行的组件,被部署在master节点上,它把其他组件作为pod来运行。

etcd

etcd是一个响应快、分布式的key-value存储,Kubernetes创建的所有对象(pod、ReplicationController等等)都持久化存储到etcd中。只有API服务器能够与etcd进行通信,所有组件都通过API服务器间接的读取和写入数据到etcd当中。etcd是Kubernetes存储集群状态和元数据唯一的地方。

为了保证高可用,常常会运行多个etcd实例,etcd使用raft算法保证一致性。

API服务器

Kubernetes API服务器作为中心组件,其他组件以及客户端(kubectl)都会调用API服务器。API服务器以restful API的形式提供了可以查询、修改集群状态的接口。API服务器负责将状态存储到etcd当中。

当接收到API请求后,API服务器内部会通过认证插件认证客户端、通过授权插件授权客户端、通过准入控制插件验证修改资源请求、验证资源以及持久化存储。

API服务器会启动控制器以及其他一些组件来监控已部署资源的变更。控制平面可以请求订阅资源被创建修改的通知,使得组件可以在集群元数据变化的时候能够执行任何需要做的任务。

客户端通过创建到API服务器的HTTP连接来监听变更,通过此连接,客户端会接收到监听对象的一系列变更通知。每当更新对象,服务器会把新版本对象发送到所有监听该对象的客户端。

调度器

调度器利用API服务器的监听机制等待新创建的pod,然后给每个新的没有节点的pod去分配节点。

控制器

控制器用于让系统的真实状态朝API服务器定义的期望的状态收敛,去完成具体资源的部署工作。

单个控制器、管理器进程当前组合了多个执行不同非冲突任务的控制器。这些控制器最终会被分解到不同的进程,控制器包括

  • Replication控制器
  • ReplicaSet,DaemonSet和Job控制器
  • Deployment控制器
  • StatefulSet控制器
  • Node控制器
  • Service控制器
  • Endpoints控制器
  • Namespace控制器
  • PersistentVolume控制器
  • 其他

kubelet

Kubelet是负责所有运行在工作节点上的内容的组件。它的第一个任务就是在API服务器创建一个Node资源来注册该节点,然后持续监控API服务器是否是否把该节点分配给pod,然后启动pod容器,告知容器运行时从特定容器镜像运行容器。Kubelet随后监控运行的容器,向API服务器报告它们的状态、时间和资源消耗。

Kubelet也是运行容器存活探针的组件,当探针报错时会重启容器。当pod从API服务器删除时,Kubelet负责终止容器,并通知服务器pod已经被终止。

Service Proxy

每个工作节点也会运行kube-proxy,确保客户端可以通过Kubernetes API连接到定义的服务。kube-proxy确保对服务IP和端口的连接最终能够到达支持服务的某个pod处。如果有多个pod支撑一个服务,那么代理会发挥对pod的负载均衡作用。