导读:阿里云 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
本文为云栖社区原创内容,未经允许不得转载。
分享到:
相关推荐
在Kubernetes(k8s)集群中,网络通信是一个至关重要的方面,因为它允许不同容器和服务之间的无缝交互。K8s的网络模型设计的目标是让每个Pod(一组运行在同一主机上的容器)都拥有一个唯一的IP地址,并且可以直接...
### Kubernetes (K8s) Docker 集群搭建详解 #### 一、Kubernetes 概述 ##### 1. 背景介绍 随着云计算的快速发展,IaaS(基础设施即服务)、PaaS(平台即服务)和SaaS(软件即服务)逐渐成为企业IT服务的主要形式。在此...
Ingresss是k8s集群中的一个API资源对象,扮演边缘路由器(edgerouter)的角色,也可以理解为集群防火墙、集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),非常灵活,生产环境建议使用这种方式。...
### K8s之Lens使用详解 #### 一、引言 随着Kubernetes(简称K8s)成为容器编排领域的主流技术,对于高效管理和监控K8s集群的需求日益增加。Lens是一款强大的集成开发环境(IDE),专为K8s设计,能够帮助开发者更...
### K8s (Kubernetes) 安装教程与一键安装脚本详解 #### 一、前言 在本文中,我们将详细介绍如何通过一键脚本在常见的Linux发行版上(如Ubuntu 16.04 64位、CentOS 7 64位和Debian 9 64位)安装Kubernetes(简称k8...
阿里Kubernetes(k8s)详解 Kubernetes(简称k8s)是由Google开源的一款容器编排系统,现由CNCF(Cloud Native Computing Foundation)维护。阿里云作为国内领先的云计算服务提供商,深度参与了Kubernetes的发展,...
本手册深入浅出地介绍了k8s在实际应用中的各项操作和最佳实践,帮助读者从理论到实践全面掌握k8s的核心概念和技术。 1. **基础集群环境搭建**:在学习k8s之前,首先需要搭建一个k8s集群。这通常涉及安装Master节点...
【Kubernetes(K8s)基础与进阶详解】 Kubernetes,简称K8s,是Google开源的一个容器编排系统,旨在自动化容器化的应用程序部署、扩展以及管理。本套视频教程针对V1.19版本,是2021年最新录制的全面教学资源,适合...
### K8s原理详解 #### 组件概述 K8s架构由Master节点和Node节点构成: - **Master节点**:负责整个集群的管理和控制,包括API服务器、调度器、控制器管理器等核心组件。 - **API服务器**:集群的入口,提供...
### k8s简易集群搭建(无认证)知识点详解 #### 一、背景介绍与环境准备 **Kubernetes**,简称K8s,是目前最流行的容器编排平台之一,能够帮助用户实现容器化应用的自动化部署、扩展以及管理。本文档提供了一套...
- **镜像源问题**:默认情况下,Rancher-K8s部署Kubernetes集群时所使用的镜像是从谷歌商店拉取的,这对于中国境内的用户来说几乎是不可能实现的,因为这些镜像通常无法被顺利下载。 - **替换镜像仓库**:为了解决这...
K8S部署集群搭建详解,助你起飞
【Kubernetes(K8s)架构详解】 Kubernetes(简称K8s)是目前最流行的容器编排系统,它能够高效地管理和调度容器化的应用程序。K8s的基础架构由多个核心组件构成,确保了集群的稳定性和高可用性。 1. **Master节点...
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监控blackbox-exporter镜像及资源清单文件详解** Kubernetes(简称K8S)作为现代云原生应用的基石,提供了一种高效、灵活的容器编排方式。在K8S环境中,对服务的健康状态进行监控至关重要。Blackbox Exporter...
Kubernetes(简称k8s)是Google开源的一款容器编排系统,现由Cloud Native Computing Foundation (CNCF) 维护。这个平台旨在自动化容器化...通过学习和实践,你将能够熟练地玩转k8s集群,实现高效且可靠的云计算环境。
《K8s Pod基础设施软件包详解》 在现代云计算领域,Kubernetes(简称K8s)作为容器编排的领头羊,已经成为管理和部署应用程序的标准工具。本文将深入探讨"K8s pod-infrastructure.tgz"软件包,它是构建K8s集群的...
### Kubeadm安装K8S单Master节点集群详解 #### 一、集群环境规划与配置 根据提供的文档信息,我们了解到本次安装的目标是构建一个基于Kubeadm的Kubernetes (K8S) 单Master节点集群。该集群的具体规划如下: - **...