使用訪問控制策略訪問服務網格內的服務

當在實施服務網格時,不可避免的存在網格外服務訪問網格內服務的情況,也就是服務網格的平滑落地。這種中間狀態可能會持續較長的時間,也是我們在落地的時候需要解決的問題之一。又或者,有的應用處于某些考慮并不適合使用服務網格,而又需要訪問網格內的服務。

ba648730a2b11cad83e2a9a11c0152b2.png

一種方式是通過統一的 Ingress 入口來訪問服務網格內的服務,將網格外的服務當做集群在的服務來對待。這種方式的方式優點是架構簡單、實施方便。缺點也比較明顯,統一的訪問入口無法做到細粒度的訪問控制,網格外的服務均能訪問網格內的服務。

這篇文章將介紹另外一種方式,在打通內外服務通信的同時又可以支持對訪問源進行細粒度的訪問控制,它就是在?osm-edge v1.2.0[1]?中引入的訪問控制特性。

訪問控制?AccessControl[2]?的訪問源有兩種:Service?和 IP 范圍。數據傳輸方面,支持明文傳輸和雙向加密傳輸(mTLS)。

接下來,我們就來看下如何使用訪問控制。

環境準備

Kubernetes 集群

使用極簡的 Kubernetes 發行版?k8e[3]

curl?-sfL?https://getk8e.com/install.sh?|?K8E_TOKEN=k8e-mesh?INSTALL_K8E_EXEC="server?--cluster-init?--write-kubeconfig-mode?644?--write-kubeconfig?~/.kube/config"?sh?-

osm-edge CLI

system=$(uname?-s?|?tr?[:upper:]?[:lower:])
arch=$(dpkg?--print-architecture)
release=v1.2.0
curl?-L?https://github.com/flomesh-io/osm-edge/releases/download/${release}/osm-edge-${release}-${system}-${arch}.tar.gz?|?tar?-vxzf?-
./${system}-${arch}/osm?version
cp?./${system}-${arch}/osm?/usr/local/bin/

安裝 osm-edge

執行下面的命令,安裝 osm-edge 的相關組件。

export?osm_namespace=osm-system?
export?osm_mesh_name=osm?osm?install?\--mesh-name?"$osm_mesh_name"?\--osm-namespace?"$osm_namespace"?\--set=osm.image.pullPolicy=Always

檢查并確認所有的 pod 都正常啟動并運行。

部署示例應用

#模擬目標服務
kubectl?create?namespace?httpbin
osm?namespace?add?httpbin
kubectl?apply?-n?httpbin?-f?https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/samples/httpbin/httpbin.yaml#模擬外部服務
kubectl?create?namespace?curl
kubectl?apply?-n?curl?-f?https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/samples/curl/curl.yaml#等待依賴的?POD?正常啟動
kubectl?wait?--for=condition=ready?pod?-n?httpbin?-l?app=httpbin?--timeout=180s
kubectl?wait?--for=condition=ready?pod?-n?curl?-l?app=curl?--timeout=180s

演示

這時,我們嘗試從服務?curl?發送請求到目標服務?httpbin,執行下面的命令:

kubectl?exec?"$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items..metadata.name}')"?-n?curl?--?curl?-sI?http://httpbin.httpbin:14001/get
command?terminated?with?exit?code?56

訪問失敗,這是因為默認情況下網格外的服務是無法訪問網格內服務的,我們需要應用訪問控制策略。

在應用策略之前,需要開啟訪問控制特性,默認情況下該特性是禁用的。

kubectl?patch?meshconfig?osm-mesh-config?-n?"$osm_namespace"?-p?'{"spec":{"featureFlags":{"enableAccessControlPolicy":true}}}'??--type=merge

明文傳輸

數據的傳輸可以有明文傳輸和雙向 TLS 加密。明文傳輸相對簡單,我們先演示明文傳輸的場景。

基于服務的訪問控制

首先為服務?curl?創建?Service

kubectl?apply?-n?curl?-f?-?<<EOF
apiVersion:?v1
kind:?Service
metadata:name:?curllabels:app:?curlservice:?curl
spec:ports:-?name:?httpport:?80selector:app:?curl
EOF

