K8S之網絡深度剖析(一)(持續更新ing)

K8S之網絡深度剖析

一 、關于K8S的網絡模型

在K8s的世界上,IP是以Pod為單位進行分配的。一個Pod內部的所有容器共享一個網絡堆棧(相當于一個網絡命名空間,它們的IP地址、網絡設備、配置等都是共享的)。按照這個網絡原則抽象出來的為每個Pod都設置一個IP地址的模型也被稱作為IP-per-Pod模型。

Kubernetes對集群網絡有如下要求:

  • 所有容器都可以在不用NAT的方式下同別的容器通訊。
  • 所有節點都可以在不用NAT的方式下同別的容器通訊。
  • 容器的地址和別人看到的地址是同一個地址。

二、Docker 網絡

Docker 使用到的與Linux網絡有關的主要技術:

  • 網絡命名空間(Network Namespace)
  • Veth 設備對
  • 網橋
  • Iptables
  • 路由

2.1 網絡命名空間

為了支持網絡協議棧中的多個實例,Linux 2.6.24內核版本的網絡協議棧中引入了網絡命名空間,這些獨立的協議棧被隔離到不用的命名空間中。處于不用命名空間中的網絡棧是完全隔離的,彼此之間無法通訊,就好像兩個"平行宇宙"。通過對于網絡資源的隔離,就能在一個宿主機上虛擬多個不同的網絡環境。Docker 正是利用了網絡的命名空間特性,實現了不同容器之間的網絡隔離。

在Linux的網絡命名空間中可以有自己獨立的路由表,及獨立的Iptables設置來提供包轉發、NAT、及IP包過濾等功能。

為了隔離出獨立的協議棧,需要納入命名空間的元素有進程、套接字、網絡設備等。進程創建的套接字必須屬于某個網絡命名空間,套接字的操作也必須在命名空間中進行。同樣,網絡設備也必須屬于某個命名空間。因為網絡設備屬于公共資源,所以可以通過修改屬性實現在命名空間之間移動。當然,是否允許移動,和設備的特征有關系。

2.1.1 網絡命名空間的實現

Linux的網絡協議棧是十分復雜的,為了支持獨立的協議棧,相關的這些全局變量都必須被修改為協議棧私有,最好的辦法就是讓這些全局變量成為一個 Net NameSpace變量的成員,然后修改協議棧的函數調用,在加入一個NameSpace的參數,這就是Linux 實現網絡命名空間的核心。

同時,為了保證對已經開發的應用程序,以及內核代碼的兼容性,內核代碼隱式地使用了網絡命名空間中的變量,程序如果沒有對網絡命名空間有特殊需求,就不需要編寫額外的代碼,網絡命名空間對應用程序而言是透明的。

在建立了新的網絡命名空間,并將某個進程關聯到這個網絡命名空間后,就出現了如下圖的數據結構,所有的網絡棧變量都沒放到了私有的命名空間,和其他進程組并不沖突。

在這里插入圖片描述
上圖來自網絡命名空間深度好文

在新生成的理由命名空間中,只有回環設備,(名為"lo" 且是停止狀態),其他設備默認都不存在,如果我們需要,則要一一手工建立,Docker容器中的各類網絡棧設備都是Docker Daemon 在啟動時自動創建和配置的。

所有的網絡設備(物理的或虛擬接口、橋等在內核里都叫做Net Device)都只能屬于一個命名空間、當然,物理設備(連接實際硬件的設備)通常只能關聯到root 這個命名空間。虛擬的網絡設備(虛擬的以太網接口或者虛擬網口對)則可以被關聯到一個給定的命名空間,而且可以在這些命名空間中移動。

前面提到,由于網絡命名空間代表的是一個獨立的協議棧,所以它們之間是相互隔離的,彼此無法通訊,在協議棧內部都看不到對方, 那么有沒有辦法打破這種限制,讓處于不同網絡命名空間的網絡互相通訊,甚至和外部的網絡通訊呢? 答案就是“有”,應用 “Veth設備對即可”, Veth 設備對一個重要的作用就是打通互相看不到的協議棧的協議棧之間的壁壘,他就像一條管子,一端連著這個網絡命名空間的協議棧,一端連著另一個網絡命名空間協議棧,所以想要在兩個命名空間之間通訊,就必須有一個 Veth 設備對。

2.1.2 網絡命名空間的操作

我們可以使用 Linux iproute2 系列配置工具中的IP 命令來操作網絡命名空間,注意: 這個命令需要使用root 用戶來執行。

安裝:

# alphine
apk add iproute2# ubuntu
sudo apt install iproute2# centos
sudo yum -y install iproute2

