zoukankan      html  css  js  c++  java
  • Istio目标规则 (Destination Rule)

    1、概述

    与虚拟服务一样,目标规则也是 Istio 流量路由功能的关键部分。您可以将虚拟服务视为将流量如何路由到给定目标地址,然后使用目标规则来配置该目标的流量。在评估虚拟服务路由规则之后,目标规则将应用于流量的“真实”目标地址。

    特别是,您可以使用目标规则来指定命名的服务子集,例如按版本为所有给定服务的实例分组。然后可以在虚拟服务的路由规则中使用这些服务子集来控制到服务不同实例的流量。

    目标规则还允许您在调用整个目的地服务或特定服务子集时定制 Envoy 的流量策略,比如您喜欢的负载均衡模型、TLS 安全模式或熔断器设置。在目标规则参考中可以看到目标规则选项的完整列表。

    注意:目标规则(Destination Rule)是 Istio 重要的资源对象之一,它不能独自使用,必须跟 Virtual Service 共同发挥作用。

    2、负载均衡选项

    默认情况下,Istio 使用轮询的负载均衡策略,实例池中的每个实例依次获取请求。Istio 同时支持如下的负载均衡模型,可以在 DestinationRule 中为流向某个特定服务或服务子集的流量指定这些模型。

    • 随机:请求以随机的方式转到池中的实例。
    • 权重:请求根据指定的百分比转到实例。
    • 最少请求:请求被转到最少被访问的实例。

    查看 Envoy 负载均衡文档获取这部分的更多信息。

    3、destinationrules.networking.istio.io资源结构

    通过kubectl get customresourcedefinitions.apiextensions.k8s.io destinationrules.networking.istio.io -o yaml命令查看destinationrules资源的apiGroups、apiVersions 和 resources 以及资源的 scope信息,可以看到资源scope是Namespaced。

    spec:
      conversion:
        strategy: None
      group: networking.istio.io
      names:
        categories:
        - istio-io
        - networking-istio-io
        kind: DestinationRule
        listKind: DestinationRuleList
        plural: destinationrules
        shortNames:
        - dr
        singular: destinationrule
      scope: Namespaced
      versions:
      .....  

    4、Destination Rule 示例

    通常在生产场景下,使用 Destination Rule 对用户进行身份、地址位置等条件的识别后的流量路由,例如部分用户优先享用新版本,则可以通过HTTP Header附加相关的字段进行识别,路由到新版本的服务上。或者在版本更新的时候,使用灰度发布,对新旧版本标记子集,按照不同的负载百分比进行调整逐步迭代。

    通过例子来理解

    有两个Deployment(nginx 及 httpd),通过Service关联到一起,通过访问Service只能做到简单的负载均衡,通过实验发现 nginx 和 httpd 流量各自在 50% 左右。

    Deployment和Service配置文件如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: nginx
            server: web
        spec:
          containers:
            - image: 'nginx:latest'
              name: nginx-deployment
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: httpd
      name: httpd-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpd
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: httpd
            server: web
        spec:
          containers:
            - image: 'httpd:latest' 
              name: httpd-deployment 
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: web-service
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        server: web
      type: ClusterIP

    如果想实现更加细颗粒度的流量管控,通过引入Istio Vistrual Service 及 Destination Rule,非常简单的就实现复杂的流量管理。

    DestinationRule 根据标签将流量分成不同的子集,以提供 VirtualService 进行调度,并且设置相关的负载百分比实现精准的控制。

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: web-dr
    spec:
      host: web-service #k8s服务名
      subsets:
      - name: httpd
        labels:
          app: httpd
      - name: nginx
        labels:
          app: nginx
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: web-vs
    spec:
      hosts:
      - web-service #k8s服务名
      http:
      - route:
        - destination:
            host: web-service
            subset: nginx
          weight: 80
        - destination:
            host: web-service
            subset: httpd
          weight: 20
    

    通过客户端测试以上的实验,请留意客户端也必须经过 Istio 注入,因为只有客户端被 Istio 注入才可以接收到来自 Pilot 有关 Virtual Service 和 Destination Rule 的配置信息,才可以保证流量接管生效。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: client-deployment
      name: client-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: client-deployment
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: client-deployment
        spec:
          containers:
            - image: 'busybox:latest'
              name: client-deployment
              command: [ "/bin/sh", "-c", "sleep 3600"]

    进入客户端容器执行 wget -q -O - web-service 观察执行结果,可以测试出nginx流量在80%左右,httpd 流量在20%左右。

    5、更丰富的流量策略

    在生产环境中,应用到的流量策略不单单只是加权的负载均衡那么简单, Destination Rule 还支持最小连接数、随机负载等等。在下面的示例中,目标规则为my-svc目标服务配置了2个具有不同负载均衡策略的子集:

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: my-destination-rule
    spec:
      host: my-svc   #指的是 Kuberentes 中的服务
      trafficPolicy:
        loadBalancer:   #负载均衡路由策略
          simple: RANDOM
      subsets:   #针对不同标签选择的流量子集
      - name: v1
        labels:
          version: v1
      - name: v2
        labels:
          version: v2
        trafficPolicy:
          loadBalancer:
            simple: ROUND_ROBIN
      - name: v3
        labels:
          version: v3

    每个子集都是基于一个或多个 labels 定义的,在 Kubernetes 中它是附加到像 Pod 这种对象上的键/值对。这些标签应用于 Kubernetes 服务的 Deployment 并作为 metadata 来识别不同的版本。

    除了定义子集之外,目标规则对于所有子集都有默认的流量策略,而对于该子集,则有特定于子集的策略覆盖它。定义在 subsets 上的默认策略,为 v1 和 v3 子集设置了一个简单的随机负载均衡器。在 v2 策略中,轮询负载均衡器被指定在相应的子集字段上。 

    6、总结

    虚拟服务(Vistrual Service)可以将流量路由到给定目标地址(k8s服务),然后使用目标规则(Destination Rule)来配置该目标的流量。在评估虚拟服务路由规则之后,目标规则将应用于流量的“真实”目标地址。特别是,您可以使用目标规则来指定命名的服务子集,例如按版本为所有给定服务的实例分组。然后可以在虚拟服务的路由规则中使用这些服务子集来控制到服务不同实例的流量。目标规则还允许您在调用整个目的地服务或特定服务子集时定制 Envoy 的流量策略,比如您喜欢的负载均衡模型、TLS 安全模式或熔断器设置。注意,目标规则不能独自使用,必须跟 Virtual Service 共同发挥作用。

    参考:https://zhuanlan.zhihu.com/p/262249873

    参考:https://istio.io/latest/zh/docs/concepts/traffic-management/

    参考:https://istio.io/latest/zh/docs/reference/config/networking/destination-rule/

  • 相关阅读:
    hmac
    struct模块-黏包的解决方法
    PHPCMS快速建站系列
    Notepad++搜索中的正则应用
    用var 变量=函数名 方式调用函数时如何传值的问题
    ThInkPHP中的常量
    css cursor 的可选值(鼠标的各种样式)
    JS实现用键盘控制DIV上下左右+放大缩小与变色
    PHP定义数组常量
    FormData实现文件上传实例
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/15717636.html
Copyright © 2011-2022 走看看