企业信息化管理系统

EIMS - 助力企业数字化转型

企业信息化系统服务网格架构设计与 Istio 实践

引言

随着企业信息化系统规模的扩大,微服务架构面临着服务发现、负载均衡、熔断限流、链路追踪等一系列治理挑战。服务网格(Service Mesh)作为一种基础设施层,为微服务提供了统一的治理能力。本文将介绍如何基于 Istio 构建企业级服务网格架构。

服务网格架构概述

服务网格将微服务治理能力下沉到基础设施层,通过边车代理(Sidecar Proxy)拦截所有服务间流量,实现无侵入式的服务治理。

组件 职责 说明
Sidecar Proxy 流量拦截与转发 Envoy 代理
Control Plane 配置管理与策略下发 Istiod/Istio Control Plane
Mixer 策略检查与遥测收集 V1 版本已废弃
Gateway 入口流量管理 Istio Ingress/Egress Gateway

Istio 核心配置

VirtualService 和 DestinationRule 配置:

# VirtualService - 路由规则配置
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: eims-order-service
  namespace: enterprise-system
spec:
  hosts:
  - order-service
  - order.enterprise.com
  http:
  - name: default-route
    match:
    - headers:
        X-Request-Type:
          exact: api
    route:
    - destination:
        host: order-service
        subset: v2
        port:
          number: 8080
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: connect-failure,refused-stream,unavailable,cancelled,retriable-status-codes
    timeout: 10s

  - name: web-route
    match:
    - headers:
        X-Request-Type:
          exact: web
    route:
    - destination:
        host: order-service
        subset: v1
        port:
          number: 8080
    rewrite:
      uri: /web
    retries:
      attempts: 2
      perTryTimeout: 5s

  - name: default
    route:
    - destination:
        host: order-service
        subset: v1
        port:
          number: 8080

  # 流量镜像配置
  - name: mirror-route
    route:
    - destination:
        host: order-service
        subset: v1
        port:
          number: 8080
    mirrors:
    - destination:
        host: order-service
        subset: v2
        port:
          number: 8080
      weight: 100

---
# DestinationRule - 目标规则配置
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: order-service-destination
  namespace: enterprise-system
spec:
  host: order-service
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
        connectTimeout: 30s
      http:
        h2UpgradePolicy: UPGRADE
        http1MaxPendingRequests: 100
        http2MaxRequests: 1000
        maxRequestsPerConnection: 100
    loadBalancer:
      simple: LEAST_REQUEST
      consistentHash:
        httpHeaderName: X-User-Id
        minimumRingSize: 1024
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 30s
      maxEjectionPercent: 50

  subsets:
  - name: v1
    labels:
      version: v1
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN
  - name: v2
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: LEAST_REQUEST
      connectionPool:
        tcp:
          maxConnections: 200
        http:
          http2MaxRequests: 2000

服务治理实践

熔断和限流配置:

# 限流策略配置
apiVersion: networking.istio.io/v1beta1
kind: EnvoyFilter
metadata:
  name: rate-limit-filter
  namespace: enterprise-system
spec:
  workloadSelector:
    labels:
      app: order-service
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.local_ratelimit
        typed_config:
          "@type": type.googleapis.com/udpa.type.v1.TypedStruct
          type_url: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
          value:
            stat_prefix: http_local_rate_limiter
            token_bucket:
              max_tokens: 100
              tokens_per_fill: 10
              fill_interval: 1s
            filter_enabled:
              runtime_key: local_rate_limit_enabled
              default_value:
                numerator: 100
                denominator: HUNDRED

---
# 熔断配置
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: order-service-circuit-breaker
spec:
  host: order-service
  trafficPolicy:
    outlierDetection:
      # 连续 5 次 5xx 错误触发熔断
      consecutive5xxErrors: 5
      # 熔断间隔 30 秒
      interval: 30s
      # 最小 ejection 时间 30 秒
      baseEjectionTime: 30s
      # 最多 50% 实例被驱逐
      maxEjectionPercent: 50
      # 最小健康实例数
      minHealthPercent: 30

---
# 流量镜像配置 - 金丝雀发布
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: order-service-canary
spec:
  hosts:
  - order-service
  http:
  - route:
    - destination:
        host: order-service
        subset: v1
      weight: 90
    - destination:
        host: order-service
        subset: v2
      weight: 10
    mirror:
      host: order-service
      subset: v2

安全配置

mTLS 和授权策略配置:

# 启用 mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: enterprise-system
spec:
  mtls:
    mode: STRICT

---
# 服务间 mTLS 配置
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: order-service-authz
  namespace: enterprise-system
spec:
  selector:
    matchLabels:
      app: order-service
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/enterprise-system/sa/order-service
        - cluster.local/ns/enterprise-system/sa/payment-service
    to:
    - operations:
      - paths: ["*"]
        methods: ["GET", "POST"]
        ports: ["8080"]
  - from:
    - source:
        namespaces: ["enterprise-system"]
    to:
    - operations:
        paths: ["/health", "/ready"]
        methods: ["GET"]
        ports: ["8080"]

---
# 请求认证配置
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-auth
  namespace: enterprise-system
spec:
  selector:
    matchLabels:
      app: order-service
  jwtRules:
  - issuer: "https://auth.enterprise.com"
    audiences:
    - "order-service"
    forwardOriginalToken: true
    requireAudiencesInToken: false
    fromHeaders:
    - name: Authorization
      prefix: "Bearer "

可观测性配置

链路追踪和指标收集:

# Telemetry 配置 - 指标收集
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: default-metrics
  namespace: enterprise-system
spec:
  tracing:
  - providers:
    - name: jaeger
    randomSamplingPercentage: 10.0
    customTags:
      "custom-label":
        literal:
          value: "custom-value"
  metrics:
  - providers:
    - name: prometheus
  logs:
  - providers:
    - name: istio
    filter:
      match: MANDATORY

---
# VirtualService 配置采样率
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: order-service-tracing
spec:
  hosts:
  - order-service
  http:
  - route:
    - destination:
        host: order-service
    headers:
      response:
        add:
          x-trace-id: "#(request.headers['x-request-id'])"

最佳实践建议

总结

服务网格为企业信息化系统提供了强大的服务治理能力:

通过 Istio 服务网格,可以显著提升微服务架构的可维护性和可靠性。

← 下一篇:企业信息化系统实时数据同步与双写架构设计