二十四、NetworkPolicy

NetworkPolicy

一、基础网路

Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原因是,用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑如何将容器端口映射到主机端口等问题。

Linux在网络栈中引入了网络命名空间,这些独立的协议栈被隔离到不同的命名空间中。处于不同命名空间中的网络栈是完全隔离的,彼此之间无法通信。通过对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境。Docker正是利用了网络的命名空间特性,实现了不同容器之间的网络隔离。

Linux系统包含一个完整的路由功能。当IP层在处理数据发送或者转发时,会使用路由表来决定发往哪里。在通常情况下,如果主机与目的主机直接相连,那么主机可以直接发送IP报文到目的主机,这个过程比较简单。例如,通过点对点的链接或网络共享,如果主机与目的主机没有直接相连,那么主机会将IP报文发送给默认的路由器,然后由路由器来决定往哪里发送IP报文。

路由功能由IP层维护的一张路由表来实现。当主机收到数据报文时,它用此表来决策接下来应该做什么操作。当从网络侧接收到数据报文时,IP层首先会检查报文的IP地址是否与主机自身的地址相同。如果数据报文中的IP地址是主机自身的地址,那么报文将被发送到传输层相应的协议中。如果报文中的IP地址不是主机自身的地址,并且主机配置了路由功能,那么报文将被转发,否则报文将被丢弃。

路由表中的数据一般是以条目形式存在的。一个典型的路由表条目通常包含以下主要的条目项。
(1)目的IP地址:此字段表示目标的IP地址。这个IP地址可以是某主机的地址,也可以是一个网络地址。如果这个条目包含的是一个主机地址,那么它的主机ID将被标记为非零;如果这个条目包含的是一个网络地址,那么它的主机ID将被标记为零。
(2)下一个路由器的IP地址:这里采用“下一个”的说法,是因为下一个路由器并不总是最终的目的路由器,它很可能是一个中间路由器。条目给出的下一个路由器的地址用来转发在相应接口接收到的IP数据报文。
(3)标志:这个字段提供了另一组重要信息,例如,目的IP地址是一个主机地址还是一个网络地址。此外,从标志中可以得知下一个路由器是一个真实路由器还是一个直接相连的接口。
(4)网络接口规范:为一些数据报文的网络接口规范,该规范将与报文一起被转发。
在通过路由表转发时,如果任何条目的第1个字段完全匹配目的IP地址(主机)或部分匹配条目的IP地址(网络),那么它将指示下一个路由器的IP地址。这是一个重要的信息,因为这些信息直接告诉主机(具备路由功能的)数据包应该被转发到哪个路由器。而条目中的所有其他字段将提供更多的辅助信息来为路由转发做决定。

查看路由表

