K8S - NetworkPolicy的使用

  • 1 前置條件
  • 2 控制范圍
  • 3 隔離類型
  • 4 如何識別
  • 5 主要字段
  • 6 案例演示

前置條件

網絡策略通過網絡插件來實現。 要使用網絡策略,你必須使用支持 NetworkPolicy 的網絡解決方案。 創建一個 NetworkPolicy 資源對象而沒有控制器來使它生效的話,是沒有任何作用的。那么如何查看我們的集群中是否有這個資源呢?如果你使用的CNI網絡查件是Flannel, 是不支持的, Calico是支持的.

檢查API版本兼容性
]# kubectl api-versions | grep networking.k8s.io
networking.k8s.io/v1
]# kubectl api-resources | grep -i networkpolicy
globalnetworkpolicies                          crd.projectcalico.org/v1               false        GlobalNetworkPolicy
networkpolicies                                crd.projectcalico.org/v1               true         NetworkPolicy
networkpolicies                   netpol       networking.k8s.io/v1                   true         NetworkPolicy

在這里插入圖片描述
下面我們簡單創建一個networkpolicy資源來檢查下是否能正常使用.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-policy
spec:podSelector: {}policyTypes:- Ingress]# kubectl apply -f networkpolicy_functest.yaml
]# kubectl get networkpolicy   #可以看到創建成功了

在這里插入圖片描述

控制范圍

OSI 第 3 層或第 4 層. 如果你想在7層控制流量,可以考慮使用istio,后面我會專門演示istio的使用案例

隔離類型

  1. 出口的隔離 policyTypes: “Egress”
  2. 入口的隔離 policyTypes: “Ingress”

如何識別

???Pod 可以與之通信的實體是通過如下三個標識符的組合來辯識的:

  • 其他被允許的 Pod(例外:Pod 無法阻塞對自身的訪問)
  • 被允許的名字空間
  • IP 組塊(例外:與 Pod 運行所在的節點的通信總是被允許的, 無論 Pod 或節點的 IP 地址)

主要字段

apiVersion : 必須字段,不同版本可能group和version有所差別,通過explain命令可以查看當前k8s版本支持的apiVersion,如下圖所示,我的k8s版本是1.28,所以他的networkpolicy 接口的apiVersion應該是 networking.k8s.io/v1
在這里插入圖片描述

kind : 必須字段, 填NetworkPolicy
metadata : 必須字段,需要指定一些元數據,例如name
spec : 包含了在一個名字空間中定義特定網絡策略所需的所有信息
podSelector : 對該策略所適用的一組 Pod 進行選擇。示例中的策略選擇帶有 “role=db” 標簽的 Pod。 空的 podSelector 選擇名字空間下的所有 Pod。
policyTypes : 包含 Ingress 或 Egress 或兩者兼具。policyTypes 字段表示給定的策略是應用于進入所選 Pod 的入站流量還是來自所選 Pod 的出站流量,或兩者兼有。 如果 NetworkPolicy 未指定 policyTypes 則默認情況下始終設置 Ingress; 如果 NetworkPolicy 有任何出口規則的話則設置 Egress。
ingress : 每個 NetworkPolicy 可包含一個 ingress 規則的白名單列表。 每個規則都允許同時匹配 from 和 ports 部分的流量。
egress : 每個 NetworkPolicy 可包含一個 egress 規則的白名單列表。 每個規則都允許匹配 to 和 ports 部分的流量。

下面我們來分析一個示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-network-policynamespace: default
spec:podSelector:matchLabels:role: dbpolicyTypes:- Ingress- Egressingress:- from:- ipBlock:cidr: 172.17.0.0/16except:- 172.17.1.0/24- namespaceSelector:matchLabels:project: myproject- podSelector:matchLabels:role: frontendports:- protocol: TCPport: 6379egress:- to:- ipBlock:cidr: 10.0.0.0/24ports:- protocol: TCPport: 5978該示例表達的是:1. 隔離 default 名字空間下 role=db 的 Pod 2. Ingress 規則)允許以下 Pod 連接到 default 名字空間下的帶有 role=db 標簽的所有 Pod 的 6379 TCP 端口:- default 名字空間下帶有 role=frontend 標簽的所有 Pod- 帶有 project=myproject 標簽的所有名字空間中的 Pod- IP 地址范圍為 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)3. (Egress 規則)允許 default 名字空間中任何帶有標簽 role=db 的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的連接。

