Istio #
简介 #
Istio,是一种服务网格的平台。在微服务系统中起着连接,保护,控制和观察服务的作用。它可以降低微服务部署的复杂程度,减轻开发团队压力,无缝接入现有分布式应用程序,可以集成日志,遥测,和策略系统的 API 接口。
服务网格:
Service Mesh 是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,Service Mesh 保证请求可以在这些拓扑中可靠地穿梭。在实际应用当中,Service Mesh 通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但应用程序不需要知道它们的存在。
用来描述组成应用程序的微服务网络以及它们之间的交互。
实现需求包括:
- 服务发现
- 负载均衡
- 故障恢复
- 指标和监控
- A/B 测试
- 金丝雀发布
- 速率控制
- 访问控制
- 端到端认证
istioctl #
管理 istio 的命令行工具。
安装 #
curl -L https://istio.io/downloadIstio | sh -
cp istio-x.x.x /usr/local
cd istio-x.x.x
export PATH=$PWD/bin:$PATH
- Istio 的绝大多数治理能力都是在 Sidecar 而非应用程序中实现,因此是非侵入的;
- Istio 的调用链埋点逻辑也是在 Sidecar 代理中完成,对应用程序非侵入,但应用程序需做适当的修改,即配合在请求头上传递生成的 Trace 相关信息。
关键功能:
- 流量管理
- 可观察性
- 策略执行
- 服务身份和安全
- 平台支持
- 集成和定制
架构 #
数据面板 #
Envoy #
Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。
控制面板 #
Pilot #
为 Envoy sidecar 提供服务发现、用于智能路由的流量管理功能(例如,A/B 测试、金丝雀发布等)以及弹性功能(超时、重试、熔断器等)。
结构:
- Abstract Model
- Platform Adapter
功能:
- 请求路由
- 服务发现和负载均衡
- 故障处理
- 故障注入
- 规则配置
Citadel #
通过内置的身份和证书管理,可以支持强大的服务到服务以及最终用户的身份验证。
Galley #
是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。
Mixer #
流量管理 #
服务注册中心,服务发现系统,默认轮询策略 负载均衡池
虚拟服务(Virtual Service) #
虚拟服务让您配置如何在服务网格内将请求路由到服务,这基于 Istio 和平台提供的基本的连通性和服务发现能力。
示例:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
gateway:
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3
路由规则 #
- match:
- headers:
end-user:
exact: jason
- match:
- uri:
prefix: /reviews
路由规则的优先级:从上往下,满足规则即流向路由目标
Destination #
route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10
目标规则(Destination Rule) #
Deployment => Pod => Service => DestinationRule => VirtualService=> Gateway
负载均衡的子集
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-svc
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
subsets.trafficPolicy.loadBalancer.simple
指定访问 Service 后端的 endpoint 的流量策略。RANDOM:随机,ROUND_ROBIN:轮询。
网关(Gateway) #
为网格来管理入站和出站流量,可以让您指定要进入或离开网格的流量。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ext-host-gwy
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- ext-host.example.com
tls:
mode: SIMPLE
serverCertificate: /tmp/tls.crt
privateKey: /tmp/tls.key
将指定 host 的流量流入网格,然后将网关绑定到 VirtualService 上进行路由规则的指定。
服务入口(Service Entry) #
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: svc-entry
spec:
hosts:
- ext-svc.example.com
ports:
- number: 443
name: https
protocol: HTTPS
location: MESH_EXTERNAL
resolution: DNS
Sidecar #
网络弹性和测试 #
超时 #
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
timeout: 10s
下面的示例是一个虚拟服务,它对 ratings 服务的 v1 子集的调用指定 10 秒超时。
重试 #
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
retries:
attempts: 3
perTryTimeout: 2s
下面的示例配置了在初始调用失败后最多重试 3 次来连接到服务子集,每个重试都有 2 秒的超时。
熔断 #
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
到达目标主机的请求超过预设值,则触发熔断,停止请求连接到该主机。
故障注入(混沌工程) #
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 50
fixedDelay: 5s
route:
- destination:
host: ratings
subset: v1
下面的虚拟服务为百分之五十的访问
ratings
服务的请求配置了一个 5 秒的延迟。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
abort:
httpStatus: 500
percentage:
value: 100
route:
- destination:
host: ratings
subset: v1
下面的虚拟服务为所有访问
ratings
服务的请求配置了一个中止响应。
流量转移 #
逐步调整百分比的流量,完成由部分路由到完全路由的迁移升级。
如:v1 80% + v2 20% => v2 100%
记录 #
管理 ingressgateway https 连接使用AWS的 TLS 密钥和证书。
kind: Service
apiVersion: v1
metadata:
name: istio-ingressgateway
namespace: istio-system
...
annotations:
...
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: >-
arn:aws:acm:ap-southeast-1:314566904004:certificate/379dd055-44a7-42b6-a303-84938146b304
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
Gateway:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: demo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
tls:
httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https-443
protocol: HTTP
hosts:
- "*"