IBM Cloud Docs
Istio 入门

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.23       normal         Addon Ready
    
  3. 您还可以检查附加组件的各个部分,以确保Istio Pods已部署。

    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.23.5 sh -
      
    2. 导航至 Istio 包目录。
      cd istio-1.23.5
      
    3. Linux 和 macOS 用户: 将 istioctl 客户机添加到 PATH 系统变量。
      export PATH=$PWD/bin:$PATH
      
    4. 标注 default 名称空间以用于自动侧柜注入。 现在,将使用 Envoy 代理侧柜容器自动创建部署到 default 的任何新 pod。
      kubectl label namespace default istio-injection=enabled
      
    5. 部署 BookInfo 应用程序、网关和目标规则。
      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 微服务容器为 Running
      kubectl get pods
      
      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. v2weight 更改为 0,将 v3weight 更改为 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 mTLS 文档

  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 设置。