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.mzph.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 …

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;所以我…

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;中国…

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;我叫水娃。这次主要是向大…

idou老师教你学Istio06: 如何用istio实现流量迁移

流量迁移是流量管理的一个重要功能。istio提供的流量管理功能将流量从基础设施扩展中解耦&#xff0c;支持动态请求路由&#xff0c;故障注入、超时重试、熔断和流量迁移等。流量迁移的主要目的是将流量从微服务的某一版本的逐步迁移至另一个版本&#xff0c;如在新旧版本之间进…

用最少的代码,写一个完整MES项目(.NET6+WPF)

工业4.0时代&#xff0c;智能智造MES系统大行其道&#xff0c;然而基于.NET跨平台的罕见&#xff01;这里有一套《.NET6WPF企业级MES实战》教程&#xff0c;基于.NET6跨平台开发&#xff0c;实现了MES多核心功能&#xff0c;尤其是开发框架完整&#xff0c;非常适合复用。这里分…

django18:auth模块

Auth模块 执行数据库迁移命令后&#xff0c;自动生产多个表。 django_session auth_user 直接访问admin路由&#xff0c;需要输入用户名和密码&#xff0c;就是参考auth_user表 管理员用户才能进入 创建超级用户 createsuperuser from django.contrib import auth1.校验用…

hulu dpp_什么是直播电视的Hulu,它可以代替您的有线电视订阅吗?

hulu dppStreaming cable replacements are becoming a much more appealing option for cable cutters across the board, with more choices available than ever before. Hulu’s Live TV option is a relative newcomer to the scene, but is it worth it? 对于全系列的电…

suse linux ssh远程无法访问问题

当正常安装完Suse Linux Enterprise Server 11 sp1 时&#xff0c;无法通过SecureCRT或者PuTTY之类的终端程序进行连接。 折腾了一下&#xff0c;发现问题所在&#xff1a; 1、 需要关闭防火墙&#xff0c;如下图在YAST里可以关闭&#xff0c;也可以使用下面命令行的方式&…

Jade —— 源于 Node.js 的 HTML 模板引擎

2013-12-11 发布Jade —— 源于 Node.js 的 HTML 模板引擎 开源项目介绍 web 模板引擎 node.js jade 207.8k 次阅读 读完需要 69 分钟54Jade 是一个高性能的模板引擎&#xff0c;它深受 Haml 影响&#xff0c;它是用 JavaScript 实现的&#xff0c;并且可以供 Node…

诈骗者如何伪造电子邮件地址,以及如何分辨

Consider this a public service announcement: Scammers can forge email addresses. Your email program may say a message is from a certain email address, but it may be from another address entirely. 考虑这是一项公共服务公告&#xff1a;诈骗者可以伪造电子邮件地…