Kubernetes 跨集群流量調度實戰 :訪問控制

背景

眾所周知,Flomesh 的服務網格產品?osm-edge[1]?是基于 SMI(Service Mesh Interface,服務網格接口) 標準的實現。SMI 定義了流量標識、訪問控制、遙測和管理的規范。在?上一篇?中,我們體驗過了多集群服務(Multi-Cluster Service,MCS),以及流量在多集群中的調度策略,屬于最基本最基礎的能力,這篇會帶大家體驗一下基于 SMI 實現的跨集群訪問控制。

在開始之前,先回顧一下?SMI 訪問控制的規范[2]。在 osm-edge 中的?流量策略有兩種形式[3]寬松模式?和?流量策略模式。前者允許網格中的服務互相訪問,后者需要提供相應的流量策略才可以訪問。

SMI 訪問控制策略

在流量策略模式下,SMI 通過 CRD?TrafficTarget?來定義基于?ServiceAccount?的訪問控制,其中定義了流量源(sources)、目標(destinations)以及規則(rules)。表達的是使用?sources?中指定?ServiceAccount?的應用可以訪問?destinations?指定?ServiceAccount?的應用,可訪問的流量由?rules?指定。

比如下面的示例,表示的是使用?ServiceAccount?promethues?運行的負載,發送?GET?請求到使用?ServiceAccount?service-a?運行的負載的?/metrics?端點。HTTPRouteGroup?定義了流量的標識:即訪問端點?/metrics?的?GET?請求。

kind:?HTTPRouteGroup
metadata:name:?the-routes
spec:matches:-?name:?metricspathRegex:?"/metrics"methods:-?GET
---
kind:?TrafficTarget
metadata:name:?path-specificnamespace:?default
spec:destination:kind:?ServiceAccountname:?service-anamespace:?defaultrules:-?kind:?HTTPRouteGroupname:?the-routesmatches:-?metricssources:-?kind:?ServiceAccountname:?prometheusnamespace:?default

那么在多集群中,訪問控制的表現如何呢?

FSM 的?ServiceExport

FSM 的?ServiceExport?用于導出服務到其他集群,也就是服務注冊的過程。ServiceExport?的字段?spec.serviceAccountName?可以用來指定服務負載使用的?ServiceAccount

apiVersion:?flomesh.io/v1alpha1
kind:?ServiceExport
metadata:namespace:?httpbinname:?httpbin
spec:serviceAccountName:?"*"rules:-?portNumber:?8080path:?"/cluster-1/httpbin-mesh"pathType:?Prefix

接下來,我們在上次的環境基礎上開始演示,沒有看過上一篇的小伙伴可以參考?上一篇?來搭建環境。

部署應用

deabc891409e19e664fa4cee4015e9ee.png
mcs-access-control

部署示例應用

在集群?cluster-1?和?cluster-3?的?httpbin?命名空間(由網格管理,會注入 sidecar)下,部署?httpbin?應用。這里我們指定?ServiceAccount?為?httpbin

export?NAMESPACE=httpbin
for?CLUSTER_NAME?in?cluster-1?cluster-3
dokubectx?k3d-${CLUSTER_NAME}kubectl?create?namespace?${NAMESPACE}osm?namespace?add?${NAMESPACE}kubectl?apply?-n?${NAMESPACE}?-f?-?<<EOF
apiVersion:?v1
kind:?ServiceAccount
metadata:name:?httpbin
---??
apiVersion:?apps/v1
kind:?Deployment
metadata:name:?httpbinlabels:app:?pipy
spec:replicas:?1selector:matchLabels:app:?pipytemplate:metadata:labels:app:?pipyspec:serviceAccountName:?httpbincontainers:-?name:?pipyimage:?flomesh/pipy:latestports:-?containerPort:?8080command:-?pipy-?-e-?|pipy().listen(8080).serveHTTP(new?Message('Hi,?I?am?from?${CLUSTER_NAME}?and?controlled?by?mesh!\n'))
---
apiVersion:?v1
kind:?Service
metadata:name:?httpbin
spec:ports:-?port:?8080targetPort:?8080protocol:?TCPselector:app:?pipy
---
apiVersion:?v1
kind:?Service
metadata:name:?httpbin-${CLUSTER_NAME}
spec:ports:-?port:?8080targetPort:?8080protocol:?TCPselector:app:?pipy
EOFsleep?3kubectl?wait?--for=condition=ready?pod?-n?${NAMESPACE}?--all?--timeout=60s
done

