• kubenetes-容器网络接口CNI


    一、CNI

    Kubernetes 网络模型设计的基础原则是:

    1. 所有的Pod能够不通过NAT(网络地址转换)就能相互访问。
    2. 所有的节点能够不通过NAT就能相互访问。
    3. 容器内看见的IP地址和外部组件看到的容器IP是一样的。

    Kubernetes的集群里,IP地址是以Pod为单位进行分配的,每个Pod都拥有一个独立的IP地址。一个Pod内部的所有容器共享一个网络栈,即宿主机上的一个网络命名空间,包括它们的IP地址、网络设备、配置等都是共享的。
    也就是说,Pod里面的所有容器能通过localhost:port 来连接对方。在Kubernetes中,提供了一个轻量的通用容器网络接口CNI(Container Network Interface),专门用于设置和删除容器的网络连通。容器运行时通过CNI调用网络插件来完成容器的网络设置。

    二、CNI运行机制

    不同于CRI是通过gRPC服务进行调用,CNI是容器运行时直接调用可执行文件的方式进行的。
    容器运行时在启动时会从CNI的配置目录中读取配置文件,文件后缀为".conf” “.conflist”“json”。如果配置目录中包含多个文件,一般情况下,会以名字排序选用第一个配置文件作为默认的网络配置,并加载获取其中指定的CNI插件名称和配置参数。所以,容器运行时一般需要配置两个参数–cni-bin-dir和–cni-conf-dir
    kubelet 内置了Docker 作为容器运行时,且是由 kubelet 来查找CNI插件,并且运行插件来为容器设置网络,所以这两个参数应该配置在kubelet 处:

    • cni-bin-dir:网络插件的可执行文件所在目录。默认是/opt/cni/bin。

    • cni-conf-dir:网络插件的配置文件所在目录。默认是/etc/cni/net.d。

    在这里插入图片描述

    在这里插入图片描述
    配置文件中定义了网络插件type,其实对应的就是/opt/cni/bin下面的可执行文件,由可执行文件来设置网络。

    那么主机上的这些可执行文件和配置文件又是怎么生成的呢?其实是由calico的daemonSet推到各个主机节点上的。
    在这里插入图片描述
    由calico-node这个DaemonSet的initContainer完成的,具体可以看这个DaemonSet的yaml文件。

    三、pod网络路由

    1、启动一个nginx pod
    在这里插入图片描述
    2、查看pod网络路由
    在这里插入图片描述
    可以看到网络路由是从容器设备eth0发到168.254.1.1上。通过ping命令查看168.254.1.1的MAC地址:

    在这里插入图片描述
    这个设备的mac地址是ee:ee:ee:ee:ee:ee,在主机上通过ip a命令查看网卡设备:
    在这里插入图片描述
    所有cali开头的网卡设备都是ee:ee:ee:ee:ee:ee,每创建一个pod在宿主机上都会产生一个以cali开头的虚拟接口。

    下面是VXLAN模式的calico插件网络路由:
    在这里插入图片描述

    calico还支持IPIP、BGP模式。

  • 相关阅读:
    Spring学习③__Bean管理
    KingbaseES PL/SQL 过程语言参考手册(3. PL/SQL语言基础)
    【统计分析】(task3) 假设检验3:分类数据检验
    音频信号的频谱分析实例
    SpringSecurity(十五)---OAuth2的运行机制(上)-OAuth2概念和授权码模式讲解
    Java | 一分钟掌握定时任务 | 8 - XXL-Job分布式定时任务
    LeetCode50天刷题计划(Day 26— 字母异位词分组(11.30-12.20)
    Go协程揭秘:轻量、并发与性能的完美结合
    什么是Lambda表达式?
    基于GPU的kokkos加速安装
  • 原文地址:https://blog.csdn.net/xianmingsu/article/details/134386796