使用访问控制策略访问服务网格内的服务

当在实施服务网格时,不可避免的存在网格外服务访问网格内服务的情况,也就是服务网格的平滑落地。这种中间状态可能会持续较长的时间,也是我们在落地的时候需要解决的问题之一。又或者,有的应用处于某些考虑并不适合使用服务网格,而又需要访问网格内的服务。

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] AccessControlhttps://github.com/flomesh-io/osm-edge/blob/649e2febd1819a54782b254867c343febf808027/pkg/apis/policy/v1alpha1/accesscontrol.go#L13
[3] k8e: https://getk8e.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.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;基于过去固有…