Master/Node Master::API-Server, Scheduler, 和 Controller-Manager(分别运行为三个守护进程) Node:Kubelet(负责与集群的API-Server通信),docker(容器引擎,容器运行时),Kube-Proxy(负责和API-server通信,并且动态管控service) (虽说K8s的最小逻辑运行单元是Pod,但是实际运行的还是容器。) 元数据信息之一: Label:key=value Label selector
Pod类型: 1,自主式pod;(自我管理),节点宕机,则pod消失; 2,控制器管理的pod,有生命周期的对象;
Pod控制器: 早期版本的控制器:ReplicationController(精确控制Pod的副本数量,多退少补;支持滚动更新和回滚) 新版控制器:ReplicaSet,声明式控制器 Deployment(管理无状态应用) 二级控制器HPA(HorizontalPodAutoscaler),水平pod自动伸缩控制器; StatefulSet(管理有状态应用) DaemonSet(每一个Node,只能运行一个副本) Job(作业,如备份,清理等) CronJob(定期周期性作业)
虽说Pod是有生命周期的,但是服务service是永久的,即是服务发现入口,将服务请求代理至后端pod; 每一组提供同类服务的pod,都有一个中间层叫做service,本质上是IPtables的DNAT规则,但是无法ping通,service的名称可以被DNS解析; Service和后面的服务pod实例,是通过标签选择器(label selector)来进行关联; Kubernetes v1.11版之后,IPtables规则已经改成IPVS了。负载均衡大多由IPVS承载;一个service,就会生成一个IPVS规则; 每一个Pod可以理解为一个小的虚拟机; 举例: NMT(Nginx,Mysql,Tomcat)中的N(service)只需要开放给外部访问,M和T则不需要; 访问链路:外部调度器(如果节点没有公网地址,只有私网地址,就需要外部调度器)–>物理服务器(节点)的地址(集群可达边界)–>Nginx的service;(三次转发) 公有云(阿里云,AWS)的Load Balancer;(LBaaS)
Addons(附加组件): DNS:CoreDNS,负责集群内部的域名解析,也是一个pod; 监控:Heapster+Grafana或者Prometheus;
K8s三层网络: 第一层:节点网络; 第二层:Service(集群)网络:(只存在于IPtables规则中,是虚拟的,假的,不能ping通) (注:pod网络地址和service网络地址处于不同网段) 第三层:Pod网络;(可以ping通)
K8s集群内的三种通信: 1,同一个pod内的多个容器间通信:lo(本地服务器) 2,各pod之间的通信:(每一个docker主机都有一个docker0桥,docker0桥的IP地址:172.17.0.1)在同一个网段,地址不能冲突,且可以直接通信;(二层网络可以通过物理网络直接通信,客户端的pod不需要做SNAT,服务端的pod也不需要做DNAT。) 通过Overlay Network,二层或者三层叠加网络,直接转发二层报文或者通过隧道转发三层报文; (注意:设定docker0桥只能使用某个固定子网;) 3,pod与service之间的通信;(每一个node上都要有IPtables或者IPVS规则) 如果容器访问service地址,需要先将请求送到网关(docker0桥的地址),然后根据IPtables规则查询即可;
4,Pod与集群外的客户端通信;
K8s的master主机共享存储ETCD(K8s DB),键值存储(类似redis),支持Raft协议(实现leader选举,更像ZK); ETCD用于存储整个集群的状态信息;需要做高可用;Restful风格集群,通过Https通信; 和ElasticSearch一样(一个对内通信端口和一个对外通信端口),ETCD的端口2380,用于集群内部通信,需要一套点对点通信CA和一套签署的证书;端口2379,用于向客户端(API-server)提供服务,需要另外一套CA和一套加密证书; API-server向客户端(每个node上的Kubelet和kube-proxy)提供服务,各需要一套CA和一套证书; (搭建一个Kubernetes集群,至少5套CA—服务端证书,客户端证书) 三类节点:API-Server,ETCD,Node;(彼此之间通过HTTPs通信)
外部三方网络服务解决方案:至少需要解决Pod网络和service网络; CNI,需要共享节点的网络名称空间,以容器的方式来行系统管理之实; (CNI是一种特殊的pod,可以托管到K8s之上,作为容器运行或者作为节点上的系统级守护进程运行;) 网络策略(Network Policy),主要是为了定位名称空间之间或者名称空间里pod之间是否能够相互访问的策略; Flannel,只是网络功能或者网络配置IP地址管理;叠加网络; 特点:简单,不支持网络策略;(CoreOS) Calico,网络功能(IP)+网络配置(IPAM)+网络策略(Network Policy),有Calico IPIP的三层隧道网络,也有Calico BGP,使用BGP协议直接路由通信; 特点:复杂,但是支持网络策略; Canel:Calico+Flannel; …… K8s网络名称空间;(多租户,提供管理边界)
K8s简化安装部署工具: GitHub K8s Ansible playbook Kubeadm安装部署+kubelet,组件的镜像都托管在gcr.io当中;(这个地址需要科学上网技能) Mini-kube,模拟Kubernetes环境,适用于开发人员,可以做简单的测试。
|