Istio 入门

开始使用 IBM Cloud® Kubernetes Service 中的托管 Istio 附加组件。 在这一系列步骤中,您将部署 BookInfo 示例应用程序,以练习使用 Istio 的几种服务网格功能。

开始之前,请查看 Istio 附加组件更改日志,了解版本信息。

步骤 1:启用 Istio 附加组件

在集群中设置受管 Istio 附加组件。

请登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。

  1. 启用 istio 附加组件。

    ibmcloud ks cluster addon enable istio --cluster CLUSTER_NAME_OR_ID
    
  2. 验证受管 Istio 附加组件的状态是否为 Addon Ready。 请注意,准备好附加组件可能需要几分钟时间。

    ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID
    

    示例输出

    Name            Version     Health State   Health Status
    istio           1.29       normal         Addon Ready
    
  3. 您还可以查看该附加组件的各个组件,以确保已部署 Istio Pod。

    kubectl get pods -n istio-system
    
    kubectl get svc -n istio-system
    

有关 IBM Cloud Kubernetes Service 中 Istio 的更多信息,请参阅“关于托管 Istio 附加组件”。

步骤 2: 设置 BookInfo 样本应用程序

BookInfo 示例应用程序包括一个基本的 Istio 配置,这样您就可以立即试用 Istio 的功能。

4 个 BookInfo 微服务包括:

  • productpage - 调用 detailsreviews 微服务来填充页面。
  • details - 包含书籍信息。
  • ratings - 包含伴随书籍评论的书籍排名信息。
  • reviews - 包含书籍评论并调用 ratings 微服务。 reviews 微服务具有多个版本:
    • v1 不调用 ratings 微服务。
    • v2 调用 ratings 微服务,并将评级显示为黑色的 1 到 5 颗星。
    • v3 调用 ratings 微服务,并将评级显示为红色的 1 到 5 颗星。

此外,BookInfo 应用程序已由 Istio 网关在公共 IP 地址上公开。 要查看 BookInfo 架构,请查阅 Istio 文档

  1. 在集群中安装 BookInfo。

    1. 下载最新的 Istio 软件包,其中包含 BookInfo 应用的配置文件。
        curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh -
        ```
    2. 导航至 Istio 包目录。
    ```sh {: pre}
        cd istio-1.29.5
        ```
    3. Linux 和 macOS 用户: 将 `istioctl` 客户机添加到 `PATH` 系统变量。
    ```sh {: pre}
        export PATH=$PWD/bin:$PATH
        ```
    4. 标注 `default` 名称空间以用于自动侧柜注入。 任何部署到 `default` 的新 pod 现在都会自动使用 Envoy proxy sidecar 容器创建。
    ```sh {: pre}
        kubectl label namespace default istio-injection=enabled
        ```
    5. 部署 BookInfo 应用程序、网关和目标规则。
    ```sh {: pre}
        kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
        kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
        kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
        ```
    6. 请确保 BookInfo 微服务Pod的状态为 `Running`。
    ```sh {: pre}
        kubectl get pods
        ```
        ```sh {: screen}
        NAME                                     READY     STATUS      RESTARTS   AGE
        details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
        productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
        ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
        reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
        reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
        reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
        ```
    
  2. 获取公开 BookInfo的 istio-ingressgateway 负载均衡器的公共地址。

    • 经典簇
      1. 将 Istio 入口 IP 地址设置为环境变量。
        export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
        
      2. 将 Istio 输入端口设置为环境变量。
        export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
        
      3. 创建使用 Istio Ingress 主机和端口的 GATEWAY_URL 环境变量。
        export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
        
    • VPC 集群:创建使用 Istio Ingress 主机名的 GATEWAY_URL 环境变量。
        export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
        ```
    
  3. GATEWAY_URL 变量运行 curl,以检查 BookInfo 应用程序是否正在运行。 200 响应表示 BookInfo 应用程序使用 Istio 正常运行。

    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  4. 在浏览器中查看 BookInfo Web 页面。

    Mac OS 或 Linux

    open http://$GATEWAY_URL/productpage
    

    Windows

    start http://$GATEWAY_URL/productpage
    
  5. 尝试多次刷新该页面。 不同版本的评论部分循环使用无星 ( reviewsv1 ),黑星 (v2) 和红星 (v3)。

有关 Istio 中路由工作原理的更多信息,请参阅 了解发生了什么

步骤 3: 模拟分阶段推出 BookInfo

要模拟应用程序的发布,可以对 BookInfo 的 reviews 微服务执行分阶段推出 v3

