istio具体介绍

84 阅读11分钟

Istio技术分析

服务网格(Service Mesh)是用于处理服务与服务之间通信的基础设施层。它负责为云原生应用提供可靠的网络请求传递,并实现了基本的微服务通信功能,如服务发现、负载均衡、监控、流量管理和访问控制等。服务网格通过与应用程序一起部署的代理程序来处理所有请求,这些代理程序对于应用程序来说是透明的。

Istio简介

Istio始于2016年,是谷歌、IBM和Lyft创建的服务网格的开源实现。Istio提供了一套完整的解决方案来管理微服务的通信,它被设计为与Kubernetes和OpenShift等部署平台无关,甚至可以在传统部署环境(如虚拟机)中使用。

Istio的主要组件

1. Envoy代理

Istio使用扩展版的Envoy代理,Envoy是用C++开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。它是唯一与数据平面流量交互的Istio组件。Envoy代理启用的功能包括:

  • 流量控制:通过丰富的HTTP、gRPC、WebSocket和TCP流量路由规则执行细粒度的流量控制。例如,可以配置根据HTTP请求的路径将流量转发到不同的服务,实现A/B测试。

    例子:假设有两个版本的服务 v1v2,可以配置流量分配,使得90%的请求流向 v1,而10%的请求流向 v2

  • 网络弹性特性:重试设置、故障转移、熔断器和故障注入。例如,当一个服务请求失败时,可以自动重试请求。

    例子:如果服务A请求服务B时发生超时,可以配置重试策略,使得服务A在一定时间间隔后重新发起请求。

  • 安全性和身份认证:执行安全性策略,通过配置API定义的访问控制和速率限制强制执行。例如,可以为微服务之间的通信启用mTLS,确保数据传输的加密和身份验证。

  • 可插拔扩展:基于WebAssembly的可插拔扩展模型,允许通过自定义策略执行和生成网格流量的遥测。

2. Istiod

Istiod提供服务发现、配置和证书管理。Istiod包含几个关键组件:

  • Pilot:流量管理组件,为Envoy Sidecar提供服务发现功能,并提供智能路由和流量处理能力。

    例子:可以配置Pilot,使得在某个特定时间段内,将服务请求路由到不同的服务实例,进行金丝雀部署。

  • Citadel:安全组件,提供证书生成、下发和加密通信。

    例子:使用Citadel为服务生成和下发证书,确保服务间的通信是加密的,防止中间人攻击。

  • Galley:配置管理组件,验证配置信息的格式和内容,并将其分发到其他组件。

    例子:通过Galley验证和分发新的路由配置,使得服务网格中的所有代理程序都能正确执行新的路由规则。

流量管理

Istio提供强大的流量管理功能:

  • 请求路由和流量转移:通过配置路由规则,将请求转发到不同的服务或服务版本。

    例子:配置规则,使得90%的请求流向 服务A,而10%的请求流向 服务B,实现A/B测试。

  • 弹性功能:包括熔断、超时和重试。

    例子:设置熔断器,当某个服务的失败率超过阈值时,自动停止向该服务发送请求,以保护系统的稳定性。

  • 调试能力:包括故障注入和流量镜像。

    例子:使用故障注入在测试环境中模拟服务故障,验证系统的容错能力。

安全

Istio在安全方面提供了全面的解决方案:

  • 认证

    • 对等认证(Peer Authentication):用于服务到服务的认证,通过mTLS实现。

      例子:启用mTLS,确保服务A与服务B之间的通信是加密的,并且双方都能验证对方的身份。

    • 请求认证(Request Authentication):用于终端用户或客户端的认证,通过JWT实现。

      例子:使用JWT验证用户的身份,确保只有合法用户才能访问服务。

  • 授权:Istio的授权策略可以为网格中的服务提供不同级别的访问控制,支持ALLOW和DENY动作。

    例子:配置授权策略,允许特定用户访问服务A,但禁止访问服务B。

数据类型和集成工具

  • 指标(Metrics):通过Prometheus查询,Grafana可视化和Kiali构建服务交互图。

    例子:使用Prometheus监控服务的请求次数和错误率,使用Grafana创建可视化仪表盘,显示服务的运行状态。

  • 日志(Access Logs):通过OpenTelemetry配置Envoy代理发送访问日志。

    例子:配置OpenTelemetry收集Envoy代理的访问日志,记录每个请求的详细信息,用于故障排除和性能优化。

  • 分布式追踪(Distributed Traces):通过Jaeger或Zipkin发送追踪请求。

    例子:使用Jaeger追踪服务请求的整个生命周期,识别性能瓶颈并优化服务调用链路。