在?cluster-2?的命名空間?httpbin?下 部署?httpbin?應用,但不指定?ServiceAccount,使用默認的?ServiceAccount?default

export?NAMESPACE=httpbin
export?CLUSTER_NAME=cluster-2kubectx?k3d-${CLUSTER_NAME}
kubectl?create?namespace?${NAMESPACE}
osm?namespace?add?${NAMESPACE}
kubectl?apply?-n?${NAMESPACE}?-f?-?<<EOF
apiVersion:?apps/v1
kind:?Deployment
metadata:name:?httpbinlabels:app:?pipy
spec:replicas:?1selector:matchLabels:app:?pipytemplate:metadata:labels:app:?pipyspec:containers:-?name:?pipyimage:?flomesh/pipy:latestports:-?containerPort:?8080command:-?pipy-?-e-?|pipy().listen(8080).serveHTTP(new?Message('Hi,?I?am?from?${CLUSTER_NAME}!?and?controlled?by?mesh!\n'))
---
apiVersion:?v1
kind:?Service
metadata:name:?httpbin
spec:ports:-?port:?8080targetPort:?8080protocol:?TCPselector:app:?pipy
---
apiVersion:?v1
kind:?Service
metadata:name:?httpbin-${CLUSTER_NAME}
spec:ports:-?port:?8080targetPort:?8080protocol:?TCPselector:app:?pipy
EOFsleep?3
kubectl?wait?--for=condition=ready?pod?-n?${NAMESPACE}?--all?--timeout=60s

在集群?cluster-2?的命名空間?curl?下部署?curl?應用,這個命名空間是被網格管理的,注入的 sidecar 會完全流量的跨集群調度。這里指定使用?ServiceAccout?curl

export?NAMESPACE=curl
kubectx?k3d-cluster-2
kubectl?create?namespace?${NAMESPACE}
osm?namespace?add?${NAMESPACE}
kubectl?apply?-n?${NAMESPACE}?-f?-?<<EOF
apiVersion:?v1
kind:?ServiceAccount
metadata:name:?curl
---
apiVersion:?v1
kind:?Service
metadata:name:?curllabels:app:?curlservice:?curl
spec:ports:-?name:?httpport:?80selector:app:?curl
---
apiVersion:?apps/v1
kind:?Deployment
metadata:name:?curl
spec:replicas:?1selector:matchLabels:app:?curltemplate:metadata:labels:app:?curlspec:serviceAccountName:?curlcontainers:-?image:?curlimages/curlimagePullPolicy:?IfNotPresentname:?curlcommand:?["sleep",?"365d"]
EOFsleep?3
kubectl?wait?--for=condition=ready?pod?-n?${NAMESPACE}?--all?--timeout=60s

導出服務

export?NAMESPACE_MESH=httpbin
for?CLUSTER_NAME?in?cluster-1?cluster-3
dokubectx?k3d-${CLUSTER_NAME}kubectl?apply?-f?-?<<EOF
apiVersion:?flomesh.io/v1alpha1
kind:?ServiceExport
metadata:namespace:?${NAMESPACE_MESH}name:?httpbin
spec:serviceAccountName:?"httpbin"rules:-?portNumber:?8080path:?"/${CLUSTER_NAME}/httpbin-mesh"pathType:?Prefix
---
apiVersion:?flomesh.io/v1alpha1
kind:?ServiceExport
metadata:namespace:?${NAMESPACE_MESH}name:?httpbin-${CLUSTER_NAME}
spec:serviceAccountName:?"httpbin"rules:-?portNumber:?8080path:?"/${CLUSTER_NAME}/httpbin-mesh-${CLUSTER_NAME}"pathType:?Prefix
EOF
sleep?1
done

測試

我們切換回集群?cluster-2

kubectx?k3d-cluster-2

默認路由類型是?Locality?,我們需要創建一個?ActiveActive?策略,來允許使用其他集群的服務實例來處理請求。

kubectl?apply?-n?httpbin?-f??-?<<EOF
apiVersion:?flomesh.io/v1alpha1
kind:?GlobalTrafficPolicy
metadata:name:?httpbin
spec:lbType:?ActiveActivetargets:-?clusterKey:?default/default/default/cluster-1-?clusterKey:?default/default/default/cluster-3
EOF

在?cluster-2?集群的?curl?應用中, 我們向?httpbin.httpbin?發送請求。

curl_client="$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items[0].metadata.name}')"kubectl?exec?"${curl_client}"?-n?curl?-c?curl?--?curl?-s?http://httpbin.httpbin:8080/

