
开局一幅图,内容全靠编
其实学习Kubernetes就是几个组件,无非就就是kubelet、kubectl、API Server、Scheduler、Controller-Manager、ETCD、kube-proxy,还有就是域名解析组件CoreDNS,网络组件Flannel和Calico、IPtables,和网格组件istio,监控Prometheus,存储组件NFS、Gluster,再者就是各种资源如...
emm那些都是后话,主要还是上面架构图这几个组件,别看这么多,其实,还有更多。
这几个都是比较核心的组件,想学好Kubernetes,就必须理解清楚,最好是能默写出来,当然不是真的靠背出来那种。
Kubernetes
关于Kubernetes的概念,这里就不再赘述了,就是一些组件组成的容器管理工具,功能非常强大,包括自动化装箱、自动恢复、扩缩容、负载均衡、灰度发布、版本回滚、存储编排等功能。
所以这些组件就显得尤为重要了,这里就来简单介绍一下。
组件
1、kubectl
kubectl是Kubernetes的一个与用户交互的客户端命令行工具,负责传递请求,用户可以通过kubectl把一系列集群的请求命令传递给master,master接收到请求后就开始处理请求。
当然也可以通过Web端、KubeSphere端的请求,但是其实底层的请求方式就是通过kubectl实现的。
2、Master Node
Master Node是Kubernetes的主节点,主节点一般不作为工作节点,就是不运行业务容器,只运行着一些重要组件,如Api Server、Scheduler、Controller-manager等,这些组件一旦挂了,整个集群可能就访问不了了。所以一般不在Master节点上部署其他容器。
上图的Master Node只有一个,但是生产环境最好是集群形式的Master Node,这样才能实现高可用,以防出现Master Node的单点故障。
3、Work Node
Work Node,顾名思义就是工作节点,就是用来工作的,工具人。一个Master节点可以带着多个Worker节点,Worker节点就是处理请求的节点,
Master只管分配,分配到哪个Worker就是哪个Worker来部署这个容器,Master相当于董事会,Worker就是一群工具人。

4、Api Server
Api Server是Kubernetes中一个非常非常重要的组件,这句话我只讲一遍。
怎么个重要法呢?
Api Server是访问整个集群的唯一入口,所有组件都必须通过APIServer提供的API来操作资源数据,如果这个组件挂了,整个集群就访问不到了,所有请求都处理不了了。
ApiServer主要负责处理请求使之生效,并把对象或结果等相关信息更新到ETCD中,并且也只能是APIServer能跟ETCD交互。并且,APIServer还要有监控、API版本控制、API注册和发现等功能。
另外,APIServer 也是集群的网关,一般客户端通过APIServer对集群进行访问时需要通过认证,这个认证就是APIServer来做,APIServer就是访问Node和Pod的代理。
5、Scheduler
Scheduler,翻译为调度器,主要作用就是任务调度。
APIServer接到请求后,并不是由APIServer直接分配调度任务的,而是通过Scheduler来处理。
Scheduler会监测、收集和分析当前集群中所有节点的资源情况,根据请求资源的大小、顺序、是否可用等一系列约束条件来查找并分配到合适的Worker Node上。

调度主要过程:
-
预选Node(没有合适Node):遍历集群中所有的Node,按照具体的预选策略筛选出符合要求的Node列表。如没有Node符合预选策略规则,该Pod就会被挂起,直到集群中出现符合要求的Node。 -
优选Node(有一个或以上的合适Node):预选Node列表的基础上,按照优选策略为待选的Node进行打分和排序,从中获取最优Node。
PS:如果没有足够的资源或合适的条件,Pod不会被调度。
6、Controller-Manager
Controller-Manager是集群的管理中心,实现集群的故障检测和恢复的自动化工作,还有扩缩容,这也是Kubernetes的主要功能之一。
主要负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,定期监测,如保证各个命名空间下的资源或某个service下挂载的pod跟实际运行的相对应。
7、kubelet
kubelet相当于Node上工具人,APIServer负责接活,而kubelet负责干活,主要是负责Node节点Pod的增删改查、监控等。
kubelet可以当成APIServer与Node节点之间的桥梁,负责处理APIServer接收到的请求,当然kubelet也不直接和ETCD交互,而也是通过APIServer。
8、kube-proxy
kube-proxy是一个外部网络访问集群内跨节点的容器内部服务的代理,所以会运行在每个节点上。
kube-proxy提供TCP/UDP的代理,每当创建一个Service,kube-proxy就会从ETCD中获取Service和Endpoints的配置信息,根据配置信息创建一个kube-proxy进程并监听对应的服务端口,当接到外部请求时,kube-proxy会根据随机、轮询等算法把请求发到对应的容器。
9、Pod
Pod是kubernetes集群里的最小管理单位,里面可以包含多个容器,这些容器共享存储、网络、命名空间等。
在Pod中,所有容器都被统一安排和调度,并运行在共享的上下文中,对于具体应用而言,Pod就相当于容器中的应用的逻辑主机,而容器就相当于虚拟机。
另外,每一个Pod都会被指派一个唯一的ip地址,在Pod中的每一个容器共享网络命名空间,包括ip和端口。
10、ETCD
ETCD是一个跟Zookeeper类似的key-value型的键值对数据库,天生集群化高可用,也是通过Raft算法保持系统数据的CP和强一致性,也有一个watch的功能。
ETCD在kubernetes中不仅作为数据库存储着资源的信息,同时它还有集群的 服务发现、配置中心、集群监控等功能。
ETCD只和APIServer交互,其他组件只能通过APIServer来间接和ETCD交互。
需要注意的是watch功能,这个功能厉害了,可以理解为监控,Scheduler、Controller-Manager、kubelet等组件都需要通过watch来实现监测变化并及时作出响应。
10、Docker
顺别提一嘴Docker,毕竟新版本的Kubernetes已经放弃了Docker作为基础容器组件。
Docker架构图如上所示,Docker组件繁多,其实Kubernetes用到的主要就是红色框框部分,Kubernetes和Docker交互时需要通过上层的Docker Engine,性能差了还不好维护和迭代,每当Docker升级了Docker Engine后Kubernetes就需要做相应的调整,吃力不讨好,因此Docker也就慢慢被其他更加轻量便捷的方案替换。
总结:
简单来说,就是一堆组件完成了一堆功能,包括治愈、弹性伸缩、服务注册与发现、负载均衡、滚动升级、一键回滚等,方便快捷,运维的天堂,男人的加油站。
所以搞定这堆组件就能搞掂Kubernetes。
组件比较多,各司其职,理解就好办了,不是要求死记硬背,而是理解为什么要这样做,关键是理解。