配置示例

1. 路由流量到不同版本的服务

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10

这个配置将90%的流量路由到reviews服务的v1版本,其余10%的流量路由到v2版本。

2. 熔断器配置

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http1MaxPendingRequests: 1000
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutiveErrors: 5
      interval: 5s
      baseEjectionTime: 15m
      maxEjectionPercent: 50

这个配置为reviews服务设置了熔断器,当检测到连续5次错误时,将断开与目标服务的连接。

3. 请求认证

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: example-jwt
spec:
  selector:
    matchLabels:
      app: httpbin
  jwtRules:
  - issuer: "https://example.com"
    jwksUri: "https://example.com/.well-known/jwks.json"

这个配置将对标签为app: httpbin的服务进行JWT验证,确保请求者的身份是否合法。

4. 服务间mTLS认证

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
spec:
  mtls:
    mode: STRICT

这个配置启用了全网格范围内的mTLS,对服务间的通信进行加密和认证。

5. 分布式追踪

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
spec:
  profile: default
  meshConfig:
    enableTracing: true
    defaultConfig:
      tracing:
        zipkin:
          address: zipkin.istio-system:9411

这个配置启用了分布式追踪,并将追踪数据发送到zipkin服务。

6. 配置故障注入

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percentage:
          value: 100.0
        fixedDelay: 5s
    route:
    - destination:
        host: ratings
        subset: v1

这个配置将在ratings服务的每个请求上引入5秒的固定延迟,以模拟服务延迟和故障。

7. 流量镜像

示例:将流量镜像到不同版本的服务

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
    mirror:
      host: reviews
      subset: v2
    mirrorPercentage:
      value: 10.0

这个配置将90%的reviews服务请求流量路由到v1版本,并将10%的流量镜像到v2版本,用于测试和验证。

8. 配置访问日志

示例:启用并配置访问日志

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
spec:
  profile: default
  meshConfig:
    accessLogFile: "/dev/stdout"
    accessLogEncoding: JSON
    defaultConfig:
      accessLogFormat: '{"start_time": "%START_TIME%", "method": "%REQ(:METHOD)%", "url": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%", "response_code": "%RESPONSE_CODE%", "response_flags": "%RESPONSE_FLAGS%"}'

这个配置启用访问日志,并将日志记录格式设为JSON,记录请求的开始时间、方法、URL、响应代码和响应标志等信息。

9. 配置Prometheus指标采集

示例:为Prometheus配置Istio的指标采集

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
spec:
  profile: default
  meshConfig:
    enablePrometheusMerge: true
    defaultConfig:
      proxyMetadata:
        OUTPUT_PROMETHEUS_ENDPOINT: "http://prometheus.istio-system:9090/metrics"

这个配置启用Prometheus指标采集,并指定Prometheus端点地址。

10. 使用Kiali可视化服务交互

示例:安装Kiali以可视化Istio网格

apiVersion: v1
kind: Namespace
metadata:
  name: kiali-namespace
---
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: kiali-namespace
type: Opaque
data:
  username: <base64-encoded-username>
  passphrase: <base64-encoded-password>
---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
spec:
  profile: default
  components:
    kiali:
      enabled: true
      namespace: kiali-namespace

这个配置安装了Kiali,并在kiali-namespace命名空间中启用Kiali服务。

11. 定义DestinationRule配置

示例:为服务配置负载均衡策略

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service
spec:
  host: my-service
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN

这个配置为my-service服务设置了负载均衡策略,使用最少连接数法(LEAST_CONN)进行请求分配。

12. 配置Gateway资源

示例:定义Ingress Gateway来暴露服务

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

这个配置定义了一个Ingress Gateway,将HTTP流量暴露给所有主机。

13. 配置VirtualService资源

示例:定义VirtualService来管理请求路由

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-virtualservice
spec:
  hosts:
  - my-service
  gateways:
  - my-gateway
  http:
  - match:
    - uri:
        exact: /hello
    route:
    - destination:
        host: my-service
        port:
          number: 8080

这个配置定义了一个VirtualService,将匹配到/hello路径的请求路由到my-service服务的8080端口。

当然,我将继续提供更多关于Istio的配置示例。

20. 配置Outlier Detection

