Kubernetes(k8s)CNI(flannel)网络模型原理

2023-11-03 00:59

本文主要是介绍Kubernetes(k8s)CNI(flannel)网络模型原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概述

Kubernetes 采用的是基于扁平地址空间的、非NAT的网络模型,每个Pod有自己唯一的IP地址。网络是由CNI(container network interface)插件建立的,而非K8S本身。

二、常见的几种CNI插件介绍

为了使容器之间的通信更加方便,Google 和 CoreOS 主导制定了一个容器网络标准CNI(Conteinre Network Interface) 。

k8s官网:Installing Addons | Kubernetes
CNI可允许K8S配置任何CNI插件,常见的CNI插件有以下几种:

1)Flannel(本章讲解)

Flannel是由CoreOS开发的项目,是容器编排系统中最成熟的网络结构示例之一,旨在实现更好的容器间和主机间网络。

与其他方案相比,Flannel相对容易安装和配置。它被打包为单个二进制文件flanneld,许多常见的Kubernetes集群部署工具和许多Kubernetes发行版都可以默认安装Flannel。Flannel可以使用Kubernetes集群的现有etcd集群来使用API存储其状态信息,因此不需要专用的数据存储。

详细参考 GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes
官网:https://coreos.com/flannel/docs/latest/
文档:https://coreos.com/flannel/docs/latest/kubernetes.html

2)Calico

Calico是Kubernetes生态系统中另一种流行的网络选择,它提供收费的技术支持。虽然Flannel被公认为是最简单的选择,但Calico以其性能、灵活性而闻名。Calico的功能更为全面,更为复杂。它不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。Calico CNI插件在CNI框架内封装了Calico的功能。

详细参考 GitHub - projectcalico/cni-plugin: Calico CNI plugin

3)Romana

Romana是Panic Networks在2016年新提出的开源项目,旨在解决Overlay方案给网络带来的开销。虽然目标和Calico基本一致,但其采取的方法却截然不同,具体项目的发展有待观察。

4)Weave Nets

大家都叫惯了weave,实际上目前该产品的名字叫做Weave Nets。

Weave是由Weaveworks提供的一种插件,它提供的模式是在集群中的节点之间创建网状的overlay网络。与Calico一样,Weave也为Kubernetes集群提供网络策略功能。

三、Flannel 组件的解释

  • Cni0:网桥设备,每创建一个pod都会创建一对 veth pair,其中一端是pod中的eth0,另一端是Cni0网桥中的端口 (网卡),Pod中从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上,Cni0 设备获得的ip地址是该节 点分配到的网段的第一个地址。
  • Flannel.1:overlay网络的设备,用来进行vxlan报文的处理(封包和解包),不同node之间的pod数据流量都从 overlay设备以隧道的形式发送到对端。

Flannel的系统文件及目录

$ find / -name flannel

当前node主机IP地址范围

$ cat /run/flannel/subnet.env

四、Flannel网络通信原理实验

1)同节点Pod之间的通信

在容器启动前,会为容器创建一个虚拟Ethernet接口对,这个接口对类似于管道的两端,其中一端在主机命名空间中,另外一端在容器命名空间中,并命名为eth0。在主机命名空间的接口会绑定到网桥。网桥的地址段会取IP赋值给容器的eth0接口。

【实验】这里利用nodeName特性将Pod调度到相同的node节点上(亲和性),创建两个pod

$ cat >p1.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:labels:run: nginxname: p1namespace: default
spec:nodeName: k8s-node1containers:- image: busyboxname: c1command: - "ping"- "baidu.com"
EOF$ cat >p2.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:labels:run: busyboxname: p2namespace: default
spec:nodeName: k8s-node1containers:- image: busyboxname: c2command: - "ping"- "baidu.com"
EOF

执行

$ kubectl apply -f p1.yaml -f p2.yaml
$ kubectl get pod p{1,2}
$ kubectl get pod p{1,2} -o wide
# p1 ping p2
$ kubectl exec -it p1 -- ping 10.244.1.230

工作流程

1、源容器向目标容器发送数据,数据首先发送给 cni0 网桥
查看路由

$ kubectl exec -it p1 -c c1 -- ip route
$ kubectl exec -it p2 -c c2 -- ip route

2、cni0 网桥接受到数据后,将其转交给 flannel.1 虚拟网卡处理

cni0 收到数据包后,docker0的内核栈处理程序会读取这个数据包的目标地址,根据目标地址将数据包发送给下一个路由节点:

$ ip a
$ ip route

3、flannel.1 接受到数据后,对数据进行封装,并发给宿主机的 ens33,再通过ens33出外网,或者访问不同node节点上的pod

针对相同节点上的pod通信,直接cni0 网桥通信,流程如下图:

2)不同节点Pod之间的通信

【实验】这里利用nodeName特性将Pod调度到不同的node节点上(亲和性),创建两个pod

$ cat >p3.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:labels:run: nginxname: p3namespace: default
spec:nodeName: k8s-node1containers:- image: busyboxname: c3command: - "ping"- "baidu.com"
EOF$ cat >p4.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:labels:run: busyboxname: p4namespace: default
spec:nodeName: k8s-node2containers:- image: busyboxname: c4command: - "ping"- "baidu.com"
EOF

执行

$ kubectl apply -f p3.yaml -f p4.yaml
$ kubectl get pod p{3,4}
$ kubectl get pod p{3,4} -o wide
# p3 ping p4
$ kubectl exec -it p3 -- ping 10.244.1.230

工作流程上面已经讲解了,这里就不重复了。流程如下图:

3)Pod与Service之间的通信

在不同节点上的Pod通信中,我们知道了Pod是以IP地址进行通信,但Kubernetes 的集群中, Pod 可能会频繁的销毁和创建,也就是说 Pod 的 IP 不是固定的。为了解决这个问题,Service 提供了访问 Pod 的抽象层,即为一组功能相同的Pod提供单一不变的接入点资源。无论后端的 Pod 如何变化,Service 都作为稳定的前端对外提供服务。同时,Service 还提供了高可用和负载均衡功能,Service 负责将请求转发给正确的 Pod。

【实验】因为在pod基本上都是由控制器管理,所以这里就创建Service和Deployment

cat >Service-Deployment-test001.yaml<<EOF
apiVersion: v1
kind: Service
metadata:name: nginx-svc001labels:app: nginx-svc001
spec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80nodePort: 30080type: NodePort 
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nginx-deployment001
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
EOF

执行

$ kubectl apply -f Service-Deployment-test001.yaml
$ kubectl get pod -o wide|grep nginx-deployment001
$ kubectl get svc nginx-svc001

发现每个node节点上都运行了一个pod,curl验证是否正常访问

$ curl 192.168.0.113:30080

$ ipvsadm -Ln|grep -A10 10.1.35.17
$ ss -tnlp|grep 30080

流程图如下:

关于Kubernetes(k8s)CNI(flannel)网络模型的介绍就先到这里了,有疑问的小伙伴,欢迎给我留言哦~

这篇关于Kubernetes(k8s)CNI(flannel)网络模型原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334464

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt