《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网络的基本概念和框架。

  1. IP地址分配

Kubernetes使用各种IP范围为节点、Pod和服务分配IP地址。

  • 系统会从集群的VPC网络为每个节点分配一个IP地址。
  • 系统会为每个Pod分配一个地址块内的IP地址。
  • 系统会从集群的VPC网络为每项服务分配一个IP地址(称为ClusterIP)。
  1. Pod出站流量

Kubernetes处理Pod的出站流量的方式主要分为以下三种:

PodPod

运行在Pod内的应用都可以使用标准的端口号,Pod之间可以保持三层网络的连通性。

PodService

每台计算节点上都运行一个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 Podhosts文件

与宿主机一样,容器也有/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 Podhostname

Pod之间主机名相互隔离,但Pod内容器分享同一个主机名。

一个Pod内如果有多个容器,修改任意一个容器的hostname都会影响其他容器,因为Pod共享UTS namespace。

容器重启带来的UTS namespace的改变也会导致hostname被覆盖。

以上是关于《Kubernetes网络权威指南》读书笔记 | 终于等到你:Kubernetes网络的主要内容,如果未能解决你的问题,请参考以下文章

《Kubernetes网络权威指南》读书笔记 | iptables

《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动

《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航

《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧

《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN

《Kubernetes网络权威指南》读书笔记 | 主角登场:Linux容器