多請求幾次會看到如下的響應:

Hi,?I?am?from?cluster-1?and?controlled?by?mesh!
Hi,?I?am?from?cluster-2?and?controlled?by?mesh!
Hi,?I?am?from?cluster-3?and?controlled?by?mesh!
Hi,?I?am?from?cluster-1?and?controlled?by?mesh!
Hi,?I?am?from?cluster-2?and?controlled?by?mesh!
Hi,?I?am?from?cluster-3?and?controlled?by?mesh!

演示

調整流量策略模式

我們先將集群?cluster-2?的流量策略模式調整下,這樣才能應用流量策略:

kubectx?k3d-cluster-2
export?osm_namespace=osm-system
kubectl?patch?meshconfig?osm-mesh-config?-n?"$osm_namespace"?-p?'{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":false}}}'?--type=merge

此時,再嘗試發送請求,會發現請求失敗。因為在流量策略模式下,沒有配置策略的話應用間的互訪是被禁止的。

kubectl?exec?"${curl_client}"?-n?curl?-c?curl?--?curl?-s?http://httpbin.httpbin:8080/
command?terminated?with?exit?code?52

應用訪問控制策略

文章開頭介紹 SMI 的訪問控制策略時有提到是基于?ServiceAccount?的,這就是為什么我們部署的?httpbin?服務在集群?cluster-1?、cluster-3?與集群?cluster-2?中使用的?ServiceAccount?不同:

  • ? cluster-1:httpbin

  • ? cluster-2:default

  • ? clsuter-3:httpbin

接下來,我們會為集群內和集群外的服務,分別設置不同的訪問控制策略?TrafficTarget,通過在?TrafficTarget?中目標負載的?ServiceAccount?來進行區分。

96065fc07f7b241c4bbdf745730fe143.png
fsm-multi-cluster-with-policy

執行下面的命令,創建流量策略?curl-to-httpbin,允許?curl?訪問命名空間?httpbin?下使用?ServiceAccount?default?的負載。

kubectl?apply?-n?httpbin?-f?-?<<EOF
apiVersion:?specs.smi-spec.io/v1alpha4
kind:?HTTPRouteGroup
metadata:name:?httpbin-route
spec:matches:-?name:?allpathRegex:?"/"methods:-?GET
---
kind:?TrafficTarget
apiVersion:?access.smi-spec.io/v1alpha3
metadata:name:?curl-to-httpbin
spec:destination:kind:?ServiceAccountname:?defaultnamespace:?httpbinrules:-?kind:?HTTPRouteGroupname:?httpbin-routematches:-?allsources:-?kind:?ServiceAccountname:?curlnamespace:?curl
EOF

多次發送請求嘗試,集群?cluster-2?的服務都會做出響應,而集群?cluster-1?和?cluster-3?不會參與服務。

Hi,?I?am?from?cluster-2?and?controlled?by?mesh!
Hi,?I?am?from?cluster-2?and?controlled?by?mesh!
Hi,?I?am?from?cluster-2?and?controlled?by?mesh!

執行下面命令檢查?ServiceImports,可以看到?cluster-1?和?cluster-3?導出的服務使用的是?ServiceAccount?httpbin

kubectl?get?serviceimports?httpbin?-n?httpbin?-o?jsonpath='{.spec}'?|?jq{"ports":?[{"endpoints":?[{"clusterKey":?"default/default/default/cluster-1","target":?{"host":?"192.168.1.110","ip":?"192.168.1.110","path":?"/cluster-1/httpbin-mesh","port":?81}},{"clusterKey":?"default/default/default/cluster-3","target":?{"host":?"192.168.1.110","ip":?"192.168.1.110","path":?"/cluster-3/httpbin-mesh","port":?83}}],"port":?8080,"protocol":?"TCP"}],"serviceAccountName":?"httpbin","type":?"ClusterSetIP"
}

因此,我們創建另一個?TrafficTarget?curl-to-ext-httpbin,允許?curl?訪問使用?ServiceAccount?httpbin?的負載。

kubectl?apply?-n?httpbin?-f?-?<<EOF
kind:?TrafficTarget
apiVersion:?access.smi-spec.io/v1alpha3
metadata:name:?curl-to-ext-httpbin
spec:destination:kind:?ServiceAccountname:?httpbinnamespace:?httpbinrules:-?kind:?HTTPRouteGroupname:?httpbin-routematches:-?allsources:-?kind:?ServiceAccountname:?curlnamespace:?curl
EOF

