架构组成
和大多数分布式系统一样,Kubernetes 集群至少需要一个主节点(控制平面)和多个计算节点(计算平面)。
主节点(Master):主要用于暴露API,调度部署和节点的管理;
计算节点(Node):主要运行一个容器运行环境,一般是docker环境(类似docker环境的还有rkt);同时,也运行一个Kubernetes的代理(kubelet)用于和master通信;除此之外,计算节点也会运行一些额外的组件,像记录日志,节点监控,服务发现等。计算节点是k8s集群中真正工作的节点。
架构细分
Kubectl
客户端命令行工具,作为整个Kubernetes集群的操作入口。
Master 节点(默认不参加实际工作)
Api Server
在 Kubernetes 架构中承担的是“桥梁”的角色,作为资源操作的唯一入口,它提供了认证、授权、访问控制、API注册和发现等机制。客户端与k8s集群及K8s内部组件的通信,都要通过Api Server这个组件;
Controller Manager
负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;执行各种控制器,目前已经提供了很多控制器来保证Kubernetes的正常运行。
Replication Controller
:管理维护 Replication Controller,关联Replication Controller和Pod,保证 Replication Controller 定义的副本数量与实际运行的 Pod 数量一致。Deployment Controller
:管理维护Deployment,关联 Deployment 和 Replication Controller,保证运行指定数量的Pod。当 Deployment 更新时,控制实现 Replication Controller 和 Pod 的更新。Node Controller
:管理维护 Node,定期检查Node的健康状态,标识出(失效|未失效)的 Node 节点。Namespace Controller
:管理维护 Namespace,定期清理无效的 Namespace,包括 Namesapce 下的API对象,比如Pod、Service等。Service Controller
:管理维护 Service,提供负载以及服务代理。EndPoints Controller
:管理维护Endpoints,关联Service和Pod,创建Endpoints为Service的后端,当Pod发生变化时,实时更新Endpoints。Service Account Controller
:管理维护 Service Account,为每个 Namespace 创建默认的 Service Account,同时为 Service Account 创建 Service Account Secret。Persistent Volume Controller
:管理维护Persistent Volume和Persistent Volume Claim,为新的Persistent Volume Claim分配Persistent Volume进行绑定,为释放的Persistent Volume执行清理回收。Daemon Set Controller
:管理维护 Daemon Set,负责创建Daemon Pod,保证指定的Node上正常的运行Daemon Pod。Job Controller
:管理维护Job,为Jod创建一次性任务Pod,保证完成Job指定完成的任务数目。Pod Autoscaler Controller
:实现Pod的自动伸缩,定时获取监控数据,进行策略匹配,当满足条件时执行Pod的伸缩动作。
Schedule
为新建立的 Pod 进行节点(node)选择(即,分配机器),负责集群资源的调度,按照预定的调度策略将 Pod 调度到相应的 Node 节点上;
Etcd
担任数据中心的角色,保存了整个群集的状态;
Node 节点
Kubelet
负责维护容器的生命周期,同时也负责数据卷(Volume)和网络的管理,监控并上报节点资源使用情况。
Kubelet 是 Node 节点的代理,当Scheduler确定某个Node上运行Pod之后,会将Pod的具体信息(image,volume)等发送给该节点的Kubelet,Kubelet根据这些信息创建和运行容器,并向 Master 返回运行的状态。 同时,具备自动修复功能(如果某个节点中的容器宕机,它会尝试重启该容器,若重启无效,则会将该Pod杀死,然后重新创建一个容器)。
Kube-proxy
负责 Service Endpoint 到 POD 实例的请求转发及负载均衡的规则管理。
Service在逻辑上代表了后端的多个Pod。
当外界通过Service访问 Pod 提供的服务时,Service接收到的请求后就是通过kube-proxy来转发到 Pod 上的;
容器运行时环境(container-runtime)
负责本机的容器创建和管理工作;比如,Docker引擎。
Pod
Kubernetes 集群里面最小的单位。每个 Pod 里边可以运行一个或多个 Container (容器),如果一个Pod中有两个容器,那么容器的 USR(用户)、MNT(挂载点)、PID(进程号) 是相互隔离的, 而 UTS(主机名和域名)、IPC(消息队列)、NET(网络栈) 是相互共享的。