• arm64 系统克隆主机上 部署 k8s 跨节点 pod 网络不通 解决方法


    前言

    ​ 测试环境中使用了一台 长城 arm 架构的服务器,创建几台虚拟机准备测试安装 kubernetes 。按照之前 虚拟化的使用方式,创建并安装一台虚拟机后,后面的虚拟机从安装好系统的虚拟机克隆而来。再克隆好的主机上搭建完 Kubernetes 之后,发现跨节点的 Pod 无法访问。


    附上参考链接:https://zhangguanzhang.github.io/2020/11/06/kylin-arm-clone-vxlan-error/


    环境信息


    系统版本:

    image-20211015163307946


    集群信息:

    image-20211015163826828


    node 信息:

    image-20211015163412152


    coredns 信息:

    image-20211015163935260



    排查过程


    创建了测试 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
    

    image-20211015165502299


    通过 master 节点直接访问 Pod 地址:

    image-20211015165606927


    发现问题:Pod 网络跨主机无法通信。

    尝试在 Pod 所在的主机进行访问:

    image-20211015165854325


    发现问题:跨集群节点的Pod 网络是无法访问的。


    目前问题到这里就想到 是否是网络插件 flannel 出了问题。于是继续排查 flannel :

    image-20211015170152373


    最初,进行了 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 地址:

    image-20211015170352897

    果然问题出在 mac 地址上面。


    解决过程

    根据大佬给出的办法,首先创建 link 文件:

    集群内的每个节点都需要创建:

    cat << 'EOF' > /etc/systemd/10-flannel.1.link
    [Match]
    OriginalName=flannel.1
    
    [Link]
    MACAddressPolicy=none
    EOF
    

    查看是否运行:

    image-20211015171501567


    再次,删除节点的 flannel.1 虚拟网卡

    ip link delete flannel.1
    

    然后删除节点对应的 kube-flannel-ds* Pod 使其 重新创建:

    kubectl delete po -n kube-system  kube-flannel-ds-skhkq
    

    重新生成的 flannel.1 网卡的 mac 地址就更新了。

    image-20211015172816310


    确保,网络的mac 和集群显示的 mac 地址统一:

    image-20211015173508350


    每个节点如上操作后,再次进行 跨节点访问测试:

    image-20211015173619624


    到此,跨节点的Pod网络恢复正常。


    总结


    出现跨节点 Pod 无法访问的问题:

    1. 查看 集群节点 是否处于 Ready 状态
    2. 检查 flannel.1 Pod 是否正常运行
    3. 查看所有节点 flannel.1 网卡 mac 是否一致
    4. 克隆主机一定要注意网卡mac 一致的问题


    --- EOF ---
  • 相关阅读:
    网络编程(四)
    网络编程(三)
    网络编程(二)
    网络编程(一)
    异常处理
    Python 的名称空间和作用域
    如何在Java 8中愉快地处理日期和时间
    线段树入门整理、
    最小生成树prim、
    <climits>头文件
  • 原文地址:https://www.cnblogs.com/hukey/p/15412081.html
Copyright © 2020-2023  润新知