概述
kubernetes是一个开源的容器编排系统,可实现容器化应用程序的自动部署、水平扩展和管理。kubernetes集群是master/nodes
的架构,master是管理节点,一般由3个节点组成,nodes节点称为工作节点,节点要多至上千个。
组件
更详细的请参考官方文档: https://kubernetes.io/zh/docs/concepts/overview/components/
master节点上的组件: API Server,Scheduler,Controller-Manager
-
API Server: 它提供了各类资源的增、删、改、查以及watch等的接口,是整个kubernetes系统的中心。如Pod、Replication Controller、Service等资源。
-
Scheduler: 调度器,默认调度器为kube-scheduler,调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod,调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。
- Controller-Manager: 控制管理器,Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。k8s中有许多Controller,如:Replication Controller,Node Controller, Namespace Controller, Token Controller, Service Controller等,这些控制器保证集群内的资源保持预期状态,而Controller Manager则管理这些Controller的状态。
node节点上的组件: kubelet, 容器运行时(一般指docker引擎),kube-proxy
-
kubelet: kubelet是在每个Node节点上运行的主要 “节点代理”
-
kube-proxy: kube-proxy是每个Node节点上运行的网络代理,它作为附件(addons)运行,自托管在kubernets上,
帮忙负责生成iptabels或ipvs规则,kubenetes1.11版本后(包含1.11)默认使用ipvs,之前的版本默认使用iptables。 - 容器运行时:负责运行容器的软件,一般是docker引擎
Pod
kubernetes管理和调度的最小单位是Pod
,这只是一个逻辑上的概念,一个pod是运行一个或多个应用容器,Pod中的每个容器共享网络名字空间。
在node节点上把关系比较紧密的容器打上标签归成一类pod,然后通过Label Selector
对打上的标签进行过滤,这样node节点就能利用标签选择器来选择出我们需要的一类容器。
Pod分类:
第一类. 自主式Pod
用户向API Server发送创建一个Pod的请求,通过Scheduler选择一个node后向kubelet发送任务,kubelet并创建好相应的Pod,当该node宕机后,该Pod从集群中消失,不能自动迁移到其他node。
第二类. 控制器管理的Pod
ReplicationController,简称RC,副本控制器,它能实现始终按照用户指定的目标状态,在node上运行指定个数的Pod,当其中某个Pod因故障被kill后,能自动寻找合适的node,在其上运行相应的Pod,始终能保证指定个数的Pod数量。它还能实现Pod的滚动更新,并能实现回滚操作。
ReplicaSet,简称RS, 副本控制器:
一般不直接使用,它有一个声明式的控制器,叫Deployment
Deployment控制器,只能管理无状态应用,Deployment还支持二级控制器,叫HPA(HorizontalPodAutoscaler),水平自动伸缩控制器,能实现自动扩容和缩容
StatefulSet 有状态副本集控制器,管理有状态应用
DaemonSet控制器,在每个node上运行一个副本时使用
Job 作业控制器,
Ctonjob 周期性作业控制器:
Service
Pod是有生命周期的,一个Pod随时都有可能被杀掉,也随时可能有Pod被创建,所以客户端程序要想访问Pod中容器提供的服务,kubernetes引入了一个中间层service,工作在Pod之上,客户端程序直接访问service,只要service不被删除,那IP地址就固定,service作为服务访问的入口。
service是靠标签选择器来关联Pod的,只要标签相同就被关联。service不是什么应用程序,也不是实体组件,它只是一个iptables的一个DNAT规则,如果service后端的Pod是个时,iptables的DNAT就是多目标的负载均衡转发,在kubernetes的1.11版中此种功能已使用ipvs(LVS)来实现。
网络
kubernetes集群需要三个网络,物理主机网卡所在网络称为主机节点网络
,service上有个IP地址,此IP地址是虚拟的,只存在于iptables或ipvs中,此网络称为service网络
,Pod所在网络称为pod网络
通信
同一个Pod内的多个容器共享网络名称空间,可以使用lo回环地址通信
各Pod之间通信通过隧道转发报文来实现叠加网络(Overlay Network) 来通信
Pod与Service之间通信是通过iptables或ipvs规则调度
CNI
Container Network Interface,容器网络接口API。
实现CNI的组件:
- flannel:支持网络配置,不支持网络策略
- calico: 支持网络配置,也支持网络策略
- canel: 是flannel与calico的结合体,支持网络配置和网络策略