[root@k8s-master01 config]#ip route show table local type local
local 10.1.2.21 dev ens160 proto kernel scope host src 10.1.2.21
local 10.96.0.1 dev kube-ipvs0 proto kernel scope host src 10.96.0.1
local 10.96.0.10 dev kube-ipvs0 proto kernel scope host src 10.96.0.10
local 10.96.4.191 dev kube-ipvs0 proto kernel scope host src 10.96.4.191
local 10.96.5.219 dev kube-ipvs0 proto kernel scope host src 10.96.5.219
local 10.96.8.233 dev kube-ipvs0 proto kernel scope host src 10.96.8.233
local 10.96.16.42 dev kube-ipvs0 proto kernel scope host src 10.96.16.42
local 10.96.20.101 dev kube-ipvs0 proto kernel scope host src 10.96.20.101
local 10.96.26.89 dev kube-ipvs0 proto kernel scope host src 10.96.26.89
local 10.96.26.90 dev kube-ipvs0 proto kernel scope host src 10.96.26.90
local 10.96.40.158 dev kube-ipvs0 proto kernel scope host src 10.96.40.158
local 10.96.41.143 dev kube-ipvs0 proto kernel scope host src 10.96.41.143
local 10.96.43.227 dev kube-ipvs0 proto kernel scope host src 10.96.43.227
local 10.96.44.6 dev kube-ipvs0 proto kernel scope host src 10.96.44.6
local 10.96.49.49 dev kube-ipvs0 proto kernel scope host src 10.96.49.49
local 10.96.51.158 dev kube-ipvs0 proto kernel scope host src 10.96.51.158
local 10.96.54.208 dev kube-ipvs0 proto kernel scope host src 10.96.54.208
local 10.96.57.40 dev kube-ipvs0 proto kernel scope host src 10.96.57.40
local 10.96.82.18 dev kube-ipvs0 proto kernel scope host src 10.96.82.18
local 10.96.86.174 dev kube-ipvs0 proto kernel scope host src 10.96.86.174
local 10.96.107.17 dev kube-ipvs0 proto kernel scope host src 10.96.107.17
local 10.96.107.142 dev kube-ipvs0 proto kernel scope host src 10.96.107.142
local 10.96.130.60 dev kube-ipvs0 proto kernel scope host src 10.96.130.60
local 10.96.142.27 dev kube-ipvs0 proto kernel scope host src 10.96.142.27
local 10.96.149.137 dev kube-ipvs0 proto kernel scope host src 10.96.149.137
local 10.96.164.40 dev kube-ipvs0 proto kernel scope host src 10.96.164.40
local 10.96.165.97 dev kube-ipvs0 proto kernel scope host src 10.96.165.97
local 10.96.167.19 dev kube-ipvs0 proto kernel scope host src 10.96.167.19
local 10.96.169.66 dev kube-ipvs0 proto kernel scope host src 10.96.169.66
local 10.96.193.178 dev kube-ipvs0 proto kernel scope host src 10.96.193.178
local 10.96.197.180 dev kube-ipvs0 proto kernel scope host src 10.96.197.180
local 10.96.213.58 dev kube-ipvs0 proto kernel scope host src 10.96.213.58
local 10.96.215.96 dev kube-ipvs0 proto kernel scope host src 10.96.215.96
local 10.96.226.93 dev kube-ipvs0 proto kernel scope host src 10.96.226.93
local 10.96.234.147 dev kube-ipvs0 proto kernel scope host src 10.96.234.147
local 10.96.247.97 dev kube-ipvs0 proto kernel scope host src 10.96.247.97
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 172.16.32.128 dev tunl0 proto kernel scope host src 172.16.32.128
local 172.17.0.1 dev docker0 proto kernel scope host src 172.17.0.1
local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1

二、Docker网络

标准的Docker支持以下4类网络模式。

  • ◎ host模式:使用–net=host指定。
  • ◎ container模式:使用–net=container:NAME_or_ID指定。
  • ◎ none模式:使用–net=none指定。
  • ◎ bridge模式:使用–net=bridge指定,为默认设置。
    在Kubernetes管理模式下通常只会使用bridge模式,所以本节只介绍Docker在bridge模式下是如何支持网络的。

在bridge模式下,Docker Daemon首次启动时会创建一个虚拟网桥,默认的名称是docker0,然后按照RPC1918的模型在私有网络空间中给这个网桥分配一个子网。针对由Docker创建的每一个容器,都会创建一个虚拟以太网设备(Veth设备对),其中一端关联到网桥上,另一端使用Linux的网络命名空间技术映射到容器内的eth0设备,然后在网桥的地址段内给eth0接口分配一个IP地址。

在这里插入图片描述

其中ip1是网桥的IP地址,Docker Daemon会在几个备选地址段里给它选一个地址,通常是以172开头的一个地址,这个地址和主机的IP地址是不重叠的。ip2是Docker在启动容器时在这个地址段选择的一个没有使用的IP地址。

启动后,Docker还将Veth设备对的名称映射到eth0网络接口。ip3就是主机的网卡地址。

在一般情况下,ip1、ip2和ip3是不同的IP段,所以在默认不做任何特殊配置的情况下,在外部是看不到ip1和ip2的。


三、Kubernetes网络

同一个Pod内的容器(Pod内的容器是不会跨宿主机的)共享同一个网络命名空间,共享同一个Linux协议栈。所以对于网络的各类操作,就和它们在同一台机器上一样,它们甚至可以用localhost地址访问彼此的端口。

1. 容器到容器通信

在这里插入图片描述

容器1和容器2共享一个网络的命名空间,共享一个命名空间的结果就是它们好像在一台机器上运行,它们打开的端口不会有冲突,可以直接使用Linux的本地IPC进行通信(例如消息队列或者管道)。其实,这和传统的一组普通程序运行的环境是完全一样的,传统程序不需要针对网络做特别的修改就可以移植,它们之间的相互访问只需使用localhost就可以。


