HTTP 流量

本任务演示如何在 Istio 网格中为 HTTP 流量设置 Istio 授权策略的 ALLOW 操作。

开始之前

在开始此任务之前,请执行以下操作

部署 Bookinfo 应用程序后,请访问 Bookinfo 产品页面 http://$GATEWAY_URL/productpage。在产品页面上,您可以看到以下部分

  • 页面中间的**图书详细信息**,其中包括:图书类型、页数、出版商等。
  • 页面底部的**图书评论**。

刷新页面时,该应用程序会在产品页面中显示不同版本的评论。该应用程序以循环方式展示评论:红星、黑星或无星。

使用 HTTP 流量配置工作负载的访问控制

使用 Istio,您可以轻松地为网格中的 工作负载 设置访问控制。此任务向您展示如何使用 Istio 授权设置访问控制。首先,您配置一个简单的 allow-nothing 策略,拒绝对工作负载的所有请求,然后逐步和增量地向工作负载授予更多访问权限。

  1. 运行以下命令在 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 productpagehttp://$GATEWAY_URL/productpage)。您应该看到 "RBAC: access denied"。该错误表明已配置的 deny-all 策略按预期工作,并且 Istio 没有允许对网格中任何工作负载进行任何访问的规则。

  2. 运行以下命令创建 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 productpagehttp://$GATEWAY_URL/productpage)。现在您应该看到“Bookinfo 示例”页面。但是,您可以在页面上看到以下错误。

    • 无法获取产品详细信息
    • 页面上显示 无法获取产品评论

    出现这些错误是预期的,因为我们还没有向 productpage 工作负载授予对 detailsreviews 工作负载的访问权限。接下来,您需要配置一个策略来授予对这些工作负载的访问权限。

  3. 运行以下命令创建 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
    
  4. 运行以下命令创建策略 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 productpagehttp://$GATEWAY_URL/productpage)。现在,您应该看到“Bookinfo 示例”页面,左下方显示“图书详细信息”,右下方显示“图书评论”。但是,在“图书评论”部分中,有一个错误 评分服务当前不可用

    这是因为 reviews 工作负载没有权限访问 ratings 工作负载。要解决此问题,您需要授予 reviews 工作负载对 ratings 工作负载的访问权限。接下来,我们配置一个策略来授予 reviews 工作负载该访问权限。

  5. 运行以下命令创建 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 productpagehttp://$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
这些信息有用吗?
您有什么改进建议吗?

感谢您的反馈!