赞
踩
特定网格中服务的规范表示由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。
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响应健康检查来主动减轻负担。在这种情况下,服务实例将立即从调用者的负载均衡池中删除。
为什么需要错误注入:
istio允许在网络层面按协议注入错误来模拟错误,无需通过应用层面删除pod,或者人为在TCP层造成网络故障来模拟。
注入的错误可以基于特定的条件,可以设置出现错误的比例:
VirtualService 在istio服务网格中定义路由规则,控制路由如何路由到服务上。
DestinationRule 是VirtualService路由生效后,配置应用与请求的策略集。
ServiceEntry 是通常用于在istio服务网格之外启用对服务的请求。
Gateway 为HTTP/TCP流量配置负载均衡器,最常见的是在网格的边缘的操作,以启用应用程序的入口流量。
路由规则对应着一个或多个用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
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: canary
spec:
hosts:
- canary
http:
- route:
- destination:
host: canary
subset: v1
timeout: 1s
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
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
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: canary
spec:
hosts:
- canary
http:
- match:
- headers:
user:
exact: jesse
....
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
当对同一目标有多个规则时,会按照在VirtualService中的顺序进行应用,换句话说,列表中第一条规则具有最高优先级。
在请求被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
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
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
Gateway为HTTP/TCP流量配置了一个负载均衡,多数情况下在网格边缘进行操作,用于启用一个服务的入口流量。
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
#创建证书
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
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。