應用策略后,再測試一下,所有請求都成功。

Hi,?I?am?from?cluster-2?and?controlled?by?mesh!
Hi,?I?am?from?cluster-1?and?controlled?by?mesh!
Hi,?I?am?from?cluster-3?and?controlled?by?mesh!

總結

MCS(Multi-cluster Service)API 的實現目標是能夠像 Service 一樣,使用其他集群的服務。雖然在 Kubernetes 本身實現還有漫長的路要走,但作為 SMI 標準實現的服務網格來說,可以將其視作 Service 一樣來進行操作。

就如本篇的訪問控制一樣,SMI 的流量拆分一樣也可以支持多集群的服務。預告一下,下一篇就為大家介紹多集群服務的流量拆分。

引用鏈接

[1]?osm-edge:?https://github.com/flomesh-io/osm-edge
[2]?SMI 訪問控制的規范:?https://github.com/servicemeshinterface/smi-spec/blob/main/apis/traffic-access/v1alpha3/traffic-access.md
[3]?流量策略有兩種形式:?https://osm-edge-docs.flomesh.io/docs/getting_started/traffic_policies/

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

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

相關文章

python下sqlite增刪查改方法(轉)

sqlite讀寫 #codingutf-8 import sqlite3 import os #創建數據庫和游標 if os.path.exists( test.db):connsqlite3.connect( test.db)curconn.cursor() else:connsqlite3.connect( test.db)curconn.cursor()#創建表 cur.execute(CREATE TABLE IF NOT EXISTS customer (ID VARCH…

Apache HTTP Server 與 Tomcat 的三種連接方式介紹

本文轉載自IBM developer 首先我們先介紹一下為什么要讓 Apache 與 Tomcat 之間進行連接。事實上 Tomcat 本身已經提供了 HTTP 服務&#xff0c;該服務默認的端口是 8080&#xff0c;裝好 tomcat 后通過 8080 端口可以直接使用 Tomcat 所運行的應用程序&#xff0c;你也可以將該…

印象筆記和有道云筆記程序員_記錄,存儲和共享筆記的最佳應用程序和云服務...

印象筆記和有道云筆記程序員Is your desk and computer covered with sticky notes? Do you have miscellaneous pieces of paper with bits of information buried in drawers, your laptop case, backpack, purse, etc.? Get rid of all the chaos and get organized with …

java B2B2C 仿淘寶電子商城系統-Spring Cloud Eureka參數配置項詳解

Eureka涉及到的參數配置項數量眾多&#xff0c;它的很多功能都是通過參數配置來實現的&#xff0c;了解這些參數的含義有助于我們更好的應用Eureka的各種功能&#xff0c;下面對Eureka的配置項做具體介紹&#xff0c;供大家參考。 需要JAVA Spring Cloud大型企業分布式微服務云…

django15:中間件

中間件 開發django項目是&#xff0c;涉及全局相關功能&#xff0c;都可以使用中間件實現。 1.請求時&#xff0c;需要經過中間件&#xff0c;才能到達真正的django后端。 2.響應走的時候&#xff0c;也要經過中間件&#xff0c;才能出去。 依次經過里面的中間件進出&#x…

互聯網算法和產品優化的幾個反直覺現象

本文不涉及任何具體的業務和形態&#xff0c;沒有公開任何數據和需要保護的技術。互聯網產品和算法的優化&#xff0c;是廣大程序員和產品經理的主要工作。但想準確衡量線上實驗效果&#xff0c;從來都不簡單。筆者將這些反直覺現象&#xff0c;總結成三個典型案例予以討論。然…

SD 胡策 Round 1 T3 彩尾巴猹的二進制數

發現一個區間[L,R]代表的2進制數是3的倍數&#xff0c;當且僅當從L開始的后綴二進制值 - 從R1開始的后綴二進制值 是 3 的倍數 (具體證明因為太簡單而被屏蔽)。 于是我們就可以在每個點維護從它開始的后綴二進制數的值&#xff0c;因為在%3同余系下只有3個數&#xff0c;所以我…

求解10的75次方問題

對于求一個數的高次方&#xff0c;最簡單的方法&#xff0c;恐怕就是循環一定的次數&#xff0c;累乘。但是這樣的效率太低。下面我提供一個高效的算法。來自左程云《程序員代碼面試指南》。 就拿10的75次方舉例&#xff1a; 1.75的二進制數形式是1001011。 2.10的75次方10的64…

