前言
测试环境中使用了一台 长城 arm 架构的服务器,创建几台虚拟机准备测试安装 kubernetes 。按照之前 虚拟化的使用方式,创建并安装一台虚拟机后,后面的虚拟机从安装好系统的虚拟机克隆而来。再克隆好的主机上搭建完 Kubernetes 之后,发现跨节点的 Pod 无法访问。
附上参考链接:https://zhangguanzhang.github.io/2020/11/06/kylin-arm-clone-vxlan-error/
环境信息
系统版本:
集群信息:
node 信息:
coredns 信息:
排查过程
创建了测试 Pod :
[root@k8s-master ~]# cat ngx-test.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: ngx-test
name: ngx-test
spec:
#replicas: 1
selector:
matchLabels:
app: ngx-test
template:
metadata:
labels:
app: ngx-test
spec:
containers:
- image: nginx:alpine-arm64
name: nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: ngx-test
name: ngx-test
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: ngx-test
通过 master 节点直接访问 Pod 地址:
发现问题:Pod 网络跨主机无法通信。
尝试在 Pod 所在的主机进行访问:
发现问题:跨集群节点的Pod 网络是无法访问的。
目前问题到这里就想到 是否是网络插件 flannel 出了问题。于是继续排查 flannel :
最初,进行了 ping 测试并使用 tcpdump进行排查,无解。开始怀疑是否是 kylin arm64 兼容性的问题,但是切换到 centos 7 arm64 搭建k8s一切正常,排除了 kvm虚拟化和兼容性的问题。
由于最初创建虚拟机是通过 克隆 的方式来创建三台虚拟机的,考虑过 mac 地址的问题,也给忽略了。
查阅相关资料,看到有大佬已经处理过类似的问题:
https://zhangguanzhang.github.io/2020/11/06/kylin-arm-clone-vxlan-error/
我出现的情况和他文中的一模一样。
回到上面的图片才发现 三张虚拟机网络 flannel.1 mac地址竟然全部一样的。查看下 集群分配的mac 地址:
果然问题出在 mac 地址上面。
解决过程
根据大佬给出的办法,首先创建 link 文件:
集群内的每个节点都需要创建:
cat << 'EOF' > /etc/systemd/10-flannel.1.link
[Match]
OriginalName=flannel.1
[Link]
MACAddressPolicy=none
EOF
查看是否运行:
再次,删除节点的 flannel.1
虚拟网卡
ip link delete flannel.1
然后删除节点对应的 kube-flannel-ds*
Pod 使其 重新创建:
kubectl delete po -n kube-system kube-flannel-ds-skhkq
重新生成的 flannel.1
网卡的 mac 地址就更新了。
确保,网络的mac 和集群显示的 mac 地址统一:
每个节点如上操作后,再次进行 跨节点访问测试:
到此,跨节点的Pod网络恢复正常。
总结
出现跨节点 Pod 无法访问的问题:
- 查看 集群节点 是否处于
Ready
状态 - 检查
flannel.1
Pod 是否正常运行 - 查看所有节点
flannel.1
网卡 mac 是否一致 - 克隆主机一定要注意网卡mac 一致的问题