本文档介绍 TKE 集群中多场景下可能发生的常见网络问题,并给出对应的排查思路。当遇到此类问题时,建议您首先按照下文中的检查建议进行排查,若确认检查项无误后仍不能正常访问,请您及时 提交工单 与我们联系。
同一集群中不同节点上的 Pod 可以直接互访,当出现一个节点上 Pod 无法访问其他节点上 Pod 时,建议您进行如下检查:
同一个 VPC 内的节点和 Pod 可以直接互访,当出现无法互访的情况时,建议您进行如下检查:
不同 VPC 间的互访需要先通过 云联网 或 对等连接 完成打通。如果打通之后仍出现无法互访的情况,建议您进行如下检查:
如果容器(Pod)与容器(Pod)间无法互访,需进一步执行如下检查:
ip_masq_agent
的配置,彼此增加对方容器网段。kubectl -n kube-system edit configmap ip-masq-agent-config
您可以直接在 TKE 控制台上 开启内网访问。如果开启内网访问之后仍出现无法访问的情况,建议您对应集群类型进行如下检查:
参考 查看节点安全组配置 检查集群中节点的安全组是否正确放通30000 - 32768端口区间。
您可以直接在 TKE 控制台上 开启公网访问。如果开启公网访问之后仍出现无法访问的情况,建议您对应集群类型进行如下检查:
检查安全组来源 CIDR 是否正确设置,或将来源 0.0.0.0/0
设置为全放通之后,再进行公网访问测试。
独立集群开启公网访问之后,会在集群中自动创建 default/kubelb-internet
Service 对象。该 Service 会自动绑定一个公网类型的 CLB,默认不会为该 CLB 绑定安全组(即全放通),且 EXTERNAL-IP 字段显示即为此 CLB 的 VIP。如下所示:
$ kubectl get service kubelb-internet
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubelb-internet LoadBalancer 172.16.252.94 152.136.8.98 443:32750/TCP 3m4s
default/kubelb-internet
Service 对象已绑定的 CLB 是否设置了安全组,并且安全组是否正确配置。IDC 与 Pod 互访需要先通过 云联网 或 专线网关 完成打通。如果打通之后仍出现无法互访的情况,建议您进行如下检查:
说明:
- 如需在 IDC 中查看 Pod 的 IP,则需要放通 IDC 网段。
- 默认情况下,除 VPC 之外的包会经过 SNAT 处理转换为 NodeIP。放通 IDC 网段时需配置为不经过 SNAT 处理。
- 放通 IDC 网段的方法为:执行命令
kubectl -n kube-system edit configmap ip-masq-agent-config
,修改 ip-masq-agent 配置,并将 IDC 网段添加到 NonMasqueradeCIDRs 列表中。
提供公网服务或者内网服务的 Service,如果出现无法访问或者 CLB 端口状态异常的情况,建议您进行如下检查:
提供公网服务的 Ingress 如果出现无法访问的情况,建议您进行如下检查:
在 TKE 集群内,主要是通过集群中的 kube-dns 或者 CoreDNS 服务来提供域名解析功能,如果在 Pod 内发生域名无法解析的情况,建议您进行如下检查:
telnet <kube-dns service ip> 53
在 TKE 集群内,Pod 之间一般是通过 Service 的 DNS 名称 my-svc.my-namespace.svc.cluster.local
来进行互访,如果在 Pod 内发生 Service 无法访问的情况,建议您进行如下检查:
spec.ports
字段是否正确。您可以通过执行以下命令,查看节点上的 iptables 或者 ipvs 转发规则。
iptables-save
ipvsadm -Ln -t/-u ip:port
以下抓包命令可用于分析集群内不同节点上的容器(Pod)互访不通的情况。
tcpdump -nn -vv -i eth0 host <对端pod-ip>
tcpdump -nn -vv -i eth0 host <源pod-ip>
tcpdump -nn -vv -i eth0 port <请求的端口号>
在使用 Kubernetes 运行应用的时候,可能会遇到一些网络问题,其中比较常见的是服务端无响应(超时)及回包内容不正常。如果您无法在相关配置上定位到问题点,则需要确认数据包最终是否被路由到容器里,或者报文到达容器的内容和出容器的内容是否符合预期,并通过分析报文进一步缩小问题范围。
本文提供脚本,可一键进入容器网络命名空间(netns),并使用宿主机上的 tcpdump 进行抓包。
当发现某个服务不通时,建议将其副本数调为1,并按照以下步骤进行抓包。
kubectl get pod -o wide
function e() {
set -eu
ns=${2-"default"}
pod=`kubectl -n $ns describe pod $1 | grep -A10 "^Containers:" | grep -Eo 'docker://.*$' | head -n 1 | sed 's/docker:\/\/\(.*\)$/\1/'`
pid=`docker inspect -f {{.State.Pid}} $pod`
echo "entering pod netns for $ns/$1"
cmd="nsenter -n --target $pid"
echo $cmd
$cmd
}
您可前往 脚本原理 了解并开始使用脚本。e POD_NAME NAMESPACE
具体示例如下:e istio-galley-58c7c7c646-m6568 istio-system
e proxy-5546768954-9rxg6 # 省略 NAMESPACE 默认为 default
说明:进入 Pod 所在的 netns 之后,可在宿主机上执行
ip a
或ifconfig
命令来查看容器的网卡,执行netstat -tunlp
命令查看当前容器的监听端口。
tcpdump -i eth0 -w test.pcap port 80
您可以执行 Ctrl+C
操作停止抓包,使用 scp
或 sz
命令将抓取的包下载到本地使用 wireshark
分析。分析过程中,您可能会用到以下常见的 wireshark
过滤语法:
"lbtest"
。tcp contains "lbtest"
http.request.uri=="/mytest"
kubectl describe pod <pod> -n mservice
docker inspect -f {{.State.Pid}} <container>
nsenter -n --target <PID>
上述脚本依赖的宿主机命名包含有:kubectl、docker、nsenter、grep、head、sed。发布会传送门 : https://yqh.aliyun.com/live/edgecloud_visual 近日云计算情报...
支持对生成的备份数据进行跨区域复制,并支持使用复制到目标区域的备份创建镜像...
5月28日举办的阿里云峰会主论坛上 云效 以「助力企业构建「双敏」能力 实现十倍...
12月已开始了,离2018年的结束也就半个多月的时间了,还记得年初立下的flag吗? ...
发展智慧消防,离不开消防的大数据。 虽然业界谈论大数据的声音在降低,但通过采...
使用批量计算服务需要收费吗? 批量计算服务本身完全免费,作业执行过程中创建的...
操作场景 为了保证数据安全,您可以对裸金属服务器中的所有云硬盘(系统盘和数据...
现在企业间的竞争十分的激烈。因此不论是大型企业还是小型企业都采用建设属于自...
实例健康诊断功能是一种自助诊断方式,您可以随时对实例的系统状态、网络状态、...
黑石文件系统和分区 在安装或者重装黑石服务器时,允许您指定磁盘的分区数量及其...