【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

深入浅出 Kubernetes 理论篇 (二):网络详解

  • 2020-03-30
  • 本文字数:2402 字

    阅读完需:约 8 分钟

深入浅出Kubernetes 理论篇 (二):网络详解

简介:阿里云 Kubernetes 集群网络目前有两种方案,一种是 flannel 方案,另外一种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似,不同的地方在于,terway 支持 Pod 弹性网卡,以及 NetworkPolicy 功能。


阿里云 Kubernetes 集群网络目前有两种方案,一种是 flannel 方案,另外一种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似,不同的地方在于,terway 支持 Pod 弹性网卡,以及 NetworkPolicy 功能。


今天这篇文章,我们以 flannel 为例,深入分析阿里云 Kubernetes 集群网络的实现方法。我会从两个角度去分析,一个是网络的搭建过程,另外一个是基于网络的通信。我们的讨论基于当前的 1.12.6 版本。

鸟瞰

总体上来说,阿里云 Kubernetes 集群网络配置完成之后,如下图,包括集群 CIDR,VPC 路由表,节点网络,节点的 podCIDR,节点上的虚拟网桥 cni0,连接 Pod 和网桥的 veth 等部分。



类似的图,大家可能在很多文章中都看过,但是因为其中相关配置过于复杂,比较难理解。这里我们可以把这些配置,分三种情况来理解:集群配置,节点配置以及 Pod 配置。与这三种情况对应的,其实是对集群网络 IP 段的三次划分:首先是集群 CIDR,接着为每个节点分配 podCIDR(即集群 CIDR 的子网段),最后在 podCIDR 里为每个 Pod 分配自己的 IP。


集群网络搭建

初始阶段

集群的创建,基于云资源 VPC 和 ECS,在创建完 VPC 和 ECS 之后,我们基本上可以得到如下图的资源配置。我们得到一个 VPC,这个 VPC 的网段是 192.168.0.0/16,我们得到若干 ECS,他们从 VPC 网段里分配到 IP 地址。


集群阶段

在以上出初始资源的基础上,我们利用集群创建控制台得到集群 CIDR。这个值会以参数的形式传给集群节点 provision 脚本,并被脚本传给集群节点配置工具 kubeadm。kubeadm 最后把这个参数写入集群控制器静态 Pod 的 yaml 文件 kube-controller-manager.yaml。



集群控制器有了这个参数,在节点 kubelet 注册节点到集群的时候,集群控制器会为每个注册节点,划分一个子网出来,即为每个节点分配 podCIDR。如上图,Node B 的子网是 172.16.8.1/25,而 Node A 的子网是 172.16.0.128/25。这个配置会记录到集群 node 的 podCIDR 数据项里。

节点阶段

经过以上集群阶段,Kubernetes 有了集群 CIDR,以及为每个节点划分的 podCIDR。在此基础上,集群会下发 flanneld 到每个阶段上,进一步搭建节点上,可以给 Pod 使用的网络框架。这里主要有两个操作,第一个是集群通过 Cloud Controller Manager 给 VPC 配置路由表项。路由表项对每个节点有一条。每一条的意思是,如果 VPC 路由收到目的地址是某一个节点 podCIDR 的 IP 地址,那么路由会把这个网络包转发到对应的 ECS 上。第二个是创建虚拟网桥 cni0,以及与 cni0 相关的路由。这些配置的作用是,从阶段外部进来的网络包,如果目的 IP 是 podCIDR,则会被节点转发到 cni0 虚拟局域网里。


注意:实际实现上,cni0 的创建,是在第一个使用 Pod 网络的 Pod 被调度到节点上的时候,由下一节中 flannal cni 创建的,但是从逻辑上来说,cni0 属于节点网络,不属于 Pod 网络,所以在此描述。


Pod 阶段

在前边的三个阶段,集群实际上已经为 Pod 之间搭建了网络通信的干道。这个时候,如果集群把一个 Pod 调度到节点上,kubelet 会通过 flannel cni 为这个 Pod 本身创建网络命名空间和 veth 设备,然后,把其中一个 veth 设备加入到 cni0 虚拟网桥里,并为 Pod 内的 veth 设备配置 ip 地址。这样 Pod 就和网络通信的干道连接在了一起。这里需要强调的是,前一节的 flanneld 和这一节的 flannel cni 完全是两个组件。flanneld 是一个 daemonset 下发到每个节点的 pod,它的作用是搭建网络(干道),而 flannel cni 是节点创建的时候,通过 kubernetes-cni 这个 rpm 包安装的 cni 插件,其被 kubelet 调用,用来为具体的 pod 创建网络(分枝)。


理解这两者的区别,有助于我们理解 flanneld 和 flannel cni 相关的配置文件的用途。比如/run/flannel/subnet.env,是 flanneld 创建的,为 flannel cni 提供输入的一个环境变量文件;又比如/etc/cni/net.d/10-flannel.conf,也是 flanneld pod(准确的说,是 pod 里的脚本 install-cni)从 pod 里拷贝到节点目录,给 flannel cni 使用的子网配置文件。


通信

以上完成 Pod 网络环境搭建。基于以上的网络环境,Pod 可以完成四种通信:本地通信,同节点 Pod 通信,跨节点 Pod 通信,以及 Pod 和 Pod 网络之外的实体通信。



其中本地通信,说的是 Pod 内部,不同容器之前通信。因为 Pod 内网容器之间共享一个网络协议栈,所以他们之间的通信,可以通过 loopback 设备完成。


