計模式:以應(yīng)用為中心控制 TCP/UDP/SCTP 流量)
云原生微服務(wù)運(yùn)維DevOps【免費下載鏈接】mesheryMeshery, the cloud native manager項目地址https://gitcode.com/GitHub_Trending/me/meshery點擊查看免費下載本文圍繞 Meshery 官方 Catalog 中的 “Network policy” 流量管理設(shè)計patternId7b2e40b0-3cc8-4da3-bccd-b66bc6cd206a展開講解如何在 Meshery 中以可視化設(shè)計與 YAML 兩種方式構(gòu)建 Kubernetes NetworkPolicy并深入解析其 Ingress/Egress 規(guī)則、選擇器語義與底層組件 Schema幫助你掌握一套開箱即用的集群網(wǎng)絡(luò)隔離落地模板。為什么要用 NetworkPolicy 管理集群流量在 Kubernetes 集群中Pod 之間的流量默認(rèn)是“全通”的。當(dāng)你希望在 IP 地址或端口級別控制 TCP、UDP 與 SCTP 協(xié)議的流量流向時Kubernetes 提供的NetworkPolicy是首選原語。它不是一個服務(wù)網(wǎng)格能力而是一個**以應(yīng)用為中心application-centric**的構(gòu)造它描述的是“某個 Pod 被允許與哪些網(wǎng)絡(luò)實體通信”這里的“實體”entity是官方刻意選擇的措辭用于避免與 Kubernetes 中已有特定語義的術(shù)語如endpoints、services產(chǎn)生歧義。NetworkPolicy 作用于一端或兩端都連接 Pod 的連接對于不涉及 Pod 的連接并不生效。也就是說它是圍繞工作負(fù)載Pod做細(xì)粒度放行規(guī)則而不是圍繞節(jié)點或網(wǎng)段做防火墻。在 Meshery 中這類策略被封裝為可復(fù)用的 Catalog 設(shè)計。本次分析的示例設(shè)計即是一個同時定義了Ingress入站與Egress出站規(guī)則的樣例策略官方 Caveats 明確指出This is a sample network policy with ingress, egress defined, change according to your requirements——即它是供你按業(yè)務(wù)需求修改的起點模板。設(shè)計藍(lán)圖這份 NetworkPolicy 到底做了什么Meshery Catalog 的每個設(shè)計都以 JSON/YAML 形式存儲在 docs/data/catalog 目錄下本文對應(yīng)文件為 7b2e40b0-3cc8-4da3-bccd-b66bc6cd206a/0.0.1/design.yml。該設(shè)計由以下組件與關(guān)系組成一個Namespacedefault組件作為策略的承載命名空間也是層級關(guān)系的父節(jié)點一個NetworkPolicynetwork-policy-policy組件apiVersion為networking.k8s.io/v1配置了完整的spec一條hierarchical / parent關(guān)系將defaultNamespace 作為父組件NetworkPolicy 的metadata.namespace由父組件繼承補(bǔ)齊。從design.yml的configuration字段可以還原出等價的 Kubernetes 清單apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: network-policy-policy namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978逐字段拆解規(guī)則語義字段示例取值語義說明spec.podSelectorrole: db策略作用的目標(biāo) Pod 集合空選擇器表示匹配策略所在命名空間內(nèi)的所有 Pod。多個策略可以同時選中同一批 Pod規(guī)則是**累加additive**生效的spec.policyTypes[Ingress, Egress]聲明本策略管轄的規(guī)則類型。注意若只寫了egress規(guī)則而不顯式聲明policyTypes: [Egress]策略會默認(rèn)同時影響 Ingress可能導(dǎo)致意外隔離ingress[].from命名空間選擇器 Pod 選擇器from列表內(nèi)各項是OR關(guān)系來自projectmyproject命名空間內(nèi)任意 Pod或本命名空間內(nèi)rolefrontend的 Pod 均被允許ingress[].portsTCP 6379端口列表內(nèi)各項同樣是OR關(guān)系只有同時匹配端口與來源的流量才被放行egress[].toipBlock: 10.0.0.0/24出站目標(biāo)這里用 IPBlock 而非選擇器適合表達(dá)對某個子網(wǎng)網(wǎng)段的放行egress[].portsTCP 5978出站端口約束規(guī)則要求同時滿足to與ports才會放行上述from/to中三類對端描述方式對應(yīng) KubernetesNetworkPolicyPeer的三種形態(tài)語義上相互排斥同一 peer 只能設(shè)置其中一種podSelector選擇策略所在命名空間內(nèi)的 Pod若與namespaceSelector同時出現(xiàn)則選擇“由 namespaceSelector 選中的命名空間內(nèi)、匹配 podSelector 的 Pod”namespaceSelector按集群級命名空間標(biāo)簽選擇命名空間為空時選中所有命名空間ipBlock用 CIDR 指定網(wǎng)段如192.168.1.0/24或2001:db8::/64并可通過except字段在 CIDR 范圍內(nèi)排除部分地址。兩個容易踩坑的默認(rèn)行為端口缺省ports為空或缺失時規(guī)則匹配所有端口protocol缺省時默認(rèn)TCP。因此“只寫from不寫ports”意味著放行該來源的所有端口流量請務(wù)必按最小權(quán)限原則補(bǔ)齊端口。Egress-only 必須顯式聲明官方 Schema 明確指出如果要寫一條只影響出站的策略必須顯式指定policyTypes: [Egress]否則 Kubernetes 會把策略同時視為 Ingress 策略導(dǎo)致目標(biāo) Pod 入站流量也被隔離。這些字段的權(quán)威描述直接內(nèi)嵌在倉庫的 Kubernetes 模型定義中models/kubernetes/v1.35.0/v1.0.0/components/NetworkPolicy.jsoncomponent.schema字段完整覆蓋了ingress、egress、podSelector、policyTypes、NetworkPolicyPort、IPBlock等結(jié)構(gòu)的類型、默認(rèn)值與約束是核對字段行為的可靠參考。在 Meshery 中使用這份設(shè)計方式一用 mesheryctl 導(dǎo)入Catalog 設(shè)計的標(biāo)準(zhǔn)消費方式是通過mesheryctl design import將設(shè)計文件導(dǎo)入到你的 Meshery 實例。命令用法如下mesheryctl design import -f [file/URL] -s [source-type] -n [name]對應(yīng)當(dāng)前設(shè)計你可以直接導(dǎo)入倉庫中已存在的數(shù)據(jù)文件mesheryctl design import -f docs/data/catalog/7b2e40b0-3cc8-4da3-bccd-b66bc6cd206a/0.0.1/design.yml -s Meshery Design -n network-policy參數(shù)說明-f, --file設(shè)計文件的本地路徑或可直接下載的遠(yuǎn)程 URL如 GitHub raw 直鏈-s, --source-type源文件類型可選Helm Chart、Kubernetes Manifest、Meshery Design、Docker Compose不傳時由 Meshery 自動識別YAML 與 TGZ僅 Helm均可Meshery Design 還支持 OCI 格式-n, --name導(dǎo)入后設(shè)計名稱缺省時以文件名作為名稱。從源碼看導(dǎo)入流程的調(diào)用鏈位于 mesheryctl/internal/cli/root/design/import.goCLI 將sourceType映射為內(nèi)部枚舉K8sManifest、MesheryDesign、HelmChart、DockerCompose構(gòu)造POST {baseMesheryURL}/api/pattern/import請求體本地文件以MesheryPatternImportFilePayload攜帶fileName與文件內(nèi)容提交遠(yuǎn)程 URL 則以MesheryPatternImportURLPayload提交服務(wù)端返回已保存設(shè)計[]*models.MesheryPatternCLI 打印導(dǎo)入成功信息與設(shè)計 IDutils.TruncateID截斷顯示。倉庫的端到端測試 mesheryctl/tests/e2e/003-design/01-design-import.bats 也驗證了mesheryctl design import -f nginx.yaml --source-type Kubernetes Manifest的成功輸出包含imported/Design ID/saved等關(guān)鍵詞可作為導(dǎo)入命令的驗收基準(zhǔn)。方式二在 Meshery UI 的畫布上可視化編輯Catalog 中該設(shè)計的 UI 元數(shù)據(jù)位于 docs/catalog/traffic-management/7b2e40b0-3cc8-4da3-bccd-b66bc6cd206a.md說明它歸屬traffic-management類型兼容kubernetes平臺并攜帶 0.0.1 的發(fā)布版本號。你可以在 Meshery 的Designs設(shè)計畫布中從調(diào)色板拖入NetworkPolicy組件Kubernetes 模型版本networking.k8s.io/v1并為其配置Workload Configuration編輯spec將Namespace拖入畫布后通過Compound Drag And Drop把 NetworkPolicy 放入命名空間內(nèi)畫布會自動建立 hierarchical 的 parent 關(guān)系并將命名空間名稱寫入策略的metadata.namespace在設(shè)計中關(guān)聯(lián)真實集群連接后通過Deploy部署動作把策略應(yīng)用到目標(biāo) Kubernetes 環(huán)境。畫布上的 NetworkPolicy 節(jié)點樣式圓形、#326CE5主色與全部可執(zhí)行能力性能測試、配置、關(guān)系查看、Schema 查看、形狀修改、復(fù)合拖放等均定義在組件的styles與capabilities字段中這些能力同時被設(shè)計文件design.yml和模型定義 NetworkPolicy.json 所引用保證了“設(shè)計即代碼”的一致體驗。結(jié)合源碼理解Meshery 如何把設(shè)計變成集群策略Meshery 的組件模型components.meshery.io/v1beta1將每一個 Kubernetes 資源都描述為kind schema capabilities的元數(shù)據(jù)組合。對本設(shè)計而言組件識別component.kind為NetworkPolicyversion為networking.k8s.io/v1schema 內(nèi)嵌完整的 OpenAPI 描述來源標(biāo)注為git://github.com/kubernetes/kubernetes/master/api/openapi-spec/v3關(guān)系推斷設(shè)計與 Namespace 之間使用hierarchical/parent關(guān)系selectors定義了 patch 方向——父組件的displayName會被寫入子組件的configuration.metadata.namespace。這意味著在畫布中只要把策略拖入命名空間命名空間歸屬就會被自動補(bǔ)全無需手寫metadata.namespace部署語義導(dǎo)入后的設(shè)計designs.meshery.io/v1beta1即可通過mesheryctl design apply/deploy或 UI 部署到已連接的集群。這種“組件 關(guān)系”的建模方式意味著你看到的這張畫布NetworkPolicy 掛在一個 default Namespace 下本質(zhì)上就是一份完整的、可版本化、可導(dǎo)入導(dǎo)出的基礎(chǔ)設(shè)施即代碼IaC與手寫的 YAML 清單在部署結(jié)果上等價。實戰(zhàn)建議如何把樣例改造成你的生產(chǎn)策略官方將本設(shè)計定位為“按需修改的樣例”。結(jié)合上述規(guī)則語義給出三條改造建議收緊 Ingress 來源示例同時放行了projectmyproject命名空間與rolefrontendPod 兩類來源OR 語義。生產(chǎn)環(huán)境中建議按真實調(diào)用關(guān)系刪除多余分支僅保留必要的調(diào)用方為 Egress 補(bǔ)充端口矩陣出站規(guī)則只放行了10.0.0.0/24網(wǎng)段的TCP 5978。如果工作負(fù)載還需訪問 DNSUDP 53或?qū)ο蟠鎯π枰芳訉?yīng)規(guī)則否則流量會被策略攔截Kubernetes 會據(jù)此在兼容的 CNI 上生成流表顯式聲明 policyTypes無論規(guī)則如何裁剪都建議顯式寫出policyTypes: [Ingress, Egress]或只寫需要的類型避免依賴隱式默認(rèn)值帶來的語義漂移。改造完成后通過mesheryctl design import重新導(dǎo)入、或直接在畫布中保存為新的設(shè)計版本即可納入 Meshery 的統(tǒng)一設(shè)計與部署流程。延伸閱讀本設(shè)計的 Catalog 入口文檔docs/catalog/traffic-management/7b2e40b0-3cc8-4da3-bccd-b66bc6cd206a.md設(shè)計數(shù)據(jù)文件含完整組件與關(guān)系定義docs/data/catalog/7b2e40b0-3cc8-4da3-bccd-b66bc6cd206a/0.0.1/design.ymlNetworkPolicy 組件模型與字段 Schemamodels/kubernetes/v1.35.0/v1.0.0/components/NetworkPolicy.json設(shè)計導(dǎo)入命令實現(xiàn)與測試mesheryctl/internal/cli/root/design/import.go、mesheryctl/tests/e2e/003-design/01-design-import.bats更多同類流量管理設(shè)計可參考 docs/catalog/traffic-management 目錄下的其余條目贊分享云原生微服務(wù)運(yùn)維DevOps【免費下載鏈接】mesheryMeshery, the cloud native manager項目地址https://gitcode.com/GitHub_Trending/me/meshery點擊查看免費下載相關(guān)推薦在 Meshery 中通過 Catalog 設(shè)計模式為 Kubernetes Pod 配置資源限制在 Meshery 中通過 Catalog 設(shè)計模式為 Kubernetes Pod 配置資源限制 本篇技術(shù)指南圍繞 Meshery Catalog 中的 Po云原生微服務(wù)運(yùn)維DevOpsMeshery Edge Firewall 關(guān)系解析基于 NetworkPolicy 的 Pod 間流量管控設(shè)計實踐Meshery Edge Firewall 關(guān)系解析基于 NetworkPolicy 的 Pod 間流量管控設(shè)計實踐 導(dǎo)讀 本文圍繞 Meshery Cata云原生微服務(wù)運(yùn)維DevOpsLynx list 元素完全指南從選型決策、屬性事件到引擎?zhèn)葘崿F(xiàn)原理Lynx list 元素完全指南從選型決策、屬性事件到引擎?zhèn)葘崿F(xiàn)原理 本篇圍繞 Lynx 倉庫中 ai/skills/lynx api docs 技能包內(nèi)的云原生微服務(wù)運(yùn)維DevOps上一篇終極NS模擬器管理神器讓你的Switch游戲體驗輕松起飛下一篇NS模擬器管理困境的終結(jié)者NsEmuTools如何重塑你的游戲體驗創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考