創建一個網絡命名空間:

ip netns add <name>

創建一個名為test1 的網絡命名空間

ip netns add test1

在命名空間中執行命令:

ip netns exec <name> <command>

在命名空間test1 執行 ip a s 命令

root@test:~# ip netns exec test1 ip a s
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

也可以先通過切換到對應的網絡命名空間,執行各種命令:

ip netns exec <name> bash

執行 exit 或Ctrl +d 退出當前網絡命名空間。
上面的操作相當于網絡命名空間進行了切換,文件系統還是當前,在Docker 中,其實也做了類似操作,并且將文件系統通過chroot 進行了切換,通過cgroup 對資源進行了隔離。

2.1.3 網絡命名空間的實用技巧

操作系統網絡命名空間的一些技巧如下:

我們可以在不同的網絡命名空間之間轉移設備,列如下面會提到的Veth 設備對的轉移,因為一個設備只能屬于一個命名空間,所以轉移后在這個網絡命名空間內就看不到這個設備了,具體哪些設備能被轉移到不同的網絡命名空間, 在設備里面有一個屬性: NETIF_F_NETNS_LOCAL,如果這個屬性為 on,就不能被轉移到其他命名空間中。Veth 設備屬于可轉移設備,而其他設備如,lo 設備,vxlan,ppp 設備,bridge設備等都是不可轉移的。將無法轉移的設備移動到別的命名空間時,會得到無效的參數錯誤提示。

root@test1:~# ip link set lo netns test1
RTNETLINK answers: Invalid argument

如何知道這些設備是否可以轉移呢? 可以使用ethtool 工具查看:

root@test1:~#  apt install ethtool
root@test1:~# ethtool -k docker0  | grep netns
netns-local: on [fixed]
root@test1:~# ethtool -k veth276e185  | grep netns
netns-local: off [fixed]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37148.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot(一)創建一個簡單的SpringBoot工程

Spring框架常用注解簡單介紹 SpringMVC常用注解簡單介紹 SpringBoot&#xff08;一&#xff09;創建一個簡單的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多環境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…

3.ROS串口實例

#include <iostream> #include <ros/ros.h> #include <serial/serial.h> #include<geometry_msgs/Twist.h> using namespace std;//運行打開速度控制插件&#xff1a; rosrun rqt_robot_steering rqt_robot_steering //若串口訪問權限不夠&#xff1a…

詳解PEFT庫中LoRA源碼

前言 GitHub項目地址Some-Paper-CN。本項目是譯者在學習長時間序列預測、CV、NLP和機器學習過程中精讀的一些論文&#xff0c;并對其進行了中文翻譯。還有部分最佳示例教程。如果有幫助到大家&#xff0c;請幫忙點亮Star&#xff0c;也是對譯者莫大的鼓勵&#xff0c;謝謝啦~本…

讀書筆記-《Spring技術內幕》(三)MVC與Web環境

前面我們學習了 Spring 最核心的 IoC 與 AOP 模塊&#xff08;讀書筆記-《Spring技術內幕》&#xff08;一&#xff09;IoC容器的實現、讀書筆記-《Spring技術內幕》&#xff08;二&#xff09;AOP的實現&#xff09;&#xff0c;接下來繼續學習 MVC&#xff0c;其同樣也是經典…

Spring底層原理之bean的加載方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解 這種方式和第七種比較像 要實現兩個方法 第一個方法是實現工廠 第二個方法叫后處理bean注冊 package com.bigdata1421.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.…

解決idea中git無法管理項目中所有需要管理的文件

點擊文件->設置 選擇版本控制—>目錄映射 點擊加號 設置整個項目被Git管理

【python入門】自定義函數

文章目錄 定義自定義函數的基本語法參數類型示例代碼函數作用域匿名函數&#xff08;Lambda&#xff09;閉包裝飾器 Python中的自定義函數允許你編寫一段可重用的代碼塊&#xff0c;這段代碼可以帶參數&#xff08;輸入&#xff09;&#xff0c;并可能返回一個值&#xff08;輸…

MySQL高級-事務-并發事務演示及隔離級別

文章目錄 0、四種隔離級別1、創建表 account2、修改當前會話隔離級別為 read uncommitted2.1、會出現臟讀 3、修改當前會話隔離級別為 read committed3.1、可以解決臟讀3.2、會出現不可重復讀 4、修改當前會話隔離級別為 repeatable read&#xff08;默認&#xff09;4.1、解決…

解決docker鏡像pull失敗的有效

