排查公网服务不通
问题描述
部署在 TKE 集群内的服务使用公网对外暴露 (LoadBalancer 类型 Service 或 Ingress),但访问不通。
常见原因
节点安全组没放通 NodePort
如果服务使用 TKE 默认的公网 Service 或 Ingress 暴露,CLB 会转发流量到 NodePort,流量转发链路是: client –> CLB –> NodePort –> ...
CLB 转发的数据包不会做 SNAT,所以报文到达节点时源 IP 就是 client 的公网 IP,如果节点安全组入站规则没有放通 client –> NodePort 链路的话,是访问不通的。
解决方案1: 节点安全组入站规则对公网访问 NodePort 区间端口(30000-32768):
解决方案2: 若担心直接放开整个 NodePort 区间所有端口有安全风险,可以只暴露 service 所用到的 NodePort (比较麻烦)。
解决方案3: 若只允许固定 IP 段的 client 访问 ingressgateway,可以只对这个 IP 段放开整个 NodePort 区间所有端口。
解决方案4: 启用 CLB 直通 Pod,这样流量就不经过 NodePort,所以就没有此安全组问题。启用 CLB 直通 Pod 需要集群网络支持 VPC-CNI,详细请参考 如何启用 CLB 直通 Pod 。
使用了 ClusterIP 类型 Service
如果使用 TKE 默认的 CLB Ingress 暴露服务,依赖后端 Service 要有 NodePort,如果 Service 是 ClusterIP 类型,将无法转发,也就不通。
解决方案1: Ingress 涉及的后端 Service 改为 NodePort 类型。
解决方案2: 不使用 TKE 默认的 CLB Ingress,其它类型 Ingress,比如 Nginx Ingress 。