跳转至

Kubernetes网络权威指南:基础、原理与实践-杜军

  •  Kubernetes网络权威指南:基础、原理与实践|200
  • 书名: Kubernetes网络权威指南:基础、原理与实践
  • 作者: 杜军
  • 简介: 本书是容器与Kubernetes网络的基础和进阶书籍,旨在让更多人了解和学习云原生时代的底层网络模型与实现机制,指导企业在落地云原生时的网络方案选型。全书包括:容器网络虚拟化基础、Docker容器网络、Kubernetes网络和Istio网络4部分,共6章。第1章容器网络虚拟化基础将支撑容器网络的内核技术娓娓道来。第2章简单介绍了Docker原生的容器网络能力。Kubernetes网络分为3章,第3章介绍Kubernetes网络的基础概念和使用,第4章为读者剖析了Kubernetes网络的底层实现原理,第5章详解了业界主流的Kubernetes网络插件。Istio网络总共1章,重点解析Istio网络流量管控的背后机制。
  • 出版时间 2019-10-01 00:00:00
  • ISBN: 9787121373398
  • 分类: 计算机-计算机综合
  • 出版社: 电子工业出版社

高亮划线

1.4 给用户态一个机会:tun/tap设备

  • 📌 tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装 ^9-777-824

    • ⏱ 2023-02-28 11:54:54
  • 📌 tap设备与tun设备的工作原理完全相同,区别在于:·tun设备的/dev/tunX文件收发的是IP包,因此只能工作在L3,无法与物理网卡做桥接,但可以通过三层交换(例如ip_forward)与物理网卡连通;·tap设备的/dev/tapX文件收发的是链路层数据包,可以与物理网卡做桥接。 ^9-2309-2511

    • ⏱ 2023-02-28 12:02:50

1.8 物理网卡的分身术:Macvlan

  • 📌 通常,我们在自定义Docker与外部网络通信的网络时会用到NAT,还有Linux bridge、Open vSwitch、Macvlan几种选择,相比之下,Macvlan拥有更好的性能。 ^13-726-819

    • ⏱ 2023-02-28 14:19:24
  • 📌 需要注意的是,使用Macvlan的虚拟机或者容器网络与主机在同一个网段,即同一个广播域中。 ^13-1458-1503

    • ⏱ 2023-02-28 14:22:24

2.3 最常用的Docker网络技巧

  • 📌 容器中的DNS和主机名一般通过三个系统配置文件维护,分别是/etc/resolv.conf、/etc/hosts和/etc/hostname,其中:·/etc/resolv/conf在创建容器的时候,默认与本地主机/etc/resolv.conf保持一致;·/etc/hosts中则记载了容器自身的一些地址和名称;·/etc/hostname中记录容器的主机名。用户如果直接在容器内修改这三个文件会立即生效,但容器重启后修改又会失效。如果想统一、持久化配置所有容器的DNS,通过修改主机Docker Daemon的配置文件(一般是/etc/docker/daemon.json)的方式指定除主机/etc/resolv.conf的其他DNS信息: ^17-3958-4396
    • ⏱ 2023-02-23 14:48:25

2.5 天生不易:容器组网的挑战

  • 📌 ·出于安全考虑,很多情况下容器会被部署在虚拟机内部,这种嵌套部署对应一个新的组网模型 ^19-1814-1856

    • ⏱ 2023-02-23 15:00:28
  • 📌 针对以上挑战,有一些针对性的解决方案。例如,可以使用Macvlan和IPvlan替代veth,以降低处理veth网络的性能开销。当使用IPvlan驱动时,IPvlan工作在L3,而L3网络不会受到洪泛影响,因此只有主机的物理网卡MAC地址可见,容器MAC地址不会暴露在网络中,从而解决数据中心可见MAC地址过多给ToR交换机带来的影响。 ^19-2741-2909

    • ⏱ 2023-02-23 15:02:38
  • 📌 消除NAT的第二种方法是把主机变成全面的路由器,甚至是使用BGP的路由器 ^19-3236-3272

    • ⏱ 2023-02-23 15:03:37
  • 📌 如果对相对成熟的第三方容器解决方案进行分类,则大致可以分为隧道方案和路由方案 ^19-5633-5671

    • ⏱ 2023-02-23 15:14:43

2.6 如何做好技术选型:容器组网方案沙场点兵

  • 📌 当前主流的容器网络虚拟化技术有Linux bridge、Macvlan、IPvlan、Open vSwitch、flannel、Weave、Calico等 ^20-427-504

    • ⏱ 2023-02-23 15:15:30
  • 📌 而容器网络最基础的一环是为容器分配IP地址,主流的方案有本地存储+固定网段的host-local,DHCP,分布式存储+IPAM的flannel和SDN的Weave等。 ^20-505-589

    • ⏱ 2023-02-23 15:16:17
  • 📌 任何一个主流的容器组网方案无非就是网络虚拟机+IP地址分配,即Linux bridge、Macvlan、IPvlan、Open vSwitch、flannel、Weave、Calico等虚拟化技术和host-local、DHCP、flannel、Weave任取两样的排列组合 ^20-618-755

    • ⏱ 2023-02-23 15:16:30

