当前位置:   article > 正文

Kubernetes使用流量管理平台Istio(二)_istio 在 kubernetes 中的应用

istio 在 kubernetes 中的应用

流量管理

在这里插入图片描述

请求路由

特定网格中服务的规范表示由Pilot维护。服务的istio模型和在底层平台(Kubernetes、mesos以及cloud foundry等)中的表达无关。特定平台的适配器负责从各自平台中获取元数据的各种字段,然后对服务模型进行填充。

istio引入了服务版本的概念,可以通过版本(v1、v2)或环境(staging、prod)对服务进行进一步的细分。这些版本不一定是不同的API版本: 它们可能是部署在不同环境(prod、staging或者dev等)中的同一服务的不同迭代。使用这种方式的常见场景包括A/B测试或金丝雀部署。

istio的流量路由规则可以根据服务版本来对服务之间流量进行附加控制。

服务之间的通讯

服务的客户端不知道服务不同版本间的差异。它们可以使用服务的主机名或者IP地址继续访问服务。envoy sidecar代理拦截并转发客户端和服务器之间的所有请求和响应。

istio还为同一服务版本的多个实例提供流量负载均衡。可以在服务发现和负载均衡中找到更多信息。

应用程序可以尝试使用底层平台(如kube-dns)中存在的dns服务来解析FQDN

Ingress 和Egress

istio假定进入和离开服务网格的所有流量都可以通过envoy代理进行传输。
通过将envoy代理部署在服务之前,运维人员可以针对面向用户的服务进行A/B测试、部署金丝雀服务等。
类似的,通过使用envoy将流量路由到外部web服务(例如,访问maps API或视频服务API)的方式,运维人员可以为这些服务添加超时控制、重试、断路器等功能,同时还能从服务连接中获取各种细节指标
在这里插入图片描述

服务发现和负载均衡

istio负载均衡服务网格中实例之间的通信。

istio假定存在服务注册表,以跟踪应用程序中服务的pod/vm。它还假设服务的新实例自动注册到服务注册表,并且不健康的实例将被自动删除。

pilot使用来自服务注册的信息,并提供与平台无关的服务发现接口。网格中的envoy实例执行服务发现,并相应地动态更新其负载均衡池。

网格中的服务使用其dns名称访问彼此。服务的所有HTTP流量都会通过envoy自动重新路由。envoy在负载均衡池中的实例之间分发流量。虽然envoy支持多种复杂的负载均衡算法,但istio目前仅允许三种负载均衡模式: 轮询、随机和带权重的最少请求。

除了负载均衡外,envoy还会定期检查池中每个实例的运行状况。

服务可以通过使用HTTP 503响应健康检查来主动减轻负担。在这种情况下,服务实例将立即从调用者的负载均衡池中删除。

故障处理

  • 超时处理
  • 基于超时预算的重试机制
  • 基于并发连接和请求的流量控制
  • 对负载均衡器成员的健康检查
  • 细粒度的熔断机制,可以针对Load Balancing Pool中的每个成员设置规则

故障注入

为什么需要错误注入:

  • 微服务架构下,需要测试端到端的故障恢复能力。

istio允许在网络层面按协议注入错误来模拟错误,无需通过应用层面删除pod,或者人为在TCP层造成网络故障来模拟。

注入的错误可以基于特定的条件,可以设置出现错误的比例:

  • Delay – 提高网络延时;
  • Aborts --直接返回特定的错误码。

规则配置

VirtualService 在istio服务网格中定义路由规则,控制路由如何路由到服务上。
DestinationRule 是VirtualService路由生效后,配置应用与请求的策略集。
ServiceEntry 是通常用于在istio服务网格之外启用对服务的请求。
Gateway 为HTTP/TCP流量配置负载均衡器,最常见的是在网格的边缘的操作,以启用应用程序的入口流量。

VirtualService

路由规则对应着一个或多个用VirtualService配置指定的请求目的的主机。

在服务之间分拆流量

例如: 下面的规则会把25%的reviews服务流量分配给v2标签; 其余的75%流量分配给v1。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: demo
spec:
  hosts:
  - demo
  http:
  - route:
    - destination:
        host: demo
        subset: v1
      weight: 75
    - destination:
        host: demo
        subset: v2
      weight: 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

超时和重试

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: canary
spec:
  hosts:
    - canary
  http:
    - route:
        - destination:
            host: canary
            subset: v1
        timeout: 1s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: canary
spec:
  hosts:
    - canary
  http:
    - route:
        - destination:
            host: canary
            subset: v1
      ### retry if upstream server send 5xx
        retries:
          attempts: 3
          perTryTimeout: 2s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

错误注入

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: canary
spec:
  hosts:
    - canary
  http:
    - route:
      - destination:
          host: canary
          subset: v1
      ### send 500 to client in 80%
      fault:
        abort:
          httpStatus: 500
          percentage:
            value: 80
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

条件规则

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: canary
spec:
  hosts:
    - canary
  http:
    - match:
        - headers:
            user:
              exact: jesse
....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

流量镜像

mirror规则可以使envoy截取所有request,并在转发请求的同时,将request转发至mirror版本,同时在header的host/authority加上-shadow。
这些mirror请求会工作在fire and forget模式,所有的response都会被废弃。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: canary
spec:
  hosts:
    - canary
  http:
    - route:
      - destination:
          host: httpbin
          subset: v1
        weight: 100
      mirror:
        host: httpbin
        subset: v2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

优先级

当对同一目标有多个规则时,会按照在VirtualService中的顺序进行应用,换句话说,列表中第一条规则具有最高优先级。

DestinationRule

在请求被VirtualService路由之后,DestinationRule配置的一系例策略就生效了。这些策略有服务属主编写,包含断路器、负载均衡以及TLS等的配置内容。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: canary
spec:
  host: canary
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

断路器

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutiveErrors: 1
      interval: 10s
      baseEjectionTime: 10s
      maxEjectionPercent: 100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

ServiceEntry

istio内部会维护一个服务注册表,可以用ServiceEntry向其中加入额外的条目。通常这个对象用来启用对istio服务网格之外的服务发出请求。
ServiceEntry中使用hosts字段来指定目标,字段值可以时一个完全限定名,也可以时个通配符域名。其中包含的白名单,包含一或多个允许网格中服务访问的服务。
只要ServiceEntry涉及到了匹配host的服务,就可以和VirtualService以及DestinationRule配合工作。

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: httpbin
spec:
  hosts:
    - *.xing.com
  ports:
    - number: 80
      name: http
      protocol: HTTP
    - number: 443
      name: https
      protocol: HTTPS
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Gateway

Gateway为HTTP/TCP流量配置了一个负载均衡,多数情况下在网格边缘进行操作,用于启用一个服务的入口流量。

HTTP

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: simple
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - simple.cncamp.io
      port:
        name: http-simple
        number: 80
        protocol: HTTP
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

HTTPS

#创建证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=xing Inc./CN=*.xing.io' -keyout xing.io.key -out xing.io.crt
#证书导入到secret中
kubectl create -n istio-system secret tls xing-credential --key=xing.io.key --cert=xing.io.crt
  • 1
  • 2
  • 3
  • 4
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: httpsserver
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - httpsserver.xing.io
      port:
        name: https-default
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: xing-credential
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号