又是新的一周

自己的決定還記得嗎轉載于:https://www.cnblogs.com/zhangxiangning/p/10300093.html

django16: csrf跨站請求偽造/CSRF相關裝飾器

CSRF 即跨站請求攻擊 跨站請求偽造csrf釣魚網站本質搭建一個跟正常網站一模一樣的頁面用戶在該頁面上完成轉賬功能轉賬的請求確實是朝著正常網站的服務端提交唯一不同的在于收款賬戶人不同給用戶書寫form表單 對方賬戶的input沒有name屬性你自己悄悄提前寫好了一個具有默認的…

dropbox_Google的新存儲定價與Microsoft,Apple和Dropbox相比如何

dropboxGoogle’s subscription storage service has a new name: Google One. Some prices are dropping and customers will also get customer support from an actual human for the first time. Google的訂閱存儲服務有一個新名稱&#xff1a;Google One。 一些價格正在下…

WPF效果第二百零六篇之快速黑白灰效果

一大早就看到群友討論怎么快速讓界面黑白灰效果,這不突然想起來N年前咱簡單通過ShaderEffects調節過飽和度、對比度、亮度;今天再次玩耍一下;來看看最終實現的效果:1、核心代碼&#xff1a;sampler2D implicitInput : register(s0); float factor : register(c0); float4 main(…

極大似然估計與貝葉斯定理

文章轉載自&#xff1a;https://blog.csdn.net/zengxiantao1994/article/details/72787849 極大似然估計-形象解釋看這篇文章&#xff1a;https://www.zhihu.com/question/24124998 貝葉斯定理-形象解釋看這篇文章&#xff1a;https://www.zhihu.com/question/19725590/answer/…

艾媒:第三方應用商店形成BAT3爭霸格局

iiMedia Research(艾媒咨詢)近日發布的《2016Q2中國移動應用商店市場監測報告》&#xff0c;報告顯示&#xff0c;2016年第二季度&#xff0c;第三方移動應用商店用戶增長放緩&#xff0c;用戶規模逐漸飽和。同時&#xff0c;隨著豌豆莢宣布并入阿里移動事業群&#xff0c;中國…

編譯安裝內核

編譯安裝內核 升級內核到 linux-4.20.3.tar.xz 查看當前內核版本&#xff1a; [rootcentos7 data]#uname -r 3.10.0-862.el7.x86_64獲取內核源代碼包&#xff1a;www.kernel.org linux-4.20.3.tar.xz 實施步驟 1. 安裝編譯所需的工具 gcc ncurses-devel make&#xff08;開發工…

layui 啟用禁用_在不啟用Apple Pay的情況下禁用煩人的Apple Pay通知

layui 啟用禁用iPhone/iPad: Not interested in Apple Pay, and tired of seeing notifications about it? You can disable them, but the option is hidden. iPhone / iPad&#xff1a;對Apple Pay不感興趣&#xff0c;又厭倦了看到有關它的通知&#xff1f; 您可以禁用它們…

數字孿生項目實戰,WPF與Unity結合開發之路(一)

數字孿生項目實戰&#xff0c;WPF與Unity結合開發之路&#xff08;一&#xff09;數字孿生項目實戰&#xff0c;WPF與Unity結合開發之路&#xff08;一&#xff09;作 者&#xff1a;水娃嗨大家好&#xff0c;我是一名骨灰級的WPF開發者&#xff0c;我叫水娃。這次主要是向大…

django17:importlib應用中間件代碼思想

轉載&#xff1a;https://www.cnblogs.com/alice-bj/articles/9276880.html 背景 仿django的中間件的編程思想 用戶可通過配置&#xff0c;選擇是否啟用某個組件/某個功能&#xff0c;只需要配置 eg:報警系統&#xff0c;發郵件&#xff0c;發微信 。。。 ( 根據字符串導入…

Python 全棧開發基礎

python面向對象 python異常處理 python網絡編程 python并發編程 臨時目錄 轉載于:https://www.cnblogs.com/fixdq/p/8883304.html

IBM連續兩年大數據市場占有率全球第一

ZDNet至頂網服務器頻道 04月22日 新聞消息:IBM 近日宣布&#xff0c;根據市場調研機構Wikibon最新研究報告《大數據供應商收益與市場預測》&#xff0c;IBM連續兩年實現大數據市場占有率第一&#xff0c;領跑報告中的70多家大數據供應商。同期&#xff0c;IBM年度報告也顯示&am…