示例:设置异常检测以移除不稳定的服务实例

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    outlierDetection:
      consecutiveErrors: 5
      interval: 10s
      baseEjectionTime: 30s
      maxEjectionPercent: 100

这个配置为reviews服务设置了异常检测,当检测到连续5次错误时,将移除不稳定的服务实例。

21. 配置Rate Limiting

示例:为服务设置速率限制

apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
  name: memquota
spec:
  compiledAdapter: memquota
  params:
    quotas:
    - name: requestcount.quota.istio-system
      maxAmount: 100
      validDuration: 1s
      overrides:
      - dimensions:
          destination: ratings
        maxAmount: 10
        validDuration: 1s
---
apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:
  name: requestcount
spec:
  compiledTemplate: quota
  params:
    dimensions:
      destination: destination.labels["app"] | "unknown"
---
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
  name: quota
spec:
  match: context.reporter.kind == "inbound" && destination.service.host == "ratings.default.svc.cluster.local"
  actions:
  - handler: memquota
    instances: [ requestcount ]

这个配置为ratings服务设置了速率限制,每秒最多接收100个请求。

22. 配置Circuit Breaking

示例:为服务设置熔断器

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1000
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutive5xxErrors: 7
      interval: 5m
      baseEjectionTime: 15m
      maxEjectionPercent: 50

这个配置为reviews服务设置了熔断器,当检测到连续7次服务器错误时,将断开与目标服务的连接。

23. 配置Traffic Shifting

示例:配置流量转移以实现蓝绿部署

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v2
      weight: 50

这个配置将reviews服务的流量均匀分配到v1和v2两个版本,实现蓝绿部署。

24. 配置JWT验证

示例:为终端用户启用JWT请求认证

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-example
spec:
  selector:
    matchLabels:
      app: httpbin
  jwtRules:
  - issuer: "https://example.com"
    jwksUri: "https://example.com/.well-known/jwks.json"

这个配置为httpbin应用启用了JWT请求认证,确保请求者的身份是合法的。

25. 配置Custom Metrics

示例:创建自定义指标

apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:
  name: newmetric
spec:
  compiledTemplate: metric
  params:
    value: "request.time"
    dimensions:
      reporter: conditional((context.reporter.kind | "unknown") == "inbound", "server", "client")
      source: source.workload.name | "unknown"
      destination: destination.workload.name | "unknown"
---
apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
  name: prometheus
spec:
  compiledAdapter: prometheus
  params:
    metrics:
    - name: newmetric
      instance_name: newmetric
      kind: COUNTER
      label_names:
      - source
      - destination
---
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
  name: newmetric
spec:
  match: true
  actions:
  - handler: prometheus
    instances:
    - newmetric

这个配置创建了一个自定义指标newmetric,并将其导出到Prometheus。

明白了,让我们继续提供更多关于Istio的配置示例。

26. 配置负载均衡策略

示例:为服务配置最小请求数负载均衡策略

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: LEAST_REQUEST
      consistentHash:
        httpHeaderName: "user"

这个配置为reviews服务设置了最小请求数负载均衡策略,并基于user HTTP头进行哈希。

27. 配置HTTP超时

示例:设置HTTP请求的超时时间

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
    timeout: 5s

这个配置将reviews服务的HTTP请求超时时间设置为5秒。

28. 配置自动重试

示例:为服务启用自动重试

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
    retries:
      attempts: 3
      perTryTimeout: 2s

这个配置为reviews服务启用了自动重试,每次尝试的超时时间为2秒,最多重试3次。

29. 配置流量拆分

示例:为服务配置流量拆分

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - uri:
        prefix: "/v1"
    route:
    - destination:
        host: reviews
        subset: v1
  - match:
    - uri:
        prefix: "/v2"
    route:
    - destination:
        host: reviews
        subset: v2

这个配置根据URI前缀将流量拆分到reviews服务的不同版本。

30. 配置用户自定义策略

示例:使用WebAssembly创建自定义策略

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-wasm
spec:
  workloadSelector:
    labels:
      app: reviews
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        filterChain:
          filter:
            name: "envoy.http_connection_manager"
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.wasm
        config:
          config:
            name: "custom_filter"
            root_id: "custom_root"
            vm_config:
              vm_id: "custom_vm"
              runtime: "envoy.wasm.runtime.v8"
              code:
                local:
                  filename: "/etc/istio/custom-filter.wasm"

这个配置通过WebAssembly为reviews服务创建了一个自定义策略。