3.2 终于等到你:Kubernetes网络

  • 📌 为了实现这一目标,重点解决以下两点:·各台服务器上的容器IP段不能重叠,所以需要有某种IP段分配机制,为各台服务器分配独立的IP段;·从某个Pod发出的流量到达其所在服务器时,服务器网络层应当具备根据目标IP地址,将流量转发到该IP所属IP段对应的目标服务器的能力。总结起来,实现Kubernetes的容器网络重点需要关注两方面:IP地址分配和路由。 ^22-927-1189

    • ⏱ 2023-02-23 15:53:27
  • 📌 Kubernetes通过Kube-proxy组件实现这些功能,每台计算节点上都运行一个Kubeproxy进程,通过复杂的iptables/IPVS规则在Pod和Service之间进行各种过滤和NAT。 ^22-2325-2425

    • ⏱ 2023-02-23 15:56:35
  • 📌 从Pod内部到集群外部的流量,Kubernetes会通过SNAT来处理。SNAT做的工作就是将数据包的源从Pod内部的IP:Port替换为宿主机的IP:Port。当数据包返回时,再将目的地址从宿主机的IP:Port替换为Pod内部的IP:Port,然后发送给Pod。当然,中间的整个过程对Pod来说是完全透明的,它们对地址转换不会有任何感知。 ^22-2493-2664

    • ⏱ 2023-02-23 15:57:32
  • 📌 总体而言,集群内访问Pod,会经过Service;集群外访问Pod,经过的是Ingress ^22-3158-3203

    • ⏱ 2023-02-23 15:58:37

3.3 Pod的核心:pause容器

  • 📌 在Kubernetes中,pause容器被当作Pod中所有容器的“父容器”,并为每个业务容器提供以下功能:·在Pod中,它作为共享Linux namespace(Network、UTS等)的基础;·启用PID namespace共享,它为每个Pod提供1号进程,并收集Pod内的僵尸进程。 ^23-1223-1425

    • ⏱ 2023-02-23 16:40:34
  • 📌 它执行另一个重要的功能——即它扮演PID 1的角色,并在子进程成为“孤儿进程”的时候,通过调用wait()收割这些僵尸子进程。这样就不用担心我们的Pod的PID namespace里会堆满僵尸进程了。 ^23-1900-2000

    • ⏱ 2023-02-23 16:42:44
  • 📌 在Kubernetes中使用PID namespace共享/隔离 ^23-6751-6783

    • ⏱ 2023-02-23 17:23:26

3.5 找到你并不容易:从集群内访问服务

  • 📌 Service的几个port的概念很容易混淆,它们分别是port、targetPort和NodePort。 ^25-6929-6982

    • ⏱ 2023-02-23 17:37:12
  • 📌 port表示Service暴露的服务端口,也是客户端访问用的端口 ^25-7011-7043

    • ⏱ 2023-02-23 17:37:21
  • 📌 NodePort是Kubernetes提供给集群外部访问Service入口的一种方式(另一种方式是Load Balancer),所以可以通过Node IP:nodePort的方式提供集群外访问Service的入口 ^25-7227-7333

    • ⏱ 2023-02-23 17:37:37
  • 📌 需要注意的是,我们这里说的集群外指的是Pod网段外,例如Kubernetes节点或因特网。 ^25-7334-7379

    • ⏱ 2023-02-23 17:37:58
  • 📌 targetPort很好理解,它是应用程序实际监听Pod内流量的端口,从port和NodePort上到来的数据,最终经过Kube-proxy流入后端Pod的targetPort进入容器。 ^25-7408-7501

    • ⏱ 2023-02-23 17:37:55
  • 📌 乞丐版的Load Balancer类型Service ^25-10179-10205

    • ⏱ 2023-02-23 17:47:40
  • 📌 群内/外部可基于集群内任何一个节点的IP:NodePort的形式访问Service ^25-10359-10400

    • ⏱ 2023-02-23 17:48:08
  • 📌 NodePort支持TCP、UDP、SCTP,默认端口范围是30000-32767,Kubernetes在创建NodePort类型Service对象时会随机选取一个 ^25-10401-10483

    • ⏱ 2023-02-23 17:48:21
  • 📌 在一般情况下,不建议用户自己指定NodePort,而是应该让Kubernetes选择,否则维护的成本会很高。 ^25-11767-11821

    • ⏱ 2023-02-23 17:49:27

3.6 找到你并不容易:从集群外访问服务

  • 📌 在Kubernets中,L7的转发功能、集群外访问Service,都是专门交给Ingress的 ^26-798-845
    • ⏱ 2023-02-23 18:02:23

3.8 Kubernetes网络策略:为你的应用保驾护航

  • 📌 Kubernetes的解决方案是Network Policy,即网络策略。 ^28-655-692

    • ⏱ 2023-02-24 10:17:35
  • 📌 网络策略作为Pod网络隔离的一层抽象,用白名单实现了一个访问控制列表(ACL),从Label Selector、namespace selector、端口、CIDR这4个维度限制Pod的流量进出。 ^28-1078-1176

    • ⏱ 2023-02-24 10:18:22

5.3 Kubernetes网络插件鼻祖flannel

  • 📌 根据不同的封包方式,flannel提供了UDP和VXLAN两种传输方法。UDP封包使用了flannel自定义的一种包头协议,数据是在Linux的用户态进行封包和解包的,因此当数据进入主机后,需要经历两次内核态到用户态的转换。VXLAN封包采用的是内置在Linux内核里的标准协议,因此虽然它的封包结构比UDP模式复杂,但所有的数据装、解包过程均在内核中完成,实际的传输速度要比UDP模式快许多 ^36-1404-1600
    • ⏱ 2023-02-28 10:07:36

读书笔记

本书评论