【读书笔记/深入理解K8S】集群网络
前言
上一章讲了集群控制器的一个大概的原理,这一章讲一下集群网络。网络是集群通信的载体,因为该书是阿里云团队出品的,所以也以阿里云的集群网络方案为例,其他云厂商的网络集群方案一般来说也大同小异。所以通过本章的学习,能对k8s集群网络的搭建有个大概的理解,也算是有所收获。
本章分为两部分:
- 网络搭建过程
- 基于网络的通信
网络搭建过程
阿里云集群网络方案有2中,一种是flannel方案,一种是基于calico和弹性网卡eni的terway方案。terway方案相较于flannel,支持Pod弹性网卡和NetworkPolicy功能。
概览
我们先看一下一个完整的集群网络的拓扑图的样子:
该图可以划分为3个部分:1. 集群CIDR 2.集群CIDR的子网段(podCIDR) 3. 每个Pod的IP
下面我们来看具体搭建过程:
初始阶段
初始阶段,需要创建VPC和ECS,创建完VPC和ECS后,ECS可以从VPC网段里分配到IP地址
集群阶段
在初始资源基础上,利用集群控制台得到集群CIDR。该值会传给集群节点脚本(provision),然后被脚本传给kubeadm,最后kubeadm将该参数写入集群控制器Pod的yaml文件 kube-controller-manager.yaml
(总结:集群CIDR通过kubeadm写入kube-controller-manager.yaml)
拿到集群CIDR后,kubelet会给节点分配PodCIDR
节点阶段
在上溯节点PodCIDR完成后,集群下发flanneId刀每个阶段上,从而搭建可以给Pod使用的网络框架:
- 集群通过Cloud Controller Manager给VPC配置路由表项(路由把目标为PodCIDR的网络包发到对应的ECS上)
- 创建虚拟网桥cni0以及相关路由
Pod阶段
在前面三个阶段,集群已经为Pod搭建了网络通信的干道,这时如果集群把一个Pod调度到节点上,kubelet会通过flnnel cni为这个Pod本身创建
- 网络命名空间
- veth 设备
然后把veth设备假如cni0虚拟网桥里,并为Pod内的veth配置IP地址
基于网络的通信
本地通信
本地通信指同Pod内部不同的容器之间通信。这些容器共享一个网络协议栈,所以通过lookback设备即可。
同节点Pod的通信
同节点Pod之间的通信,是cni0虚拟网桥内部的通信,也就相当于一个二层的局域网内部设备通信
跨节点Pod的通信
跨节点Pod之间通信,则通过cni0网桥的网关,流转到节点上,经过节点的eth0发给VPC路由,这个过程不会封包。VPC路由通过路由表,将数据包发给对应的ECS节点,再到目的Pod
Pod和Pod网络之外的实体通信
Pod与非Pod网络的实体通信,通过节点上的iptables规则做snat,该规则就是flanneId依据命令行——ip-masq选项做的配置
iptables
- iptables 是 Linux 内核中的一个防火墙工具,用于管理网络数据包的过滤和 NAT(网络地址转换)等功能。它基于规则链来处理数据包,规则链是一系列规则的集合,这些规则定义了如何处理不同类型的网络数据包。
- 例如,用户可以使用 iptables 规则允许或拒绝来自特定 IP 地址的数据包访问本地服务器,或者将内部网络的私有 IP 地址转换为公有 IP 地址以实现互联网访问。
- 在 Kubernetes 中,iptables 用于实现集群内部的网络策略和服务的流量转发。Kubernetes 的网络模型依赖于 iptables 来设置复杂的规则,以确保不同容器之间的通信安全和正确的流量路由。