`
大涛学长
  • 浏览: 84596 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

K8s 从懵圈到熟练 – 集群网络详解

阅读更多
导读:阿里云 K8S 集群网络目前有两种方案:一种是 flannel 方案;另外一种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似,不同的地方在于 terway 支持 Pod 弹性网卡,以及 NetworkPolicy 功能。本文中,作者基于当前的 1.12.6 版本,以 flannel 为例,深入分析阿里云 K8S 集群网络的实现方法。
鸟瞰
总体上来说,阿里云 K8S 集群网络配置完成之后,如下图所示:包括集群 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 数据项里。
节点阶段
经过以上集群阶段,K8S 有了集群 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 选项做的配置。
总结
以上是阿里云 K8S 集群网络的搭建和通信原理。我们主要通过网络搭建和通信两个角度去分析 K8S 集群网络。其中网络搭建包括初始阶段、集群阶段、节点阶段以及 Pod 阶段,这么分类有助于我们理解这些复杂的配置。而理解了各个配置,集群通信原理就比较容易理解了。
本文作者:声东 阿里云售后技术专家
原文链接:https://yq.aliyun.com/articles/720135?utm_content=g_1000079166
本文为云栖社区原创内容,未经允许不得转载。
分享到:
评论

相关推荐

    详解k8s组件Ingress边缘路由器并落地到微服务-kubernetes

    Ingresss是k8s集群中的一个API资源对象,扮演边缘路由器(edgerouter)的角色,也可以理解为集群防火墙、集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),非常灵活,生产环境建议使用这种方式。...

    企业级容器技术与K8S集群技术实战视频.zip

    11_3_1_使用efk实现k8s集群服务日志采集 12_3_2_fluentd工作原理及参数详解 13_4_1_DevOps及CICD介绍 14_4_2_Jenkins_on_k8s的部署 15_4_3_Jenkins与Gitalb集成示例 16_4_4_Jenkins的Master_Slaves 17_4_5_Pipeline...

    k8s 实战案例详解手册

    k8s 实战案例详解手册 内容简介: 1、基础集群环境搭建 2、k8s运行机制以及术语 3、运行web服务 4、k8s运维示例 5、持续集成与部署 6、容器监控与报警 7、实战案例

    容器集群管理系统K8S从入门到精通视频教程

    应用部署方式演变2-kubernetes介绍3-kubernetes组件4-kubernetes概念5-环境搭建--环境规划6-环境搭建--主机安装7-环境搭建--环境初始化8-环境搭建--集群所需组件安装9-环境搭建--集群安装10-环境搭建--网络插件安装...

    Docker+K8S 集群环境搭建及分布式应用部署

    Docker+K8S 集群环境搭建及分布式应用部署 操作步骤详解,手把手教你Docker+K8S 集群环境搭建及分布式应用部署

    快速部署一套k8s-配置文件

    本资源是笔者博文快速部署一套k8s中的2个配置文件, 快速部署一套k8s(https://blog.csdn.net/u011127242/article/details/108290429) 1 k8s 基础 2 环境准备和kubeadm 3 部署master与node加入集群 4 部署k8s UI

    在centos 7中安装配置k8s集群的步骤详解

    主要给大家介绍了关于在centos 7中安装配置k8s集群的步骤,文中通过示例代码将步骤介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习下吧。

    Docker+K8s企业级DevOps实战视频.zip

    3.1 使用efk实现k8s集群服务日志采集 3.2 fluentd工作原理及参数详解 4.1 DevOps及CICD介绍 4.2 Jenkins on k8s的部署及插件的使用 4.3 Jenkins与Gitalb集成示例 4.4 Jenkins的Master-Slaves模式执行任务构建 4.5 ...

    容器编排k8s培训视频.zip

    41ufs过渡到 overlay . mp4 42过操作来理解 overlay, mp4 43 ocker存储驱动小结mp4 44器跑httpd案例1mp4 45自定义httpd容器并提交为镜像dockerrun启动应用详解mp4 46 docker数据卷mp4 47docker数据卷小结官方...

    k8s-nodejs:显示如何将Node.js服务器应用程序部署到Kubernetes集群的示例

    这是有关如何在Kubernetes集群上运行Node.js服务器的简单演示。 Node.js服务器代码为car.js。 给定其车辆识别码(vin),它会返回一些属性,例如车型,制造商和年份。 服务器在端口3000上运行。 运行演示的步骤: ...

    云原生-基于k8s部署-分布式底层存储-Rook-Ceph

    Rook 简化了 Ceph 在 Kubernetes 集群中的部署过程。 本教程基于rook1.8.1实现,已经过物理机、虚拟机、单硬盘osd、多硬盘osd、稳定性测试等多重验证。 本教程包含rook-ceph配置详解、部署、卸载、cephfs使用教程等

    istio架构与k8s中的部署服务实战-视频教程网盘链接提取码下载.txt

    本课程将深入介绍Istio架构及其在Kubernetes中的部署和服务实战。学员将了解如何使用Istio来...通过实践项目,学员将学会在Kubernetes集群中部署Istio,并使用其各种功能来优化和保护微服务应用程序。 视频大小:1.3G

    详解搭建ubuntu版hadoop集群

    本篇文章主要介绍了详解搭建ubuntu版hadoop集群,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    30分钟部署一个Kubernetes集群.md

    30分钟部署一个Kubernetes集群

    K8S:Kubernetes学习之路!

    项目介绍 项目地址: Kubernetes学习之路! 持续更新... 项目结构 ...│ ├── 01-交付dubbo服务到k8s集群 github图片不显示问题 源码中都含有相应的图片 修改hosts文件 打开路径C:\Windows\Syste

    Kubernetes高级教程营销培训视频.zip

    13k8s极速入门课程进阶Pod进阶Pod生命周期Pod启动时 HealthCheck详解mp4 14k8s极速入门课程进阶Pod进阶Pod生命周期Pod中容器重启策略mp4 15k8s极速入门课程进阶Pod进阶Pod生命周期pod状态mp4 16k8s极速入门课程进阶...

    kube-ops-view:Kubernetes操作视图-多个K8s集群的只读系统仪表板

    kube-ops-view:Kubernetes操作视图-多个K8s集群的只读系统仪表板

Global site tag (gtag.js) - Google Analytics