https://www.kubernetes.org.cn/kubernetes-pod

1、组件说明

image.pngimage.png
API Service:所有服务访问的统一入口
ControllerManager:维护副本的期望数目,一般为大于等于3的奇数
Scheduler:负责接受任务,选择合适的节点进行任务分配
ETCD:键值对数据库,储存k8s集群里所有的重要信息(持久化)
Kubelet:直接跟容器引擎(如Docker)交互,实现容器的生命周期管理
Kube-proxy:负责写入规则至IPTABLES、IPVS,以实现服务映射访问
Fluentd:主要负责日志收集、存储与查询
CoreDNS:可以为集群中的SVC创建一个域名IP的对应解析关系
Dashboard:给k8s集群提供一个B/S结构访问体系
Ingress Controller:官方只能实现4层代理,Ingress 可以实现7层代理
Federation:提供一个可以跨集群中心多k8s统一管理能力
Prometheus:提供k8s集群的监控能力
ELK:提供k8s集群日志统一分析介入平台

网络通讯方式

  • k8s的网络模型假定了所有的Pod都在一个可以直接连通的扁平网络空间中,这在GCE(Google Compute Engine)里是现成的网络模型,而在私有云里搭建k8s集群,就需要自己实现这个网络假设,将不同节点上的Docker容器之间的访问打通,然后运行k8s。

  • 同一个Pod内的多个容器之间:local host

    1. Pod之间的通讯:Overlay Network<br /> PodService之间的通讯:各节点的Iptableslvs)规则
  • Flannel让集群中不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址,并在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动传递到目标容器内。

  • ETCD为Flannel提供:1)存储管理Flannel可分配的IP地址段资源;2)监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由表。

image.png
同一个Pod内部通讯
共享一个网络命名空间,共享一个Linux协议栈
Pod1和Pod2位于同一台主机
由Docker0网桥直接转发请求至Pod2,不需要经过Flannel
Pod1和Pod2不在同一主机
Pod的地址与Docker0在同一网段,当Docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联可以让Pod互相访问。(Flannel)
Pod到Service
基于性能考虑,全部为iptables维护和转发
Pod到外网
Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执行Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求
外网访问Pod:Service
image.png