HTTP 流量
本任务演示如何在 Istio 网格中为 HTTP 流量设置 Istio 授权策略的 ALLOW
操作。
开始之前
在开始此任务之前,请执行以下操作
阅读 Istio 授权概念。
按照 Istio 安装指南 安装已启用双向 TLS 的 Istio。
部署 Bookinfo 示例应用程序。
部署 Bookinfo 应用程序后,请访问 Bookinfo 产品页面 http://$GATEWAY_URL/productpage
。在产品页面上,您可以看到以下部分
- 页面中间的**图书详细信息**,其中包括:图书类型、页数、出版商等。
- 页面底部的**图书评论**。
刷新页面时,该应用程序会在产品页面中显示不同版本的评论。该应用程序以循环方式展示评论:红星、黑星或无星。
使用 HTTP 流量配置工作负载的访问控制
使用 Istio,您可以轻松地为网格中的 工作负载 设置访问控制。此任务向您展示如何使用 Istio 授权设置访问控制。首先,您配置一个简单的 allow-nothing
策略,拒绝对工作负载的所有请求,然后逐步和增量地向工作负载授予更多访问权限。
运行以下命令在
default
命名空间中创建allow-nothing
策略。该策略没有selector
字段,这会将策略应用于default
命名空间中的每个工作负载。策略的spec:
字段具有空值{}
。该值表示不允许任何流量,有效地拒绝所有请求。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: allow-nothing namespace: default spec: {} EOF
将浏览器指向 Bookinfo
productpage
(http://$GATEWAY_URL/productpage
)。您应该看到"RBAC: access denied"
。该错误表明已配置的deny-all
策略按预期工作,并且 Istio 没有允许对网格中任何工作负载进行任何访问的规则。运行以下命令创建
productpage-viewer
策略,以允许使用GET
方法访问productpage
工作负载。该策略在rules
中不设置from
字段,这意味着允许所有来源,有效地允许所有用户和工作负载。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: "productpage-viewer" namespace: default spec: selector: matchLabels: app: productpage action: ALLOW rules: - to: - operation: methods: ["GET"] EOF
将浏览器指向 Bookinfo
productpage
(http://$GATEWAY_URL/productpage
)。现在您应该看到“Bookinfo 示例”页面。但是,您可以在页面上看到以下错误。无法获取产品详细信息
- 页面上显示
无法获取产品评论
。
出现这些错误是预期的,因为我们还没有向
productpage
工作负载授予对details
和reviews
工作负载的访问权限。接下来,您需要配置一个策略来授予对这些工作负载的访问权限。运行以下命令创建
details-viewer
策略,以允许productpage
工作负载(使用cluster.local/ns/default/sa/bookinfo-productpage
服务帐户发出请求)通过GET
方法访问details
工作负载。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: "details-viewer" namespace: default spec: selector: matchLabels: app: details action: ALLOW rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-productpage"] to: - operation: methods: ["GET"] EOF
运行以下命令创建策略
reviews-viewer
,以允许productpage
工作负载(使用cluster.local/ns/default/sa/bookinfo-productpage
服务帐户发出请求)通过GET
方法访问reviews
工作负载。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: "reviews-viewer" namespace: default spec: selector: matchLabels: app: reviews action: ALLOW rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-productpage"] to: - operation: methods: ["GET"] EOF
将浏览器指向 Bookinfo
productpage
(http://$GATEWAY_URL/productpage
)。现在,您应该看到“Bookinfo 示例”页面,左下方显示“图书详细信息”,右下方显示“图书评论”。但是,在“图书评论”部分中,有一个错误评分服务当前不可用
。这是因为
reviews
工作负载没有权限访问ratings
工作负载。要解决此问题,您需要授予reviews
工作负载对ratings
工作负载的访问权限。接下来,我们配置一个策略来授予reviews
工作负载该访问权限。运行以下命令创建
ratings-viewer
策略,以允许reviews
工作负载(使用cluster.local/ns/default/sa/bookinfo-reviews
服务帐户发出请求)通过GET
方法访问ratings
工作负载。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: "ratings-viewer" namespace: default spec: selector: matchLabels: app: ratings action: ALLOW rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-reviews"] to: - operation: methods: ["GET"] EOF
将浏览器指向 Bookinfo
productpage
(http://$GATEWAY_URL/productpage
)。您应该在“图书评论”部分看到“黑色”和“红色”评分。恭喜!您已成功应用授权策略来强制执行对使用 HTTP 流量的工作负载的访问控制。
清理
从您的配置中删除所有授权策略。
$ kubectl delete authorizationpolicy.security.istio.io/allow-nothing
$ kubectl delete authorizationpolicy.security.istio.io/productpage-viewer
$ kubectl delete authorizationpolicy.security.istio.io/details-viewer
$ kubectl delete authorizationpolicy.security.istio.io/reviews-viewer
$ kubectl delete authorizationpolicy.security.istio.io/ratings-viewer