接著創建訪問源為?Service?curl,目標服務為?httpbin?的訪問控制策略:

kubectl?apply?-f?-?<<EOF
kind:?AccessControl
apiVersion:?policy.openservicemesh.io/v1alpha1
metadata:name:?httpbinnamespace:?httpbin
spec:backends:-?name:?httpbinport:number:?14001?#?targetPort?of?httpbin?serviceprotocol:?httpsources:-?kind:?Servicenamespace:?curlname:?curl
EOF

再次執行命令發送驗證請求,可以看到這次收到?HTTP 200?響應。

kubectl?exec?"$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items..metadata.name}')"?-n?curl?--?curl?-sI?http://httpbin.httpbin:14001/get
HTTP/1.1?200?OK
server:?gunicorn/19.9.0
date:?Mon,?07?Nov?2022?08:47:55?GMT
content-type:?application/json
content-length:?267
access-control-allow-origin:?*
access-control-allow-credentials:?true
osm-stats-namespace:?httpbin
osm-stats-kind:?Deployment
osm-stats-name:?httpbin
osm-stats-pod:?httpbin-69dc7d545c-qphrh
connection:?keep-alive

在繼續后面的演示之前,執行命令?kubectl delete accesscontrol httpbin -n httpbin?刪除剛才創建的策略。

基于 IP 范圍的訪問控制,明文傳輸

先獲取服務?curl?的 pod IP 地址:

curl_pod_ip="$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items[0].status.podIP}')"

使用 IP 范圍的訪問控制很簡單,只需要將訪問源類型設置為?IPRange,并配置剛才獲取到的 IP 地址。

kubectl?apply?-f?-?<<EOF
kind:?AccessControl
apiVersion:?policy.openservicemesh.io/v1alpha1
metadata:name:?httpbinnamespace:?httpbin
spec:backends:-?name:?httpbinport:number:?14001?#?targetPort?of?httpbin?serviceprotocol:?httpsources:-?kind:?IPRangename:?${curl_pod_ip}/32
EOF

再次執行命令測試控制策略是否生效:

kubectl?exec?"$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items..metadata.name}')"?-n?curl?--?curl?-sI?http://httpbin.httpbin:14001/get
HTTP/1.1?200?OK
server:?gunicorn/19.9.0
date:?Mon,?07?Nov?2022?09:20:57?GMT
content-type:?application/json
content-length:?267
access-control-allow-origin:?*
access-control-allow-credentials:?true
osm-stats-namespace:?httpbin
osm-stats-kind:?Deployment
osm-stats-name:?httpbin
osm-stats-pod:?httpbin-69dc7d545c-qphrh
connection:?keep-alive

記得執行?kubectl delete accesscontrol httpbin -n httpbin?清理策略。

前面我們用的都是明文傳輸,接下來我們看下加密傳輸。

加密傳輸

默認訪問策略證書特性是關閉的,執行下面的命令開啟:

kubectl?patch?meshconfig?osm-mesh-config?-n?"$osm_namespace"?-p?'{"spec":{"featureFlags":{"enableAccessCertPolicy":true}}}'??--type=merge

為了訪問源創建?AccessCert?來分配用于數據加密的證書,控制器會將證書信息保存在命名空間?curl?下的?Secret?curl-mtls-secret?中,這里還要為訪問源分配 SAN?curl.curl.cluster.local

kubectl?apply?-f?-?<<EOF
kind:?AccessCert
apiVersion:?policy.openservicemesh.io/v1alpha1
metadata:name:?curl-mtls-certnamespace:?httpbin
spec:subjectAltNames:-?curl.curl.cluster.localsecret:name:?curl-mtls-secretnamespace:?curl
EOF

重新部署?curl,將系統分配的?Secret?掛載到 pod 中:

