Kubernetes 容器网络模型和典型实现( 二 )
本文插图
Pod-to-Service networking
【Kubernetes 容器网络模型和典型实现】K8s Service 管理服务的 Pods 状态 , 在 Pod 有变化下管理对应 IP 的变化 , 并管理对外提供服务的 Virtual IP 到 Pod IPs 路由访问 , 实现外部对服务 Virtual IP 的访问路由到 Pod IP , 以此屏蔽外部对服务后端的实现形态 。 所以在服务创建时 , 会对应生成一个 Virtual IP(也即是 Cluster IP) , 任何对该 Virtual IP 的访问将打散路由到服务所属的 Pods 上 。
K8s 的服务是如何实现对 Virtual IP 的访问负载均衡呢?答案是 netfilter 和 iptables 。 netfilters 是 Linux built-in networking framework , 为 Linux 提供网络包过滤、NAT 和 Port translation 等丰富的自定义 handler 实现 。 iptables 是运行在 Linux user-space 的规则管理系统 , 为 netfilter 框架提供丰富的包转发规则管理 。
在 K8s 实现中 kube-proxy(node deamon)通过 watch apiserver 来获得服务配置的变化 , 比如 , 服务的 Virtual IP 变化、Pod IP 变化(ie, pod up/down) 。 iptables 规则随之变化并将请求路由到服务对应的 Pod 上 , Pod IP 选取是随机的 , 这样看 iptables 起到了 Pod 负载均衡作用 。 在访问请求 Return path 上 , iptables 会做一次 SNAT 以替换 IP header 的 Pod IP 为服务 Virtual IP , 这样使得 Client 看起来请求仅在服务 Virtual IP 上进行通讯 。
从 K8S v1.11 中 IPVS(IP Virtual Server)被引入成为第二种集群内负载均衡方式 。 IPVS 同样也是构建基于 netfilter 之上 , 在创建服务定义时可指定使用 iptables 或 IPVS 。 IPVS 是特定适合于服务负载均衡的解决方案 , 提供了非常丰富的均衡算法应用场景 。
使用 DNS
每个服务会设置一个 DNS 域名 , kubelets为每个容器进行配置--cluster-dns=<dns-service-ip> , 用以解析服务所对应 DNS 域名到对应的 Cluster IP 或 Pod IP 。 1.12 后 CoreDNS 成为缺省 DNS 方式 。 服务支持 3 种类型 DNS records(A record、CNAME、SRV records) 。 其中常用的是 A Records , 比如 , 在cluster.local的 DNS name 下 , A record 格式如pod-ip-address.my-namespace.pod.cluster.local , 其中 Pod hostname和subdomain 字段可以设置为标准的 FQDN 格式 , 比如 , custom-host.custom-subdomain.my-namespace.svc.cluster.local
CNI
容器网络模型在实现上是由 K8s 的节点 Pod 资源管控(kubelet)和遵从 Container Networking Interface(CNI)标准的插件共同协作完成的 。 CNI 插件程序在其中充当了''胶水''作用:各种容器网络实现能在一致的操作接口下由 kubelet 统一管控调度 。 另外 , 多个容器网络也能共存于一个集群内 , 为不同 Pod 的网络需求提供服务 , 都是在 kubelet 的统一管控下完成 。
Overlay networking: Flannel
Flannel 是 CoreOS 为 K8s networking 开发的解决方案 , 也是阿里云 ACK 产品支持的容器网络解决方案 。 Flannel 的设计原理很简洁 , 在 host 网络之上创建另一个扁平网络(所谓的 overlay) , 在其上地址空间中给每个 pod 容器设置一个 IP 地址 , 并用此实现路由和通讯 。
主机内容器网络在 docker bridge docker0上完成通讯 , 不再赘述 。 主机间通讯使用内核路由表和 IP-over-UDP 封装进行实现 。 容器 IP 包流经 docker bridge 会转发到flannel0网卡(TUN)设备上 , 进而流入到flanneld进程中 。 flanneld会对 packet 目标 IP 地址所属的网段信息查询其对应的下一跳主机 IP , 容器子网 CIDR 和所属主机 IP 的映射(key-value)保存在 etcd 中 , flanneld查询得到 packet 目标 IP 所属的主机 IP 地址后 , 会将 IP packet 封装到一个 UDP payload 中并设置 UDP packet 目标地址为所得到的目标主机 IP , 最后在 host 网络中发送出 UDP packet 。 到达目标主机后 , UDP packet 会流经flanneld并在这里解封出 IP packet , 再发送至flannel0、docker0最后到达目标容器 IP 地址上 。 下图示意流程:
推荐阅读
- 直播阳江|60多个网络平台直播刀博会网上展览会开幕式盛况
- 红途网络乔钰|英国主动退回被“诅咒”文物:巴比伦的千年“石鼓”回到伊拉克
- 红途网络美玉|发行货币,晚年穷困潦倒只剩5美元,美国历史上唯一的皇帝
- 大众网|| 网络名人说 @江氏小盗龙,科创发展看淄博
- 周到|“四叶草”实现5G网络全覆盖 网络容量提升约1.5倍
- 外交部网站|外交部:美国所谓“清洁网络”是“肮脏网络”
- 网络游戏|魔兽怀旧服咸鱼剑近战该如何选择,盗贼和狂暴战谁更适合呢
- 大众网|| 网络名人说 @小天微谈,科创发展看淄博
- 网络|周边均有发生!几万块打水漂!警方提醒,远离网络刷单...
- 央视新闻客户端|云南警方摧毁特大贩毒网络 缴获毒品17.5公斤 抓获犯罪嫌疑人14人
