k8s istio 解决方案
· 5 min read
Istio
Istio 是一个开源的 服务网格(Service Mesh) 平台,用于管理、连接和保护微服务架构中的服务间通信。它通过透明的代理(基于 Envoy)拦截网络流量,并提供以下核心功能:
核心功能
- 流量管理
- 动态路由配置(A/B 测试,金丝雀 Canary 发布)
- 负载均衡、超时重试、熔断(Circuit Breaking)
- 通过
VirtualService
和DestinationRule
匹配规则
- 安全性
- 自动服务间身份认证(mTLS)
- 细颗粒的访问控制(基于 RBAC)
- 通过
AuthorizationPolicy
定义权限
- 可观测性
- 自动生成指标(Prometheus)、日志和分布式追踪(Jaeger/Zipkin)
- 通过
Grafana
提供可视化监控
- 稳定性
- 故障注入 fault injection
- 策略与扩展
- 配额管理(
Rate Limiting
) - 通过
Wasm
插件扩展功能
- 配额管理(
架构组成
- 数据平面(Data Plane):由 Envoy 代理(Sidecar)组成,拦截所有服务间流量。
- 控制平面(Control Plane):包含以下组件:
- Citadel:管理证书和安全性。
- Pilot:配置 Envoy 的流量规则。
- Galley:验证和分发配置。
- Telemetry(1.5 版本之前): 管理指标和日志, 1.5 版本开始由 Envoy 代理 (数据平面)直接生成指标和日志
- Policy(1.5 版本之前): 管理策略,1.5 版本开始直接通过 Envoy 代理 (数据平面) 执行
适用场景
- 微服务架构中复杂的服务通信。
- 需要零信任安全(Zero Trust)的多集群环境。
- 渐进式发布(如蓝绿部署)和故障恢复。
准备
Istio 相关配置
添加官方 repo 来源
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
查询版本
helm search repo istio/base
获取 helm chart 的默认值并保存为文件
helm show values istio/base --version 1.17.1 > helm-defaults/istio-base-default.yaml
global:
# ImagePullSecrets for control plane ServiceAccount, list of secrets in the same namespace
# to use for pulling any images in pods that reference this ServiceAccount.
# Must be set for any cluster configured with private docker registry.
imagePullSecrets: []
# Used to locate istiod.
istioNamespace: istio-system
istiod:
enableAnalysis: false
configValidation: true
externalIstiod: false
remotePilotAddress: ""
base:
# Used for helm2 to add the CRDs to templates.
enableCRDTemplates: false
# Validation webhook configuration url
# For example: https://$remotePilotAddress:15017/validate
validationURL: ""
# For istioctl usage to disable istio config crds in base
enableIstioConfigCRDs: true
defaultRevision: "default"
Kubernetes (AWS EKS)
Istio 运行在 k8s 上,需要准备运行的 k8s 集群。
https://github.com/xiaokatech/k8s-service-mesh-lab/tree/master/eks-terraform-v1
测试 Istio 正确安装到 k8s 中
kubectl get crds | grep 'istio.io'
kubectl get pods -n istio-system
Gateway
Before change DNS config
curl --header "Host: app.devopsbyexample.com" https://afe7f078xxxx.us-east-1.elb.amazonaws.com/api/devices
kubectl apply -f cert-manager/cert-manager.yaml
kubectl apply -f cert-manager/issuer-staging.yaml
kubectl apply -f cert-manager/issuer-production.yaml
kubectl get ClusterIssuer
check certification
openssl s_client -connect app.devopsbyexample.com:443
故障注入
Istio 提供了强大的故障注入功能,允许您测试微服务应用的弹性能力。以下是配置 Istio 故障注入的方法:
故障注入类型
Istio 支持两种故障注入方式:
- 延迟注入:模拟网络延迟或服务过载
- 中止注入:模拟服务崩溃或不可用
配置方法
1. 通过 VirtualService 配置
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
# 延迟注入配置
delay:
percentage:
value: 10.0 # 10%的请求会被延迟
fixedDelay: 5s # 固定延迟5秒
# 中止注入配置
abort:
percentage:
value: 10.0 # 10%的请求会失败
httpStatus: 500 # 返回500状态码
route:
- destination:
host: ratings
subset: v1
2. 常用配置示例
纯延迟注入
fault:
delay:
fixedDelay: 7s
percentage:
value: 50
纯错误注入
fault:
abort:
httpStatus: 503
percentage:
value: 100
组合注入(延迟+错误)
fault:
delay:
fixedDelay: 5s
percentage:
value: 100
abort:
httpStatus: 500
percentage:
value: 50
验证故障注入
- 应用配置:
kubectl apply -f virtualservice-with-fault-injection.yaml
- 观察效果:
# 查看是否生效
kubectl get virtualservice ratings -o yaml
# 测试请求
for i in {1..10}; do curl -I http://<your-service>; done
注意事项
- 故障注入只在 VirtualService 的特定路由上生效
- 百分比设置是基于请求的随机选择
- 生产环境使用时要谨慎,建议先在测试环境验证
- 可以结合监控系统(如 Prometheus + Grafana)观察故障注入效果
清理故障注入
kubectl delete virtualservice ratings
通过合理配置故障注入,您可以有效测试系统的容错能力和恢复能力。