minikube 虚拟机无法访问外网的问题排查

通过 minikube 搭建本地的 K8s 环境用于测试,但是过了一段时间,突然在虚拟机内访问不了外网,拉不到镜像了,这里记录一下排查的过程,供后续再遇到时检索。

问题的根本原因是网卡上不知道为什么绑了两个 IP,其中只有一个可用,虚拟机访问外网时本地 IP 是不可用的那一个,才导致了问题。


Istio GRPC Gateway 禁用 HTTP1.1 请求

有一组专门用于 grpc 请求的 istio-gateway 网关,但是会被通过 HTTP1.1 的请求做漏洞扫描,istio gateway 仍然能够处理,并且会将这个请求转发给后端的服务,后端服务由于协议不匹配,会直接断开连接,istio gateway 就会返回 503。

这样会误触发告警,并且也会影响观测正常的监控。



通过 Istio 代理出方向的 TCP 流量

通过 Istio 可以劫持出方向的 HTTP/HTTPS 流量到特定的 Egress Gateway。通过固定 Egress Gateway 的节点可以实现线路优化,固定出口 IP,安全审计等等功能。






Istio 控制面配置推送分析与优化

Istio 主要分为控制面和数据面,控制面负责从数据源(通常是 K8s)获取变更内容,渲染成 envoy 使用的配置文件,推送到各个 Sidecar 和 Gateway 节点。

如果对 K8s 比较熟悉的话,可以和 K8s controller 类比,只是需要计算的内容更多。


Istio DNS Proxying

原理就是通过 iptables 劫持 DNS 查询请求到 sidecar ,由 sidecar 提供 DNS 请求的响应和转发。

对于 K8s 内部的 service 名称解析,会直接返回结果。

对于外部的域名,会转发给上游的 DNS Server 查询。


Istio sidecar TCP 空闲连接 1 小时自动断开

部分服务连接 redis 会经常出现连接被断开,导致从连接池中取出连接发送请求时会失败。

从 istio accesslog 中观测到到 redis 的连接,断开时间通常是 3600s 即一个小时。


Istio 服务请求外部域名持续出错,切换 DNS 后也无法恢复

假设 K8s 集群内的服务会以串行的方式不断请求一个外部域名的 80 端口。这个域名通过 DNS 解析到一个固定 IP。当某个时间段,这个 IP 上绑定的服务突然不可用,端口无法访问。内部服务会持续的得到 HTTP 503 的响应。

此时即使将这个域名的 DNS 切到一个正常的 IP,服务仍然会得到持续的 503 错误,一直无法恢复。



减少 Istio 控制面下发的配置

默认情况下,istiod 会 watch 集群中所有的 namespace,生成对应的配置,实时的通过 xDS 协议,推送给所有实例的 sidecar 容器。

业务实例会被分发到大量不相关的配置,根本用不到,不仅增加 istiod 分发配置的时效性,也增加了 sidecar 的资源消耗。