Istio服务网格架构与Sidecar注入
Istio是Kubernetes生态中应用最广泛的服务网格实现,通过Sidecar代理(Envoy)拦截Pod间所有网络流量,实现流量管理、安全策略和可观测性功能,无需修改应用代码。Istio控制面负责配置下发和证书管理,数据面由每个Pod中的Envoy代理组成。
Istio的Sidecar注入通过命名空间标签自动控制。为命名空间打上istio-injection=enabled标签后,该命名空间下新建的Pod会自动注入Envoy Sidecar容器。
# 安装Istio CLI
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATH
# 使用default profile安装Istio
istioctl install --set profile=default -y
# 启用命名空间自动注入
kubectl label namespace default istio-injection=enabled
# 部署示例应用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# 验证Sidecar注入(每个Pod应有2个容器)
kubectl get pods
VirtualService流量路由配置
VirtualService定义请求路由规则,支持基于URI、Header、权重的流量分发。通过VirtualService可以实现灰度发布、A/B测试和流量镜像。
基于权重的灰度发布配置,将10%流量路由到v2新版本:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10
上述配置实现:名为jason的用户请求全部路由到v2版本,其他用户请求按9:1比例分发到v1和v2。
DestinationRule负载均衡与熔断
DestinationRule定义服务的负载均衡策略、连接池限制和熔断规则。subset字段与VirtualService中的subset对应,用于将服务分为不同版本子集。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews
namespace: default
spec:
host: reviews
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
maxRequestsPerConnection: 10
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 30s
maxEjectionPercent: 50
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
熔断配置说明:maxConnections限制TCP最大连接数100,http1MaxPendingRequests限制HTTP待处理请求50。outlierDetection连续5次5xx错误后弹出实例,弹出时间30秒,最多弹出50%实例。
流量镜像与故障注入测试
流量镜像将实时流量副本发送到新版本,不影响生产流量,用于线上环境验证:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-mirror
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
mirror:
host: reviews
subset: v2
mirrorPercentage:
value: 100.0
故障注入测试,注入500ms延迟和5%的5xx错误,验证服务韧性:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-fault
spec:
hosts:
- reviews
http:
- fault:
delay:
percentage:
value: 50
fixedDelay: 500ms
abort:
percentage:
value: 5
httpStatus: 503
route:
- destination:
host: reviews
subset: v1
可观测性组件集成
Istio开箱提供三类可观测性数据:指标(Metrics)、分布式追踪(Tracing)、访问日志(Access Logs)。
Kiali提供服务网格拓扑可视化,展示服务间调用关系和健康状态:
# 安装Kiali、Jaeger、Prometheus、Grafana插件
kubectl apply -f samples/addons/kiali.yaml
kubectl apply -f samples/addons/jaeger.yaml
kubectl apply -f samples/addons/prometheus.yaml
kubectl apply -f samples/addons/grafana.yaml
# 访问Kiali控制台
istioctl dashboard kiali
# 访问Jaeger追踪
istioctl dashboard jaeger
分布式追踪配置:Istio默认采样率为1%,生产环境建议根据流量量级调整。通过Telemetry API自定义采样率:
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: tracing-config
namespace: istio-system
spec:
tracing:
- randomSamplingPercentage: 10.0
customTags:
cluster:
env:
name: CLUSTER_ID
Istio生产部署调优
Sidecar资源限制:Envoy默认无资源限制,高流量场景下可能消耗大量内存。通过Sidecar资源配额限制:
apiVersion: v1
kind: Namespace
metadata:
name: default
annotations:
sidecar.istio.io/proxyCPU: "500m"
sidecar.istio.io/proxyMemory: "512Mi"
sidecar.istio.io/proxyCPULimit: "2000m"
sidecar.istio.io/proxyMemoryLimit: "1024Mi"
Sidecar范围限制:默认每个Pod的Envoy接收网格内所有服务的配置,大规模集群会显著增加内存占用。通过Sidecar资源限制Envoy只接收所需服务的配置:
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: default-sidecar
namespace: default
spec:
egress:
- hosts:
- "./*"
- "istio-system/*"
控制面高可用:生产环境部署Istiod至少2个副本,配置PodDisruptionBudget保证滚动更新时至少1个可用实例。通过HorizontalPodAutoscaler根据CPU负载自动扩缩容控制面。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/istio-fu-wu-wang-ge-liu-liang-zhi-li-yu-ke-guan-ce-xing-pei/