《Kubernetes网络权威指南》读书笔记 | 终于等到你:Kubernetes网络
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Kubernetes网络权威指南》读书笔记 | 终于等到你:Kubernetes网络相关的知识,希望对你有一定的参考价值。
书籍来源:《Kubernetes网络权威指南:基础、原理与实践》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客
Kubernetes网络包括网络模型、CNI、Service、Ingress、DNS等。
在Kubernetes的网络模型中,每台服务器上的容器有自己独立的IP段,各个服务器之间的容器可以根据目标容器的IP地址进行访问,如图3-4所示。
图3-4 Kubernetes网络模型概览
实现Kubernetes的容器网络重点需要关注两方面:IP地址分配和路由。
3.2.1 Kubernetes网络基础
下面简单介绍Kubernetes网络的基本概念和框架。
- IP地址分配
Kubernetes使用各种IP范围为节点、Pod和服务分配IP地址。
- 系统会从集群的VPC网络为每个节点分配一个IP地址。
- 系统会为每个Pod分配一个地址块内的IP地址。
- 系统会从集群的VPC网络为每项服务分配一个IP地址(称为ClusterIP)。
- Pod出站流量
Kubernetes处理Pod的出站流量的方式主要分为以下三种:
Pod到Pod
运行在Pod内的应用都可以使用标准的端口号,Pod之间可以保持三层网络的连通性。
Pod到Service
每台计算节点上都运行一个Kubeproxy进程,通过复杂的iptables/IPVS规则在Pod和Service之间进行各种过滤和NAT。
Pod到集群外
从Pod内部到集群外部的流量,Kubernetes会通过SNAT来处理。
3.2.2 Kubernetes网络架构综述
Kubernetes网络总体架构如图3-5所示。
图3-5 Kubernetes网络总体架构
具体过程如下:
(1)创建了一个Pod后,Kubelet调用CRI创建Pod内的若干个容器。
(2)第一个被创建的被称为pause容器,作用就是占用一个Linux的network namespace。
(3)Pod内其他用户容器通过加入这个network namespace的方式共享同一个network namespace。
(4)CNI主要负责容器的网络设备初始化工作,创建容器的eth0并分配IP,Pod内其他容器就使用这个IP与其他容器或节点进行通信。
3.2.3 Kubernetes主机内组网模型
Kubernetes经典的主机内组网模型是veth pair+bridge的方式。
Kubernetes使用veth pair将容器与主机的网络协议栈连接起来,从而使数据包可以进出Pod。容器放在主机根network namespace中veth pair的一端连接到Linux网桥,可让同一节点上的各Pod之间相互通信,如图3-6所示。
图3-6 Kubernetes bridge网络模型
3.2.4 Kubernetes跨节点组网模型
Kubernetes典型的跨机通信解决方案有bridge、overlay等。
Kubernetes的bridge跨机通信网络模型如图3-7所示。
图3-7 Kubernetes的bridge跨机通信网络模型
bridge网络本身不解决容器的跨机通信问题,需要显式地书写主机路由表,映射目标容器网段和主机IP的关系,集群内如果有N个主机,需要N-1条路由表项。
至于overlay网络,它是构建在物理网络之上的一个虚拟网络,其中VXLAN是主流的overlay标准。图3-8所示为典型的overlay网络的拓扑图。
图3-8 典型的overlay网络的拓扑图
和bridge网络类似,Pod同样接在Linux网桥上,目的地址落在本机Pod网段的网络包同样发给Linux网桥cni0。不同的是,这次是直接发给本机的tun/tap设备tun0,而tun0就是overlay隧道网络的入口。
3.2.5 Pod的hosts文件
与宿主机一样,容器也有/etc/hosts文件,用来记录容器的hostname和IP地址的映射关系。通过向Pod的/etc/hosts文件中添加条目,可以在Pod级别覆盖对hostname的解析。
当一个Pod被创建后,默认情况下,hosts文件只包含IPv4和IPv6的样板内容,例如localhost和主机名称。除了默认的样板内容,我们可能有向Pod的hosts文件添加额外的条目的需求,Kubernetes提供downward API,支持用户通过PodSpec的HostAliases字段添加这些自定义的条目,如下所示:
于是,Pod的hosts文件的内容类似如下:
建议通过使用HostAliases的方式进行修改,最主要的原因是该文件由Kubelet托管,用户修改该hosts文件的任何内容都会在容器重启或Pod重新调度后被Kubelet覆盖。
3.2.6 Pod的hostname
Pod之间主机名相互隔离,但Pod内容器分享同一个主机名。
一个Pod内如果有多个容器,修改任意一个容器的hostname都会影响其他容器,因为Pod共享UTS namespace。
容器重启带来的UTS namespace的改变也会导致hostname被覆盖。
以上是关于《Kubernetes网络权威指南》读书笔记 | 终于等到你:Kubernetes网络的主要内容,如果未能解决你的问题,请参考以下文章
《Kubernetes网络权威指南》读书笔记 | iptables
《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动
《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航
《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