## 案例演示
下面我來演示一個案例. 我已經安裝好了一個k8s集群 版本是1.28的, 而且部署好了monitoring. 我們就簡單的拿grafana來舉個例子, grafana我開放了兩種訪問方式,
一種是4層,通過NodePort方式,
一種是創建了Ingress七層訪問,不過他們的最終鏈路都是一樣的

在這里插入圖片描述

可以看到不管是瀏覽器還是curl,都正常跳轉和返回數據

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述

可以看到目前我訪問grafana頁面正常,下面是我的ing和svc資源

在這里插入圖片描述
在這里插入圖片描述
下面我創建networkpolicy資源,yaml如下

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: grafana-network-policynamespace: monitoring
spec:podSelector:matchLabels:app.kubernetes.io/name: grafana policyTypes:- Ingressingress:- from:- ipBlock:cidr: 10.233.58.225/32ports:- protocol: TCPport: 80 
我來apply 一下

在這里插入圖片描述

ok. 已經生效. 我們再次訪問grafana測試下

在這里插入圖片描述
在這里插入圖片描述

為了驗證下這個networkpolicy確實只作用于monitoring命名空間下的grafana這個pod上,我們進入Alert
Pod去nc 探測grafana svc的端口是否被阻斷。

在這里插入圖片描述

那我們進入Grafana的pod上去反向探測下alert端口。

在這里插入圖片描述

可以看到,符合預期. 下面我們刪除networkpolicy.在測試下

在這里插入圖片描述

再次從alert pod內部去nc grafana的Svc:80端口。

在這里插入圖片描述在這里插入圖片描述

網頁也恢復正常. 后面我會測試7層 service mesh相關的Istio案例.

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

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

相關文章

Linux:TCP協議

TCP是一個面向連接的、可靠的、基于字節流的傳輸層協議。文次我們會通過介紹TCP的報頭并通過分析各字段的用途來進一步解釋其核心特性:可靠傳輸: 有確認應答、超時重傳、確保有序。流量控制和擁塞控制: 動態調節發送速率,防止丟包與擁塞。面向…

uniapp使用map打包app后自定義氣泡不顯示解決方法customCallout

前言:使用uniapp開發后在小程序可以正常顯示,但是運行打包成App后就不顯示了,其實這一塊對于uniapp框架開發來說,是有系統性的bug,如果你再開發時使用的是vue文件進行,就會出現這個問題。解決方法&#xff…

【typenum】 22 類型級別二進制對數運算(Logarithm2)

一、源碼 這段代碼實現了一個類型級別的二進制對數運算系統 定義(type_operators.rs) /// A **type operator** for taking the integer binary logarithm of Self. /// /// The integer binary logarighm of n is the largest integer m such /// that …

golang 非error錯誤分類

1.應用級別,可recover這些 panic 一般是 邏輯或使用不當導致的運行時錯誤,Go 程序可以用 recover 捕獲并繼續運行:類型示例描述類型不一致atomic.Value 存不同類型 v.Store(100); v.Store("abc")panic: store of inconsistently ty…

【Ansible】變量與敏感數據管理:Vault加密與Facts采集詳解

1. 變量Ansible利用變量存儲可重復使用的值,可以簡化項目的創建和維護,減少錯誤數量。1.1 變量名稱由字符串組成,必須以字母開頭,并且只能含有字母、數字和下劃線,和其它編程語言很類似。1.2 常見變量要創建的用戶要安…

ROS2下YOLO+Moveit+PCL機械臂自主避障抓取方案

整體運行架構 1.運行相機取像節點 . ./install/setup.bash ros2 launch orbbec_camera gemini_330_series.launch.py depth_registration:true 2.運行根據圖像x,y獲取z的service 基本操作記錄: 創建python包,在src目錄下 ros2 pkg create test_python_topic --bu…

快速入門Vue3——初體驗

目錄 前言 一、搭建環境 1.1、安裝Node.js 1.2、安裝Vite 二、項目創建 三、運行項目 四、集成Pinia 4.1、Pinia介紹 4.2、Pinia安裝 五、集成VueUse 5.1、vueuse簡介 5.2、vueuse安裝 六、集成Vant 6.1、Vant簡介 6.2、Vant安裝 前言 本專欄主要介紹如何使用…

深入理解Kubernetes核心:標簽與標簽選擇器實戰解析

