二十四、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.pswp.cn/web/66499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66499.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66499.shtml

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

相關文章

Python Web應用開發入門:從零搭建一個簡單的Web應用

引言 在當今的互聯網時代,Web應用已經成為我們日常生活中不可或缺的一部分。無論是社交媒體、電子商務,還是在線教育,Web應用都在背后發揮著重要作用。Python作為一種簡潔、強大的編程語言,在Web開發領域也有著廣泛的應用。本文將帶你從零開始,使用Python搭建一個簡單的W…

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

目錄 一、POI導入導出 1.數據庫導出為Excel文件 2.將Excel文件導入到數據庫中 二、Hutool導入導出 1.數據庫導出為Excel文件——屬性名是列名 2.數據庫導出為Excel文件——列名起別名 3.從Excel文件導入數據到數據庫——屬性名是列名 4.從Excel文件導入數據到數據庫…

下載文件,瀏覽器阻止不安全下載

背景: 在項目開發中,遇到需要下載文件的情況,文件類型可能是圖片、excell表、pdf、zip等文件類型,但瀏覽器會阻止不安全的下載鏈接。 效果展示: 下載文件的兩種方式: 一、根據接口的相對url,拼…

第15章:Python TDD應對貨幣類開發變化(二)

寫在前面 這本書是我們老板推薦過的,我在《價值心法》的推薦書單里也看到了它。用了一段時間 Cursor 軟件后,我突然思考,對于測試開發工程師來說,什么才更有價值呢?如何讓 AI 工具更好地輔助自己寫代碼,或許…

CSS 動畫相關屬性

定義和用法 一些 CSS 屬性可用于動畫制作,這意味著它們可用于過渡等效果中。 可設置動畫的屬性可以從一個值逐漸更改為另一個值,例如尺寸、數字、百分比和顏色。 瀏覽器支持 表格中的數字注明了完全支持 CSS 動畫的首個瀏覽器版本。 -webkit-、-moz…

SD/MMC驅動開發

一、介紹 MMC的全稱是”MultiMediaCard”――所以也通常被叫做”多媒體卡”,是一種小巧大容量的快閃存儲卡,特別應用于移動電話和數字影像及其他移動終端中。MMC存貯卡只有7pin,可以支持MMC和SPI兩種工作模式。 SD卡,數字安全記憶卡&#xf…

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

作者:來自 Elastic Gustavo Llermaly 將我們的 Jira 內容索引到 Elaasticsearch 中以創建統一的數據源并使用文檔級別安全性進行搜索。 在本文中,我們將回顧 Elastic Jira 原生連接器的一個用例。我們將使用一個模擬項目,其中一家銀行正在開發…

《探索煙霧目標檢測開源項目:技術與應用的深度剖析》

一、引言 在現代社會,火災猶如高懸的達摩克利斯之劍,時刻威脅著人們的生命財產安全。煙霧,作為火災發生的重要征兆,其及時、準確的檢測對于火災預防和控制起著舉足輕重的作用。煙霧目標檢測技術猶如敏銳的 “電子哨兵”&#xff…

Linux操作系統的靈魂,深度解析MMU內存管理

在計算機的奇妙世界里,我們每天使用的操作系統看似流暢自如地運行著各類程序,背后實則有著一位默默耕耘的 “幕后英雄”—— 內存管理單元(MMU)。它雖不常被大眾所熟知,卻掌控著計算機內存的關鍵命脈,是保障…

3.2 OpenAI 語言模型總覽:GPT 系列的演進與應用解析

OpenAI 語言模型總覽:GPT 系列的演進與應用解析 OpenAI 的語言模型,特別是 GPT(Generative Pre-trained Transformer)系列,代表了當前自然語言處理(NLP)技術的前沿。自從推出以來,這些模型不斷推進了文本生成、理解和交互的能力,成為了多個應用場景中的核心技術。本文…

【云嵐到家】-day02-客戶管理-認證授權

第二章 客戶管理 1.認證模塊 1.1 需求分析 1.基礎概念 一般情況有用戶交互的項目都有認證授權功能,首先我們要搞清楚兩個概念:認證和授權 認證: 就是校驗用戶的身份是否合法,常見的認證方式有賬號密碼登錄、手機驗證碼登錄等 授權:則是該用…

Thinkphp8 Apidoc 實際使用中遇到的問題解決

1. 接口去掉 Controller 問題: 正確的路徑應該是/api/login/register, 這塊controller有沒有地方配置的? 2. 自定義成功,錯誤消息有沒有辦法? 未完成, 待更新

2024春秋杯密碼題第一、二天WP

你是小哈斯? 題目內容: 年輕黑客小符參加CTF大賽,他發現這個小哈斯文件的內容存在高度規律性,并且文件名中有隱藏信息,他成功找到了隱藏的信息,并破解了挑戰。得意地說:“成功在于探索與質疑&#xff0c…

opencv對直方圖的計算和繪制

【歡迎關注編碼小哥,學習更多實用的編程方法和技巧】 1、直方圖的計算 cv::calcHist 是 OpenCV 中用于計算圖像直方圖的函數。它可以處理多通道圖像,并通過指定圖像、通道、掩膜、直方圖大小和范圍等參數來生成直方圖。 函數原型 void cv::calcHist(…

C++的auto_ptr智能指針:從誕生到被棄用的歷程

C作為一種功能強大的編程語言,為開發者提供了眾多便捷的特性和工具,其中智能指針是其重要特性之一。智能指針能夠自動管理內存,有效避免內存泄漏等常見問題。然而,并非所有智能指針都盡善盡美,auto_ptr便是其中的一個例…

游戲開發中常用的設計模式

目錄 前言一、工廠模式二、單例模式三、觀察者模式觀察者模式的優勢 四、狀態模式狀態模式的優勢 五、策略模式策略模式的優勢策略模式與狀態模式有什么區別呢? 六、組合模式七、命令模式八、裝飾器模式 前言 本文介紹了游戲開發中常用的設計模式,如工廠模式用于創…

C++并發編程之異常安全性增強

在并發編程中,異常安全是一個非常重要的方面,因為并發環境下的錯誤處理比單線程環境更加復雜。當多個線程同時執行時,異常不僅可能影響當前線程,還可能影響其他線程和整個程序的穩定性。以下是一些增強并發程序異常安全性的方法&a…

各語言鏡像配置匯總

鏡像配置匯總 Nodejs [ npm ]Python [ pip ] Nodejs [ npm ] // # 記錄日期:2025-01-20// 查詢當前使用的鏡像 npm get registry// 設置淘寶鏡像 npm config set registry https://registry.npmmirror.com/// 恢復為官方鏡像 npm config set registry https://regi…

Navicat Premium 數據可視化

工作區,數據源以及圖表 數據可視化是使用可視化組件(例如圖表,圖形和地圖)的信息和數據的圖形表示。 數據可視化工具提供了一種可訪問的方式,用于查看和理解數據中的趨勢,異常值和其他模式。 在Navicat中&…

linux通過web向mac遠程傳輸字符串,mac收到后在終端中直接打印。

要通過Web從Linux向Mac遠程傳輸字符串,并在Mac的終端中直接打印,可以使用以下方法。這里假設Linux作為服務器,Mac作為客戶端。 方法 1:使用Python的HTTP服務器 在Linux上啟動一個簡單的HTTP服務器,Mac通過curl獲取字符…