2. Pod到Pod之间通信

每一个Pod都有一个真实的全局IP地址,同一个Node内的不同Pod之间可以直接采用对方Pod的IP地址通信,而且不需要采用其他发现机制,例如DNS、Consul或者etcd。

Pod容器既有可能在同一个Node上运行,也有可能在不同的Node上运行,所以通信也分为两类:同一个Node上Pod之间的通信和不同Node上Pod之间的通信。

1.同一个Node上Pod之间的通信
在这里插入图片描述Pod1和Pod2都是通过Veth连接到同一个docker0网桥的,它们的IP地址IP1、IP2都是从docker0的网段上动态获取的,和网桥本身的IP3属于同一个网段。

另外,在Pod1、Pod2的Linux协议栈上,默认路由都是docker0的地址,也就是说所有非本地地址的网络数据,都会被默认发送到docker0网桥上,由docker0网桥直接中转。
综上所述,由于它们都关联在同一个docker0网桥上,地址段相同,所以它们之间是能直接通信的。

2.不同Node上Pod之间的通信
在这里插入图片描述Pod中的数据在发出时,需要有一个机制能够知道对方Pod的IP地址挂在哪个具体的Node上。也就是说,先要找到Node对应宿主机的IP地址,将数据发送到这个宿主机的网卡,然后在宿主机上将相应的数据转发到具体的docker0上。一旦数据到达宿主机Node,那个Node内部的docker0便知道如何将数据发送到Pod了。

IP1对应的是Pod1,IP2对应的是Pod2,Pod1在访问Pod2时,首先要将数据从源Node的eth0发送出去,找到并到达Node2的eth0,即先是从IP3到IP4的传送,之后才是从IP4到IP2的传送。


四、Calico网络插件

Calico是一个基于BGP的纯三层的网络方案,与OpenStack、Kubernetes、AWS、GCE等云平台都能够良好地集成。Calico在每个计算节点都利用Linux Kernel实现了一个高效的vRouter来负责数据转发。
每个vRouter都通过BGP1协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网时可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率。

在这里插入图片描述
Calico的主要组件如下:

  • ◎ Felix:Calico Agent,运行在每个Node上,负责为容器设置网络资源(IP地址、路由规则、iptables规则等),保证跨主机容器网络互通。
  • ◎ etcd:Calico使用的后端存储。
  • ◎ BGP Client:负责把Felix在各Node上设置的路由信息通过BGP广播到Calico网络。
  • ◎ Route Reflector:通过一个或者多个BGP Route Reflector完成大规模集群的分级路由分发。
  • ◎ CalicoCtl:Calico命令行管理工具。

在这里插入图片描述
查看已经部署的pod

