kubernetes2--pod的控制器、pod之间的网络通信

pod的概念
pod是一组容器的集合。多个容器放在一个池里,这个池就叫pod。pod可以分为两类,自主式pod和控制器管理的pod。自主式pod不被控制器管理(死了就没了,除了管理员再次启动),控制管理的pod有持续的声明周期,有控制器管理。

pod的控制器
RC、RS、Deployment、HPA、StatefulSet、DaemonSet、Job、Cronjob
RC:ReplicationController,用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代;而如果异常多出来的容器也会自动回收
RS:ReplicaSet和RC只是名字不同,并且RS支持集合式的slelctor
Deployment:自动管理ReplicaSet。无需担心跟其他机制不兼容问题,支持滚动更新(rollong-update)
Horzontal Pod Autoscaling:仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据pod的CPU利用率扩缩容,在V1alpha版本中,支持根据内存和用户自定一定metric扩缩容
StatefulSet:是为了解决有状态服务的问题而设计的,器应用场景包括:
1 稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
2 稳定的网络标志,即pod重新调度后其podName和HostName不变,基于HeadlessService(无头服务),即没有ClusterIP的Service来实现
3 有序部署,有序扩展。即pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到n-1,在下一个pod运行之前所有之前的pod必须是running和ready状态),基于init containers来实现
4 有序收缩,有序删除(即从n-1到0)
DaemonSet:确保全部或者一些node上运行着一个pod的副本。当有node加入集群时,也会为他们新增一个pod。当有node从集群中移除时,这些pod也会被回收。删除DaemonSet将会删除它创建的所有pod。
使用DaemonSet的一些典型用法:
1)运行集群存储的deamon。例如在每个node上运行glusterd、ceph
2)在每一个node上运行日志收集的daemon,例如fluentd、logstash
3)在每个node上运行监控daemon,例如Prometheus Node Exporter
Job:负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或者多个pod成功结束
CronJob:管理基于是时间的Job,即在给定时间点运行一次;周期性的爱给定时间点运行

pod的网络通讯方式
pause:pod中的第一个容器,它是为整个pod提供网络基础设施设定的,所以整体的NetworkSettings中也只有在pause容器中有锁设定,他负责的内容和init类似,包括基础网络设定的命名空间的共享,僵尸进程的处理
在这里插入图片描述

Flannel四CoreOS团队针对Kubernetes设计的一个网络规划服务,他的功能是让集群中的不同节点的Docker容器中都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个副高(Overlay Network),通过这个覆盖网络,将数据包原封不动的传递到目标容器内
在这里插入图片描述
同一个pod内部通信:同一个pod共享同一个网络命名空间,共享同一个linux协议栈(调用频繁的应用放到同一个pod里,例如nginx和php-fpm)
pod1和pod2通信:pod1和pod2在同一台机器,由docker0网桥直接转发请求至pod2,不需要经过flannel
pod1和pod3通信:pod1和pod3不在同一台主机,pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP地址,并且不同node之间的通信只能通过宿主机的物理网卡进行。将pod的IP和所在node的IP关联起来,通过这个关联让pod可以互相访问(fannel、etcd、数据包的二次封装转发实现)
pod至service的网络:目前基于性能考虑,全部为iptables维护和转发
pod到外网:pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执性Masquerade,把源IP更改为宿主网卡IP,然后向外网服务器发送请求

猜你喜欢

转载自blog.csdn.net/qq_51574197/article/details/113734145