kubectl?apply?-n?curl?-f?-?<<EOF
apiVersion:?apps/v1
kind:?Deployment
metadata:name:?curl
spec:replicas:?1selector:matchLabels:app:?curltemplate:metadata:labels:app:?curlspec:serviceAccountName:?curlnodeSelector:kubernetes.io/os:?linuxcontainers:-?image:?curlimages/curlimagePullPolicy:?IfNotPresentname:?curlcommand:?["sleep",?"365d"]volumeMounts:-?name:?curl-mtls-secretmountPath:?"/certs"readOnly:?truevolumes:-?name:?curl-mtls-secretsecret:secretName:?curl-mtls-secret
EOF

基于服務的訪問控制

接來下就是創建使用加密傳輸的訪問控制策略,配置目標服務的時候通過指定?tls.skipClientCertValidation = false?來啟用客戶端證書的檢查。而訪問源這里,除了指定?Service?類型的訪問源外,還要指定通過?AuthenticatedPrincipal?指定 SAN?curl.curl.cluster.local

kubectl?apply?-f?-?<<EOF
kind:?AccessControl
apiVersion:?policy.openservicemesh.io/v1alpha1
metadata:name:?httpbinnamespace:?httpbin
spec:backends:-?name:?httpbinport:number:?14001?#?targetPort?of?httpbin?serviceprotocol:?httptls:skipClientCertValidation:?falsesources:-?kind:?Servicenamespace:?curlname:?curl-?kind:?AuthenticatedPrincipalname:?curl.curl.cluster.local
EOF

測試下訪問策略是否有效,發送請求時我們要為訪問源的?curl?指令指定要使用的 CA 證書、密鑰、證書,正常會受到?HTTP 200?響應。

kubectl?exec?"$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items..metadata.name}')"?-n?curl?--?curl?-ksI?https://httpbin.httpbin:14001/get?--cacert?/certs/ca.crt?--key?/certs/tls.key?--cert?/certs/tls.crt
HTTP/2?200
server:?gunicorn/19.9.0
date:?Mon,?07?Nov?2022?10:44:05?GMT
content-type:?application/json
content-length:?267
access-control-allow-origin:?*
access-control-allow-credentials:?true
osm-stats-namespace:?httpbin
osm-stats-kind:?Deployment
osm-stats-name:?httpbin
osm-stats-pod:?httpbin-69dc7d545c-qphrh

基于 IP 范圍的訪問控制

基于服務的訪問控制后,基于 IP 范圍的控制就很簡單了。只需要將訪問源的類型指定為?IPRange?以及指定訪問源的 IP 地址。由于重新部署了應用?curl,需要重新獲取其 IP 地址(可能你也發現了基于 IP 范圍的訪問控制的弊端了吧)。

curl_pod_ip="$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items[0].status.podIP}')"
kubectl?apply?-f?-?<<EOF
kind:?AccessControl
apiVersion:?policy.openservicemesh.io/v1alpha1
metadata:name:?httpbinnamespace:?httpbin
spec:backends:-?name:?httpbinport:number:?14001?#?targetPort?of?httpbin?serviceprotocol:?httptls:skipClientCertValidation:?falsesources:-?kind:?IPRangename:?${curl_pod_ip}/32-?kind:?AuthenticatedPrincipalname:?curl.curl.cluster.local
EOF

再次發送請求進行測試:

kubectl?exec?"$(kubectl?get?pod?-n?curl?-l?app=curl?-o?jsonpath='{.items..metadata.name}')"?-n?curl?--?curl?-ksI?https://httpbin.httpbin:14001/get?--cacert?/certs/ca.crt?--key?/certs/tls.key?--cert?/certs/tls.crt
HTTP/2?200
server:?gunicorn/19.9.0
date:?Mon,?07?Nov?2022?10:58:55?GMT
content-type:?application/json
content-length:?267
access-control-allow-origin:?*
access-control-allow-credentials:?true
osm-stats-namespace:?httpbin
osm-stats-kind:?Deployment
osm-stats-name:?httpbin
osm-stats-pod:?httpbin-69dc7d545c-qphrh

Bingo!訪問成功,說明我們的策略生效了。

總結

