Istio 不健康节点驱逐 —— 外部流量管理
简述
用到的是Istio DestinationRule
.spec.trafficPolicy.outlierDetection
管理的节点在 K8s集群外, Windows IIS节点
链路
Istio → 外部Windows(Gateway → VirtualService → ServiceEntry → WorkloadEntry)
需求
在管理的外部Windows 后端, 发生 节点503、502、500等5xx时进行后端流量摘除, 等待后端正常后 流量恢复
告警处理链路
效果
在集群外后端 Windows, 发生后端响应状态码为5xx时 对不健康节点流量摘除一段时间, 这段时间后自动恢复转发
DestinationRule
在30s内, 网关收到 20次 5xx状态码返回, 则将对应HomeMWeb节点驱逐3分钟, 最多只驱逐50%节点(默认只驱逐10%), 保证多实例正常负载
# .spec.trafficPolicy.outlierDetection ## 不健康节点驱逐
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: homemweb-detection
namespace: beta-winserver # 需要指定命名空间
spec:
host: HomeMWeb.Beta # 与VirutualService、ServiceEntry匹配
trafficPolicy:
outlierDetection:
baseEjectionTime: 3m # 驱逐不健康节点时长, 注意 会按2倍基数的时间增加,如 首次3分钟, 下次则6分钟 再下次12分钟
consecutive5xxErrors: 20 # 网关5xx错误次数
interval: 30s # 间隔统计时间
maxEjectionPercent: 50 # 最大驱逐百分比
minHealthPercent: 50 # 最小健康节点比例,若低于这个值 则不做故障驱逐,转发至所有节点
实验
让GPT写了个测试脚本
准备http请求测试脚本
#!/bin/bash
# 定义目标 URL
URL="https://地址.com/Beta.abc/check.html"
# 定义颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # 没有颜色
# 进行 xx 次请求,每次间隔 xx 秒
for i in {1..300}; do
# 发送请求并获取状态码和响应内容
response=$(curl -s -w "%{http_code}" "$URL")
# 分离状态码和响应内容
status_code=${response: -3}
content="${response:0:${#response}-3}"
# 获取当前时间
current_time=$(date "+%Y-%m-%d %H:%M:%S")
# 根据状态码设置颜色
if [ "$status_code" -eq 200 ]; then
color=$GREEN
elif [ "$status_code" -eq 500 ]; then
color=$RED
else
color=$NC
fi
# 输出当前时间和状态码,并加上相应的颜色
echo -e "[$current_time] Request $i: HTTP Status Code = ${color}$status_code${NC} $content"
# 等待请求时间
sleep 0.5
done
简单测试
2节点, 1个正常 1个不正常
1)增加策略前, 流量会均匀打在健康、不健康后端
2) 增加策略后, 触发设定阈值, 只会打到健康节点
复杂测试
情况说明:
4台机器测试, 其中某个接口频繁500, 主流程接口200
测试方式:
同时对2个接口进行批量调用, 左侧返回200并输出响应节点、右侧直接返回500状态码, 根据设置的规则测试驱逐效果