在完成应用程序测试并准备开始引导实时流量后,您可以通过 Istio 逐步推出应用程序。 例如,您可以先将 v3 发布到 10% 的用户,然后发布到 20% 的用户,依此类推。

  1. 配置虚拟服务以将 0% 的流量分发到 v1,将 90% 的流量分发到 v2,将 10% 的流量分发到 v3 (共 reviews)。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews
            subset: v1
          weight: 0
        - destination:
            host: reviews
            subset: v2
          weight: 90
        - destination:
            host: reviews
            subset: v3
          weight: 10
    
    kubectl apply -f <filename>.yaml
    
  2. 在浏览器中查看 BookInfo 网页,方法是:在 Mac OS 或 Linux 上运行 open http://$GATEWAY_URL/productpage,或在Windows上运行 start http://$GATEWAY_URL/productpage

  3. 尝试多次刷新该页面。 请注意,不再显示没有星星的页面 (v1),并且大多数页面刷新将显示黑色星星 (v2)。只有很少显示带有红色星星 (v3) 的页面。

  4. 更改流量分布,以便仅将所有流量发送到 v3。 请注意,在实际场景中,您可能会通过将流量分布先更改为 80:20,然后更改为 70:30,以此类推,慢慢地推出版本更改,直到所有流量仅路由到最新版本为止。

    1. 编辑 reviews 虚拟服务的配置文件。
        kubectl edit VirtualService reviews
        ```
    2. 将 `v2` 的 `weight` 更改为 `0`,将 `v3` 的 `weight` 更改为 `100`。
    3. 保存并关闭该文件。
    
    
  5. 请尝试多次刷新 BookInfo 页面。 请注意,不再显示带有黑色星星 (v2) 的页面,而仅显示带有红色星星 (v3) 的页面。

  6. 如果已启用特使访问日志: 请验证自您更改复审的 YAML 文件 VirtualService 以来的时间内,是否不存在针对 v2 的请求的日志。

    kubectl logs -l app=reviews,version=v2 -c istio-proxy
    

步骤 4: 使用 IBM Cloud Monitoring 监视 BookInfo

使用 Monitoring 预定义的 Istio 仪表板之一来监控 BookInfo 微服务。

要将监视代理程序部署到集群,请完成以下步骤。

  1. 供应 IBM Cloud Monitoring的实例。

  2. 在集群中配置监视代理程序。

  3. 监视控制台中,单击所供应实例的 打开仪表板

  4. 在 Monitoring UI 中,单击 添加新仪表板

  5. 搜索“Istio”,然后选择“Monitoring”中预定义的 Istio 仪表板之一。

有关引用指标和仪表板、监控 Istio 内部组件,以及监控 Istio A/B 部署和金丝雀部署的更多信息,请参阅《 如何监控 Istio —— Kubernetes 的服务网格 》博客文章。

步骤 5: 通过启用 mTLS 来保护集群内流量

为命名空间中的工作负载启用加密,以便在群集内部实现相互 TLS ( mTLS )。 在集群中 pod 之间由 Envoy 路由的流量会使用 TLS 进行加密。 mTLS 的证书管理由 Istio 进行处理。 更多信息,请参阅 Istio mutual TLS 文档

  1. 创建名为 default.yaml 的认证策略文件。 该策略的作用域为命名空间,用于配置服务网格中的工作负载,使其仅接受使用 TLS 加密的请求。 请注意,此处未包含任何 targets 规范,因为该策略适用于该命名空间中网格内的所有服务。
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
    spec:
      mtls:
        mode: STRICT
    
  2. 将认证策略应用于名称空间。
    kubectl apply -f default.yaml -n NAMESPACE
    
  3. 创建一个名为 destination-mtls.yaml 的目的地规则文件。 该策略可配置命名空间中的服务网格工作负载使用 TLS 发送流量。 请注意,host: *.local 通配符会将此目标规则应用于网中的所有服务。
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "destination-mtls"
    spec:
      host: "*.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    
  4. 应用目标规则。
    kubectl apply -f destination-mtls.yaml -n NAMESPACE
    
  5. 如果您希望为其他命名空间中的服务网格工作负载实现 mTLS,请在每个命名空间中重复这些步骤。

此外,出于非认证原因(例如,将流量路由到不同版本的服务),也会使用目标规则。 为服务创建的任何目标规则还必须包含设置为 mode: ISTIO_MUTUAL 的相同 TLS 块。 此块会阻止规则覆盖在此部分中配置的网范围的 mTLS 设置。