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 …

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…