實際的環境中,系統中可能會存在某些應用不適合使用服務網格,比如對性能的要求、無法兼容服務網格等原因;或者在服務網格落地的過程中,經常會先在增量應用中進行驗證,然后才是存量的服務的遷移。這些情況下,都會存在網格內外應用的互相通信的情況。

本文介紹的訪問控制便正是適合解決此類的問題,并可根據需求選擇合適的訪問源類型,以及明文還是加密傳輸數據。相比使用統一的 Ingress 進行訪問,控制的粒度更細。

引用鏈接

[1]?osm-edge v1.2.0:?https://github.com/flomesh-io/osm-edge/releases/tag/v1.2.0
[2]?AccessControl:?https://github.com/flomesh-io/osm-edge/blob/649e2febd1819a54782b254867c343febf808027/pkg/apis/policy/v1alpha1/accesscontrol.go#L13
[3]?k8e:?https://getk8e.com

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

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

相關文章

Scrapy從理論到爬圖

Scrapy系列教程&#xff1a; https://www.daxueyiwu.com/post/71 scrapy爬蟲啟示錄-小伙子老夫看你血氣方剛這本《爬蟲秘錄》就傳給你了 0 點贊 ? 0 回復 ? 5月前 Scrapy初章-Scrapy理論簡介 0 點贊 ? 0 回復 ? 5月前 Scrapy次章-啥也不干就是爬圖 0 點贊 ? 0 回復 ? 5月…

gfi截圖_GFI Backup Home Edition是Windows的免費數據備份實用程序

gfi截圖In today’s tough economic times the last thing you want is to lose important data because you couldn’t afford a quality backup utility. Today we look at GFI Backup Home Edition, a completely free professional grade backup solution. 在當今艱難的經…

需求工程閱讀筆記03

需求工程與運營商技術管理人員的結合點思考&#xff1b; 運營商的技術管理人員有時會發現自己處于比較尷尬的一個境地&#xff0c;因為一方面自己并不直接開發、實現各種系統&#xff0c;而都是采用外包的方式&#xff0c;業務的需求都是經由自己再轉給外包方&#xff0c;感覺自…

使用BeetleX.MQTT構建服務

已經有很長一段時間沒有寫代碼&#xff0c;為了不讓自己的代碼技能有所下降所以針對BeetleX擴展了一個MQTT協議來保持自己的代碼設計和編寫能力。接下來簡單介紹一下如何使用BeetleX.MQTT來構建對應的TCP或WebSocket服務。 以下實現是針對MQTT 3.1.1版本&#xff0c;協議的實…

vlc 視頻流跳數_如何解決在播放高清晰度視頻文件的VLC中跳過和滯后的問題

vlc 視頻流跳數VLC is the king of all media… it plays almost anything on any platform, any time, any place. It’s great. Lately, however, I’ve been having issues with VLC skipping whenever I’m playing high-def media streaming over a network. VLC是所有媒體…

求助:關于sql如何統計時間的問題

三、現在我們假設應用計時分為app應用和web應用&#xff0c;需要考慮如下幾個方面&#xff1a; &#xff08;1&#xff09;多時間段&#xff08;2&#xff09;表中有冗雜數據 &#xff08;3&#xff09;用戶是在web端和app端都登陸&#xff0c;這種類型的重復時間段只能取其一 …

onlyoffice中文字體下載

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/778 下劃線開頭的是頁面顯示中文的字體&#xff0c;不帶下劃線的是頁面顯示英文的字體 calibri.ttf -CalibriTimes New Roman.ttf _FANGSONG.otf -仿宋FANGSONG.otf_FS_GB2312.otf -仿宋_GB2312_HWZS.otf -華文…

onlyoffice 20并發限制處理

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/31 開源版本連續打開20個頁面就會彈出該提示。 一.方案一 修改六個app.js文件 find ./ -name app.js 目錄下所有app.js文件&#xff0c;對代碼行進行修改&#xff0c;只是經過簡單的測試&#xff0c;希望發現…

[Linux環境]-centos7下安裝jdk1.8.0_141流程.