機器環境 本實踐將在 Ubuntu 22.04.3LTS 系統上進行測試 docker 版本Docker Engine - Community 24.0.6 &#xff0c;原則上docker版本無影響 本實踐進僅學習研究使用&#xff0c;無作他用途。 背景 曾幾何時&#xff0c;docker鏡像的拉去會失敗&#xff0c;網速會慢&#xff0…

代碼隨想錄算法訓練營第五十三天| 739. 每日溫度、 496.下一個更大元素 I、503.下一個更大元素II

LeetCode 739. 每日溫度 題目鏈接&#xff1a;https://leetcode.cn/problems/daily-temperatures/description/ 文章鏈接&#xff1a;https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html 思路 * 單調棧的本質是空間換時間&#xff0c;因為在遍歷的過…

【論文閱讀】transformer及其變體

寫在前面&#xff1a; transformer模型已經是老生常談的一個東西&#xff0c;以transformer為基礎出現了很多變體和文章&#xff0c;Informer、autoformer、itransformer等等都是頂刊頂會。一提到transformer自然就是注意力機制&#xff0c;變體更是數不勝數&#xff0c;一提到…

【目標檢測】DN-DETR

一、引言 論文&#xff1a; DN-DETR: Accelerate DETR Training by Introducing Query DeNoising 作者&#xff1a; IDEA 代碼&#xff1a; DN-DETR 注意&#xff1a; 該算法是在DAB-DETR基礎上的改進&#xff0c;在學習該算法前&#xff0c;建議掌握DETR、DAB-DETR等相關知識…

TCP和UDP的區別以及應用場景

TCP&#xff08;傳輸控制協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;是兩種不同的傳輸層協議 區別 TCP是面向連接的&#xff0c;UDP是無連接的&#xff1b; TCP是可靠的&#xff0c;UDP是不可靠的&#xff1b; TCP是面向字節流的&#xff0c;UDP是面向數據…

如何高效配置與使用Pip換源

目錄 1. Pip源的基本概念 1.1 常見的國內鏡像源 2. 臨時換源 2.1 使用命令行參數指定鏡像源 2.2 安裝多個包時指定鏡像源 3. 永久換源 3.1 修改用戶級配置文件 3.1.1 創建和編輯配置文件 3.2 修改全局配置文件 3.2.1 創建和編輯全局配置文件 4. 驗證換源配置 5. 切…

VMamba: Visual State Space Model論文筆記

文章目錄 VMamba: Visual State Space Model摘要引言相關工作Preliminaries方法網絡結構2D-Selective-Scan for Vision Data(SS2D) VMamba: Visual State Space Model 論文地址: https://arxiv.org/abs/2401.10166 代碼地址: https://github.com/MzeroMiko/VMamba 摘要 卷積神…

防火墻共性檢測技術

防火墻共性檢測技術 防火墻共性檢測技術是指防火墻在監控和控制網絡流量時&#xff0c;共同采用的一些檢測和過濾方法。無論是哪種類型的防火墻&#xff0c;這些技術都可以用于識別和阻止惡意流量&#xff0c;確保網絡安全。以下是防火墻共性檢測技術的詳細介紹&#xff0c;包…

axios的基本使用和vue腳手架自帶的跨域問題解決

axios的基本使用和vue腳手架自帶的跨域問題解決 1. axios 1.1 導入axios npm i axios1.2 創建serve1.js serve1.js const express require(express) const app express()app.use((request,response,next)>{console.log(有人請求服務器1了);console.log(請求來自于,re…

go Channel 原理 (一)

Channel 設計原理 不要通過共享內存的方式進行通信&#xff0c;而是應該通過通信的方式共享內存。 在主流編程語言中&#xff0c;多個線程傳遞數據的方式一般都是共享內存。 Go 可以使用共享內存加互斥鎖進行通信&#xff0c;同時也提供了一種不同的并發模型&#xff0c;即通…

npm ci vs npm i

npm ci vs npm i 幾個關鍵區別&#xff1a;該選擇哪個&#xff1f; 通過 npm ci 和 npm i 兩個命令&#xff0c;都可安裝項目的依賴。那么這兩個命令有什么區別呢&#xff1f; 幾個關鍵區別&#xff1a; 目的和用途&#xff1a; npm ci &#xff1a;根據項目中的 package-lock…

AI奏響未來樂章:音樂界的革命性變革

AI在創造還是毀掉音樂 引言 隨著科技的飛速發展&#xff0c;人工智能&#xff08;AI&#xff09;正在逐漸滲透到我們生活的每一個角落&#xff0c;音樂領域也不例外。AI技術的引入&#xff0c;不僅為音樂創作、教育、體驗帶來了革命性的變革&#xff0c;更為整個音樂產業注入了…