在管理 Kubernetes 集群時,隨著 Pods、Services 等資源數量的增長,如何有效地組織和篩選它們,成為了一個核心問題。Kubernetes 為此提供了一個簡單卻極其強大的機制:標簽(Labels)和標簽選擇器(L…

哈希和字符串哈希

哈希(Hash) Hash 表 Hash 表又稱為散列表,一般由 Hash 函數(散列函數)與鏈表結構共同實現。與離散化思想類似,當我們要對若干復雜信息進行統計時,可以用 Hash 函數把這些復雜信息映射到一個容…

【Docker基礎】Docker-Compose核心配置文件深度解析:從YAML語法到高級配置

目錄 前言 1 YAML基礎語法解析 1.1 YAML格式簡介 1.2 Docker-compose中的YAML語法規則 1.3 YAML數據類型在Compose中的應用 2 docker-compose.yml文件結構剖析 2.1 基本文件結構 2.2 版本聲明詳解 3 services配置深度解析 3.1 服務定義基礎 3.2 鏡像與構建配置 3.3…

如何判斷是否應該為了一個小功能而引入一個大體積的庫

在軟件開發中,判斷是否應該為了一個看似微小的功能,而引入一個大體積的第三方庫,是一項極其重要的、需要進行審慎的“投入產出比”分析的技術決策。這個決策,絕不能,僅僅基于“實現功能的便利性”,而必須&a…

相機定屏問題分析五:【跳幀異常】照片模式1x以上的焦段拍照之后定屏

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 相機定屏問題分析五:【跳幀異常】照片模式1x以上的焦段拍照之后定屏9573412 目錄 一、問題背景 二…

Non-stationary Diffusion For Probabilistic Time Series Forecasting論文閱讀筆記

Non-stationary Diffusion For Probabilistic Time Series Forecasting 摘要 時間序列數據受到潛在的物理動力學和外部影響,其不確定性通常隨時間而變化。現有的去噪擴散概率模型(DDPMs)受到加性噪聲模型(ANM)的恒定方…

解決Docker 無法連接到官方鏡像倉庫

這個錯誤: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)表示 Docker 無法連接到官方鏡像倉庫 registry-1.docker…

解決RAGFlow啟動時Elasticsearch容器權限錯誤的技術指南

文章目錄 問題現象 根本原因分析 解決方案步驟 1. 定位宿主機數據目錄 2. 修復目錄權限 3. 驗證權限狀態 4. 重啟服務 5. 檢查啟動狀態 永久解決方案:優化Docker Compose配置 高級故障排除 技術原理 問題現象 在啟動RAGFlow項目時,執行 docker logs ragflow-es-01 發現Elast…

【C++高階六】哈希與哈希表

【C高階六】哈希與哈希表1.什么是哈希?2.unordered系列容器3.哈希表3.1將key與存儲位置建立映射關系3.1.1直接定址法3.1.2除留余數法(產生哈希沖突)3.2解決哈希沖突的方法3.2.1閉散列(開放定址法)3.3.2開散列&#xff…

Vue 3 +Ant Design Vue 父容器樣式不影響子級,隔離

公共樣式文件 common.scss.zz-ant-status-bar {div {font-size: 12px;padding: 0 8px;} }頁面代碼<div class"zz-ant-status-bar"><a-row><a-col :span"6" ><a-progress :percent"progress.percent" size"small"…

k8s 簡介及部署方法以及各方面應用

Kubernetes 簡介及部署方法Kubernetes&#xff08;簡稱 K8s&#xff09;是一個開源的容器編排平臺&#xff0c;用于自動化容器化應用的部署、擴展、管理和運維。它由 Google 基于內部的 Borg 系統經驗開發&#xff0c;2014 年開源后由云原生計算基金會&#xff08;CNCF&#xf…

Class A 包含字段 x Class B 也包含字段 x,如果判斷List<A> lista 和 List<B> listb 有相同的 x?

要判斷兩個不同類型的對象列表 List<A> 和 List<B> 是否包含相同的 x字段值&#xff08;即兩個列表中至少有一個 x是相同的&#xff09;&#xff0c;你可以使用 Java 8 的 Stream API 來實現。import java.util.List; import java.util.Set; import java.util.stre…

SpringBoot整合Camunda工作流

什么是工作流&#xff1f;概述 工作流是將一組任務組織起來以完成某個經營過程&#xff1a;定義了任務的觸發順序和觸發條件&#xff0c;每個任務可以由一個或多個軟件系統完成&#xff0c;也可以由一個或一組人完成&#xff0c;還可以由一個或多個人與軟件系統協作完成&#x…