Skip to main content

k8s istio 解决方案

· 5 min read

Istio

Istio  是一个开源的  服务网格(Service Mesh)  平台,用于管理、连接和保护微服务架构中的服务间通信。它通过透明的代理(基于  Envoy)拦截网络流量,并提供以下核心功能:

核心功能

  1. 流量管理
    • 动态路由配置(A/B 测试,金丝雀 Canary 发布)
    • 负载均衡、超时重试、熔断(Circuit Breaking)
    • 通过VirtualServiceDestinationRule 匹配规则
  2. 安全性
    • 自动服务间身份认证(mTLS)
    • 细颗粒的访问控制(基于 RBAC)
    • 通过 AuthorizationPolicy 定义权限
  3. 可观测性
    • 自动生成指标(Prometheus)、日志和分布式追踪(Jaeger/Zipkin)
    • 通过 Grafana 提供可视化监控
  4. 稳定性
    • 故障注入 fault injection
  5. 策略与扩展
    • 配额管理(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. 延迟注入:模拟网络延迟或服务过载
  2. 中止注入:模拟服务崩溃或不可用

配置方法

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

验证故障注入

  1. 应用配置:
kubectl apply -f virtualservice-with-fault-injection.yaml
  1. 观察效果:
# 查看是否生效
kubectl get virtualservice ratings -o yaml

# 测试请求
for i in {1..10}; do curl -I http://<your-service>; done

注意事项

  1. 故障注入只在 VirtualService 的特定路由上生效
  2. 百分比设置是基于请求的随机选择
  3. 生产环境使用时要谨慎,建议先在测试环境验证
  4. 可以结合监控系统(如 Prometheus + Grafana)观察故障注入效果

清理故障注入

kubectl delete virtualservice ratings

通过合理配置故障注入,您可以有效测试系统的容错能力和恢复能力。

Resources