1.查看當前虛擬機java環境版本: java -version [rootcentos-linux-7 bin]# java -version java version "1.7.0_111" OpenJDK Runtime Environment (rhel-2.6.7.2.el7_2-x86_64 u111-b01) OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode) 2.查看當前安裝版…

石橋圖里的一個故事

唐朝詭事錄有一個石橋圖章節&#xff0c;里面記載了一個故事。十年前&#xff0c;南州鄉賢謝員外的兩個兒子&#xff0c;要求謝家的老仆人帶自己去湖里游玩。哪知游玩到湖中間&#xff0c;突然下起了瓢潑大雨&#xff0c;員外家的一個兒子被驚嚇掉落水里。老仆人的兒子趕忙去救…

onlyoffice更新中文字體總結

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/760 1. 通過字體修改軟件FontCreator修改字體名稱 &#xff08;1&#xff09;下載fontcreat.exe &#xff08;2&#xff09;將Windows/fonts 下的字體文件拷貝至 我的文檔/fonts (3) 使用fontcreat打開字體…

ubuntu 鍵盤快捷鍵_如何使用鍵盤快捷鍵在Ubuntu中提高生產力

ubuntu 鍵盤快捷鍵diceareawesome1/Shutterstock.comdiceareawesome1 / Shutterstock.comWe’re always looking for new ways to speed up everyday tasks in Ubuntu. We’ll show you some keyboard shortcuts you might not have known about, and show you how to make you…

核心編程之十一章的11-9

def add(x,y): a x y def average(): list1 [] list1.append(a/2) print(list1) return a #為什么return a 放在這里呢&#xff0c;因為如果放在外面的話&#xff0c;根據return的屬性&#xff0c;會結束嵌套數函數 return average() …

Ubuntu 桌面系統升級

本文介紹 Ubuntu 桌面系統升級的兩種方式&#xff0c;通過 UI 或命令行的方式&#xff0c;演示為 20.04 升級為 22.04。并介紹了 windows 的 Linux 子系統 wsl 的升級注意事項。背景之前在學習 ROS2 時&#xff0c;安裝 ros-humble-desktop 出現依賴錯誤&#xff1a;無法修正錯…

onlyoffice修改左上角的logo

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/770 1. 商用版config里配置就能修改logo "editorConfig": {"customization": {"logo": {"image": "https://example.com/logo.png","imageEmbedded&q…

pidgin qq_Pidgin入門指南,通用消息客戶端

pidgin qqIf you find chatting with multiple chat clients troublesome, then Pidgin is the tool for you. In today’s article, we’ll show you how to connect to popular chat networks, encrypt your conversations, and render mathematical formula in Pidgin. 如果…

NumPy學習_00 ndarray的創建

1.使用array()函數創建數組 參數可以為&#xff1a;單層或嵌套列表&#xff1b;嵌套元組或元組列表&#xff1b;元組或列表組成的列表 # 導入numpy庫import numpy as np # 由單層列表創建a np.array([1,2,3])print(a) [1 2 3] # 由嵌套列表創建b np.array([[1.3,2.4], [0.3,4…

記一次 .NET 某自動化采集軟件 崩潰分析

一&#xff1a;背景 1.講故事前段時間有位朋友找到我&#xff0c;說他的程序在客戶的機器上跑著跑著會出現偶發卡死&#xff0c;然后就崩掉了&#xff0c;但在本地怎么也沒復現&#xff0c;dump也抓到了&#xff0c;讓我幫忙看下到底怎么回事&#xff0c;其實崩潰類的dump也有簡…

onlyoffice修改字號

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/758 :/var/www/onlyoffice/documentserver/web-apps/apps/documenteditor/main/app.js 里找到{value:22,displayValue:"22"} 把displayValue對應的值換成漢字字體 小二等 其實中文數字&#xff08;字…

大數據

大數據技術的快速發展&#xff0c;對現如今人們的思維方式產生了巨大的改變。 首先&#xff0c;大數據的發展&#xff0c;改善了人們思維的局限性。在過去&#xff0c;數據流通速度慢&#xff0c;人們獲取的數據資源有限&#xff0c;所以在看待事物方面&#xff0c;基于過去固有…