同节点 Pod 之间的通信,是 cni0 虚拟网桥内部的通信,这相当于一个二层局域网内部设备通信。


跨节点 Pod 通信略微复杂一点,但也很直观,发送端数据包,通过 cni0 网桥的网关,流转到节点上,然后经过节点 eth0 发送给 VPC 路由。这里不会经过任何封包操作。当 VPC 路由收到数据包时,它通过查询路由表,确认数据包目的地,并把数据包发送给对应的 ECS 节点。而进去节点之后,因为 flanneld 在节点上创建了真的 cni0 的路由,所以数据包会被发送到目的地的 cni0 局域网,再到目的地 Pod。


最后一种情况,Pod 与非 Pod 网络的实体通信,需要经过节点上 iptables 规则做 snat,而此规则就是 flanneld 依据命令行–ip-masq 选项做的配置。

总结

以上是阿里云 Kubernetes 集群网络的搭建和通信原理。我们主要通过网络搭建和通信两个角度去分析 Kubernetes 集群网络。其中网络搭建包括初始阶段,集群阶段,节点阶段以及 Pod 阶段,这么分类有助于我们理解这些复杂的配置。而理解了各个配置,集群通信原理就比较容易理解了。


作者简介


罗建龙(花名声东),阿里云技术专家。多年操作系统和图形显卡驱动调试和开发经验。目前专注云原生领域,容器集群和服务网格。


相关阅读


深入浅出Kubernetes 理论篇 (一):理解控制器


2020-03-30 17:051732

评论

发布
暂无评论
发现更多内容

Apache Doris 1.1 特性揭秘:Flink 实时写入如何兼顾高吞吐和低延时

SelectDB

数据库 flink 数据仓库 Doris 数仓

专访亚信科技张桦:AntDB面向企业核心业务支撑的数据库产品

亚信AntDB数据库

AntDB 国产数据库 aisware antdb

浅谈智能家居应用及传输方式

家和万事兴

物联网,

第三届云原生编程挑战赛正式启动,Serverless 赛道邀你参加!

Serverless Devs

详解异步任务 | 看 Serverless Task 如何解决任务调度&可观测性中的问题

Serverless Devs

云原生

要卖课、要带货,知识付费系统帮你一步搞定!

CRMEB

版本更新 | 极狐GitLab 15.2 发布飞书通知机器人、多层史诗调整至专业版、实时 Wiki 图表预览和全新设计的合并请求报告

极狐GitLab

git DevOps 敏捷开发 CI/CD 极狐GitLab

活动回顾 | 大咖云集“开源安全治理模型和工具”线上研讨会

安势信息

开源安全 供应链攻击 SBOM SLSA 软件供应链安全

顶礼膜拜!阿里内部出品,全网首发Spring Security项目实战搭建

冉然学Java

编程 spring security springboot Spring 框架漏洞

如何写好设计文档

观测云

重磅来袭!豆瓣评分9.9,万人血书的多线程与高并发v2.0版本

冉然学Java

编程 源码 高并发 线程池 多线程并发

直播实录 | 37 手游如何用 StarRocks 实现用户画像分析

StarRocks

数据库 大数据

NFTScan 与 PANews 联合发布多链 NFT 数据分析报告

NFT Research

区块链 以太坊 NFT

这88道阿里高级岗面试题,刷掉了80%以上的Java程序员

程序员啊叶

Java 编程 程序员 架构 java面试

面试官:小伙子你来说说MySQL底层架构设计

程序员小毕

Java MySQL 数据库 程序员 面试

SR-TE的功能架构概述

穿过生命散发芬芳

7月月更 SR-TE

传统渲染农场和云渲染农场选择哪个好?

Finovy Cloud

云渲染 GPU服务器

腾讯开源摘星计划培养开源贡献者的实践思考

腾源会

开源 腾源会

你想怎么使用 Serverless 函数计算?(评测赢好礼 )

Serverless Devs

纯css实现:单行文本的打字机动画效果

南极一块修炼千年的大冰块

7月月更

在 Spring Boot 中使用 Dataway 配置数据查询接口

程序员啊叶

Java 编程 程序员 架构 java面试

2022最新首发!全网最全Spring Boot学习宝典(附实战项目教程)

了不起的程序猿

java程序员 Spring Boot CLI SP【ring

算力顶天地,存力纳乾坤:国家超级计算济南中心的一体两面

脑极体

Jenkins 如何玩转接口自动化测试?

Liam

测试 jenkins 自动化测试 API 测试框架

微信公众号借助小程序云函数实现支付功能

Geek_24ed5f

签约计划第三季

闭关三月:整理出了这份对标阿里p7的java秋招面试必备指南。

程序员啊叶

Java 编程 程序员 架构 java面试

KubeMeet 报名 | 「边缘原生」线上技术沙龙完整议程公布!

阿里巴巴云原生

阿里云 容器 云原生 边缘计算

面试被问到 HashMap 底层原理?我有点慌.

程序员啊叶

Java 编程 程序员 架构 java面试

面试官:MySQL如何根据执行计划调优SQL语句?

程序员小毕

Java MySQL 数据库 程序员 面试

SpringBoot 遗忘后的简单快速回忆之环境搭建与常见注解

程序员啊叶

Java 编程 程序员 架构 java面试

2022年最全大厂面试真题解析:java集合+spring+并发编程+MyBatis

程序员啊叶

Java 编程 程序员 架构 java面试

深入浅出Kubernetes 理论篇 (二):网络详解_文化 & 方法_罗建龙(声东)_InfoQ精选文章