咱们做运维的,最怕啥?除了被夜间告警惊醒,可能就是**“系统改造时,运维成了背锅侠”。而这几年微服务架构普及,“服务网格”(Service Mesh)像是给分布式系统装上了外挂,无论是通信、熔断、限流、链路追踪、mTLS**,你想要的它全都有。
可问题也来了:“服务网格引进后,性能下降了、延迟上升了、运维成本更高了”。明明说好的架构升级,咋就成了“自找麻烦”?
今天我们就聊聊:服务网格真香,但怎么优化才不翻车?
很多团队一听“服务网格”三个字,立马兴奋:这是新架构啊、这是先进理念啊、这是大厂都在用啊!
等等兄弟——你的服务真的需要吗?
服务网格的核心价值在于解耦“业务逻辑”和“基础设施能力”——比如流量控制、服务发现、TLS 加密、熔断重试这些。
但如果你:
那很可能你上了服务网格,不是提升效率,而是多了一层负担。
以最火的 Istio 为例,它架构是这样的:
服务A --> Sidecar(Envoy)--> Istiod(控制面)--> 目标服务B
简单来说,每个服务都配一个 Sidecar(通常是 Envoy),所有的出入流量都走 Sidecar,再由控制面统一管理。
问题出在哪?Sidecar 是好东西,但默认配置就像没调教过的 AI,真的不聪明。
以下是几个优化点,我踩过的坑,咱们一个个说。
Istio 默认会开启 Prometheus + Envoy 的 full metric 采集,甚至还会记录每一条 HTTP 请求日志。结果就是:
5 个服务压测几千 QPS,Prometheus 就被撑爆了……
解决办法:关闭或精简 metric 配置
修改 Istio values.yaml
安装参数:
telemetry:
enabled: true
v2:
enabled: true
metadataExchange:
enabled: true
prometheus:
enabled: true
configOverride:
inboundSidecar:
disable_host_header_fallback: true
outboundSidecar:
disable_host_header_fallback: true
enabled: true
filterEnabled: true
stats:
enabled: true
configOverride:
inbound: {}
outbound: {}
overrides:
- match:
metric: "istio_requests_total"
enabled: true
这段配置意味着我们只采关键指标(比如请求总量),关掉一些无用或低频的指标,减轻 Sidecar 压力。
是的,Istio 支持自动 mTLS,加密通信从此无脑开启。听起来很安全,实际上非常吃资源。
我的建议是:按 namespace、按服务组选择性开启 mTLS,而不是一刀切。
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT
如果你是 internal-only 环境,没必要给所有服务开 FULL TLS,毕竟不是每条内部调用都需要银行级安全,合理就行。
Istio 的 Sidecar 默认注入方式是 每个 Pod 搞一个 Envoy 容器。如果你一个服务开了 20 副本,那就有 20 个 Sidecar 占着 CPU + 内存。
建议使用 Sidecar
CRD 精细配置哪些服务需要代理哪些出口流量:
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: default
namespace: myapp
spec:
egress:
- hosts:
- "istio-system/*"
- "myapp/*"
这种方式可以大大减小 Sidecar 的负担,不至于啥都拦、啥都管,减轻资源消耗。
Sidecar 带来的最大好处之一就是可控的连接行为。比如说 HTTP2 复用、连接池配置、超时、重试,这些都可以通过 VirtualService 来控制。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
port:
number: 9080
retries:
attempts: 3
perTryTimeout: 2s
timeout: 5s
合理的 retry 和 timeout 设置,可以大幅度提高服务的“抗抖动能力”,别让临时的小故障升级成全链路雪崩。
我见过一些公司,为了“全栈现代化”,硬是把所有服务都塞进 Mesh,结果老业务没适配、新业务也被拖慢。
我的建议是:采用混合架构,即“重要服务进网格,低频/低风险服务保持原样”。
Kubernetes + Istio + 原生服务并存,别一口吃成胖子。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。