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环境,适用于开发人员,可以做简单的测试。