dbnetlib不存在或拒绝访问_idou老师教你学Istio 16:如何用 Istio 实现微服务间的访问控制...

本文由华为云容器Istio团队撰稿,未经允许谢绝转载

摘要

使用 Istio 可以很方便地实现微服务间的访问控制。本文演示了使用 Denier 适配器和黑白名单两种方法。

使用场景

有时需要对微服务间的相互访问进行控制,比如使满足某些条件(比如版本)的微服务能够(或不能)调用特定的微服务。

环境准备

l 在 Kubernetes 集群上部署 Istio

l 部署 Bookinfo 示例应用

l 配置 Bookinfo 应用各个微服务的 destinationrule 和 virtualservice。其中 reviews 服务的 destinationrule 和 virtualservice 配置如下:

5c5266785db6967cd6bc229a60f1bc0e.png

cd37686611b501e2bcf2c390e4f8839b.png

按上图配置后,对于 reviews 服务的请求,来自用户 “kokokobe” 的请求会被路由到v2 版本,其他用户的请求会被路由到 v3 版本。

使用 Denier 适配器实现简单的访问控制

使用 Istio 对微服务进行访问控制时,可以使用 Mixer 中的任何属性。这是一种简单的访问控制,实现基础是通过 Mixer 选择器拒绝某些条件下的请求。

比如,上文所述的 Bookinfo 应用中的 ratings 服务会被多个版本的 reviews 服务访问。下面的示例中我们将会切断来自 v3 版本的 reviews 服务对 ratings 服务的调用。

1. 用浏览器打开 Bookinfo 的 productpage(http://$GATEWAY_URL/productpage)

990822629610c96210e7f5ebbdc33d01.png

如上图所示,如果用 “kokokobe” 的用户登录,能看到每条 review 下面的黑色星星,说明此时 ratings 服务被 v2 版本的 reviews 服务调用。

3ec4a494263de6d35605714cdabf3d92.png

dcb37dabcc2e17ad796f0cdbb03c2e56.png

从上面两张图可以看出,如果使用其他用户登录(或未登录),能看到每条 review 下面的红色星星,说明此时 ratings 服务被 v3 版本的 reviews 服务调用。

2. 创建 denier 适配器,拒绝来自 v3 版本的 reviews 服务对 ratings 服务的调用

编辑 mixer-rule-deny-label.yaml 内容如下:

a15d05b3477e94ddebbbccb5c8a59364.png

其中定义了一条名为 denyreviewsv3 的规则,一个 denier 类型的 handler,一个checknothing 类型的模板。

在 denyreviewsv3 规则中,方框内的条件表达式匹配的条件是:来自 reviews 服务,version 为 v3 ,目标为 ratings 服务的请求。这条规则使用 denier 适配器拒绝来自 v3 版本的 reviews 服务的请求。

这个 denier 适配器会拒绝符合上述规则的请求。可以预先指定 denier 适配器的状态码和消息,如方框中所示。

然后执行如下命令创建上述规则的 denier 适配器:

1a57b866d93c7a50e61b73637d064c40.png

3. 在浏览器中刷新 productpage 页面

如果已经登出或者使用不是 “kokokobe” 的用户身份登录,不再看到红色星星,因为v3版本的 reviews 服务对 ratings 服务的访问已经被拒绝了。

18c144c464e60df88e28cf53bc6b5654.png

4e5d96489e8886165b8ad49a0ed6e73b.png

相反,如果使用 “kokokobe” 用户登录,仍然能够看到黑色星星。因为该用户使用的是 v2 版本的 reviews 服务,不符合拒绝的条件。

通过 List 适配器实现黑白名单

Istio 也支持基于属性的黑名单和白名单。下面的白名单配置和上一节的 denier 配置是等价的,拒绝来自 v3 版本的 reviews 服务的请求。

1. 删除上一节配置的 denier 规则

34f5bf98df29202f4d46a6f840e76522.png

2. 在登出状态下浏览 Bookinfo 的 productpage(http://$GATEWAY_URL/productpage)

此时能看到红星图标。在完成下述步骤之后,只有在使用 “kokokobe” 的身份登录之后才能看到星形图标。

3. 创建包含 v2 版本白名单的 list 适配器

编辑 whitelist-handler.yaml 内容如下:

14e2b183c06b072f3462ea126f2b1cce.png

通常会在外部维护黑白名单的列表,然后指定 providerUrl 参数进行异步获取。在这个例子中,我们使用 overrides 字段提供一个静态的黑白名单列表。

然后运行如下命令创建 list 适配器:

6054572812de3a803fd3149bb4405d65.png

4. 创建一个 listentry 模板的实例

listentry 模板可以用来判别一个字符串是否存在于一个列表中,本例中我们使用它来判别版本标签是否存在于白名单中。

编辑 appversion-instance.yaml 内容如下:

ec7f28ff4943fc60754cc9c59ffd8371.png

然后运行如下命令:

c438682d204d713e4fc7f43cbfbcd35f.png

5. 为 ratings 服务启用 whitelist 检查功能

编辑 checkversion-rule.yaml 内容如下:

c4b106686078e7d08b1bc94ea67a36c3.png

然后运行如下命令:

04af3539a0bcef563d502497c7d3577f.png

6. 在浏览器中刷新 productpage 页面

如果已经登出或者使用不是 “kokokobe” 的用户身份登录,看不到星形图标;如果使用 “kokokobe” 用户登录,仍然能够看到黑色星星。

总结

通过上述示例,可以发现使用 Istio 实现微服务间的访问控制非常方便。既可以使用denier 适配器实现简单的访问控制,也可以通过 list 适配器实现较复杂的黑白名单。

本文由华为云容器Istio团队撰稿,未经允许谢绝转载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值