[root@k8s-master01 config

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…

下载文件,浏览器阻止不安全下载

背景: 在项目开发中,遇到需要下载文件的情况,文件类型可能是图片、excell表、pdf、zip等文件类型,但浏览器会阻止不安全的下载链接。 效果展示: 下载文件的两种方式: 一、根据接口的相对url,拼…

SD/MMC驱动开发

一、介绍 MMC的全称是”MultiMediaCard”――所以也通常被叫做”多媒体卡”,是一种小巧大容量的快闪存储卡,特别应用于移动电话和数字影像及其他移动终端中。MMC存贮卡只有7pin,可以支持MMC和SPI两种工作模式。 SD卡,数字安全记忆卡&#xf…

Elasticsearch:Jira 连接器教程第一部分

作者:来自 Elastic Gustavo Llermaly 将我们的 Jira 内容索引到 Elaasticsearch 中以创建统一的数据源并使用文档级别安全性进行搜索。 在本文中,我们将回顾 Elastic Jira 原生连接器的一个用例。我们将使用一个模拟项目,其中一家银行正在开发…

Linux操作系统的灵魂,深度解析MMU内存管理

在计算机的奇妙世界里,我们每天使用的操作系统看似流畅自如地运行着各类程序,背后实则有着一位默默耕耘的 “幕后英雄”—— 内存管理单元(MMU)。它虽不常被大众所熟知,却掌控着计算机内存的关键命脉,是保障…

【云岚到家】-day02-客户管理-认证授权

第二章 客户管理 1.认证模块 1.1 需求分析 1.基础概念 一般情况有用户交互的项目都有认证授权功能,首先我们要搞清楚两个概念:认证和授权 认证: 就是校验用户的身份是否合法,常见的认证方式有账号密码登录、手机验证码登录等 授权:则是该用…

Thinkphp8 Apidoc 实际使用中遇到的问题解决

1. 接口去掉 Controller 问题: 正确的路径应该是/api/login/register, 这块controller有没有地方配置的? 2. 自定义成功,错误消息有没有办法? 未完成, 待更新

C++的auto_ptr智能指针:从诞生到被弃用的历程

C作为一种功能强大的编程语言,为开发者提供了众多便捷的特性和工具,其中智能指针是其重要特性之一。智能指针能够自动管理内存,有效避免内存泄漏等常见问题。然而,并非所有智能指针都尽善尽美,auto_ptr便是其中的一个例…

游戏开发中常用的设计模式

目录 前言一、工厂模式二、单例模式三、观察者模式观察者模式的优势 四、状态模式状态模式的优势 五、策略模式策略模式的优势策略模式与状态模式有什么区别呢? 六、组合模式七、命令模式八、装饰器模式 前言 本文介绍了游戏开发中常用的设计模式,如工厂模式用于创…

Navicat Premium 数据可视化

工作区,数据源以及图表 数据可视化是使用可视化组件(例如图表,图形和地图)的信息和数据的图形表示。 数据可视化工具提供了一种可访问的方式,用于查看和理解数据中的趋势,异常值和其他模式。 在Navicat中&…

【系统分享01】Python+Vue电影推荐系统

大家好,作为一名老程序员,今天我将带你一起走进电影推荐系统的世界,分享如何利用 Django REST Framework 和 Vue 搭建一套完整的电影推荐系统,结合 协同过滤算法,根据用户评分与影片喜好,精准推送用户可能喜…

【大数据2025】MapReduce

MapReduce 基础介绍 起源与发展:是 2004 年 10 月谷歌发表的 MAPREDUCE 论文的开源实现,最初用于大规模网页数据并行处理,现成为 Hadoop 核心子项目之一,是面向批处理的分布式计算框架。基本原理:分为 map 和 reduce …

主从复制

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。 主从原理:MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。 主从同步的核心原理是将主服务器上的二…

【博客之星评选】2024年度前端学习总结

故事的开端...始于2024年第一篇前端技术博客 那故事的终末...也该结束于陪伴了我一整年的前端知识了 踏入 2025 年,满心激动与自豪,我成功闯进了《2024 年度 CSDN 博客之星总评选》的 TOP300。作为一名刚接触技术写作不久的萌新,这次能走到这…

《TikTok停服:信息安全警钟长鸣》

一、TikTok 停服事件回顾 2025 年 1 月 18 日晚,TikTok 通知美国用户,由于美官方禁令于 19 日起生效,TikTok 软件将暂时对用户停止服务。这一消息犹如一颗重磅炸弹,瞬间在全球范围内掀起轩然大波。美国用户对此猝不及防&#xff0…

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法:记忆化搜索DFS 算法&#xf…

C++,设计模式,【目录篇】

文章目录 1. 简介2. 设计模式的分类2.1 创建型模式(Creational Patterns):2.2 结构型模式(Structural Patterns):2.3 行为型模式(Behavioral Patterns): 3. 使用设计模式…

项目实战--网页五子棋(游戏大厅)(3)

我们的游戏大厅界面主要需要包含两个功能&#xff0c;一是显示用户信息&#xff0c;二是匹配游戏按钮 1. 页面实现 hall.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><meta name"viewport"…

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

大模型UI&#xff1a;Gradio全解11——Chatbot&#xff1a;融合大模型的聊天机器人&#xff08;4&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.4 使用Blocks创建自定义聊天机器人11.4.1 简单聊天机器人演示11.4.2 立即响应和流式传输11.4.…

STM32 FreeRTOS内存管理简介

在使用 FreeRTOS 创建任务、队列、信号量等对象时&#xff0c;通常都有动态创建和静态创建的方式。动态方式提供了更灵活的内存管理&#xff0c;而静态方式则更注重内存的静态分配和控制。 如果是1的&#xff0c;那么标准 C 库 malloc() 和 free() 函数有时可用于此目的&#…