kubernetes-notes
  • 目录
    • 序言
  • 云原生体系
    • 12-Factor
    • K8S知识体系
  • 安装与配置
    • 部署k8s集群
      • 使用kubeadm安装生产环境kubernetes
      • 使用kubespray安装kubernetes
      • 使用minikube安装kubernetes
      • 使用kind安装kubernetes
    • k8s证书及秘钥
    • k8s版本说明
  • 基本概念
    • kubernetes架构
      • Kubernetes总架构图
      • 基于Docker及Kubernetes技术构建容器云(PaaS)平台概述
    • kubernetes对象
      • 理解kubernetes对象
      • kubernetes常用对象说明
    • Pod
      • Pod介绍
      • Pod定义文件
      • Pod生命周期
      • Pod健康检查
      • Pod存储卷
      • Pod控制器
      • Pod伸缩与升级
    • 配置
      • ConfigMap
    • Workload
  • 核心原理
    • 核心组件
      • Api Server
      • Controller Manager
      • Scheduler
      • Kubelet
    • 流程图
      • Pod创建流程
      • PVC创建流程
  • 容器网络
    • Docker网络
    • K8S网络
    • 网络插件
      • Flannel介绍
    • CNI
      • CNI接口介绍
      • Macvlan介绍
  • 容器存储
    • 存储卷概念
      • Volume
      • Persistent Volume
      • Persistent Volume Claim
      • Storage Class
      • Dynamic Volume Provisioning
    • CSI
      • csi-cephfs-plugin
      • 部署csi-cephfs
      • 部署cephfs-provisioner
      • FlexVolume介绍
  • 资源隔离
    • 资源配额
    • Pod限额
    • 资源服务质量
    • Lxcfs资源视图隔离
  • 运维指南
    • kubectl工具
      • kubectl安装与配置
      • kubectl命令说明
      • kubectl命令别名
    • kubernetes集群问题排查
    • 节点调度
      • 安全迁移节点
      • 指定Node调度与隔离
    • 镜像仓库配置
      • 配置私有的镜像仓库
      • 拉取私有镜像
  • 开发指南
    • client-go的使用及源码分析
    • CSI插件开发
      • nfs-client-provisioner源码分析
      • csi-provisioner源码分析
    • operator开发
      • kubebuilder的使用
  • 问题排查
    • 节点相关问题
      • keycreate permission denied
      • Cgroup不支持pid资源
      • Cgroup子系统无法挂载
    • Pod驱逐
    • 镜像拉取失败问题
    • PVC Terminating
  • 源码分析
    • Kubernetes源码分析笔记
    • kubelet
      • NewKubeletCommand
      • NewMainKubelet
      • startKubelet
      • syncLoopIteration
      • syncPod
    • kube-controller-manager
      • NewControllerManagerCommand
      • DeploymentController
      • Informer机制
    • kube-scheduler
      • NewSchedulerCommand
      • registerAlgorithmProvider
      • scheduleOne
      • findNodesThatFit
      • PrioritizeNodes
      • preempt
    • kube-apiserver
      • NewAPIServerCommand
  • Runtime
    • Runtime
      • Runc和Containerd概述
    • Containerd
      • 安装Containerd
    • Docker
      • Docker学习笔记
    • Kata Container
      • kata容器简介
      • kata配置
    • GPU
      • nvidia-device-plugin介绍
  • Etcd
    • Etcd介绍
    • Raft算法
    • Etcd启动配置参数
    • Etcd访问控制
    • etcdctl命令工具
      • etcdctl命令工具-V3
      • etcdctl命令工具-V2
    • Etcd中的k8s数据
    • Etcd-Operator的使用
  • 多集群管理
    • k8s多集群管理的思考
    • Virtual Kubelet
      • Virtual Kubelet介绍
      • Virtual Kubelet 命令
    • Karmada
      • Karmada介绍
  • 边缘容器
    • KubeEdge介绍
    • KubeEdge源码分析
      • cloudcore
      • edgecore
    • OpenYurt部署
  • 虚拟化
    • 虚拟化相关概念
    • KubeVirt
      • KubeVirt的介绍
      • KubeVirt的使用
  • 监控体系
    • 监控体系介绍
    • cAdvisor介绍
    • Heapster介绍
    • Influxdb介绍
由 GitBook 提供支持

www.huweihuang.com

在本页
  • 1. CNI(Container Network Interface)
  • 2. CNI配置文件格式
  • 2.1. 主配置的字段
  • 2.2. 插件配置字段
  • 2.3. 配置文件示例
  • 3. CNI插件
  • 3.1. 安装插件
  • 3.2. 插件分类
  • 4. CNI插件接口
  • 4.1. ADD接口:添加容器网络
  • 4.2. DEL接口:删除容器网络
  • 4.3. CHECK接口:检查容器网络
  • 4.4. VERSION接口:输出CNI的版本

这有帮助吗?

在GitHub上编辑
  1. 容器网络
  2. CNI

CNI接口介绍

上一页CNI下一页Macvlan介绍

最后更新于2年前

这有帮助吗?

1. CNI(Container Network Interface)

CNI(Container Network Interface)即容器网络接口,通过约定统一的容器网络接口,从而kubelet可以通过这个标准的API来调用不同的网络插件实现不同的网络功能。

kubelet启动参数--network-plugin=cni来指定CNI插件,kubelet从--cni-conf-dir (默认是 /etc/cni/net.d) 读取文件并使用 该文件中的 CNI 配置来设置各个 Pod 的网络。 CNI 配置文件必须与 匹配,并且配置所引用的所有所需的 CNI 插件都应存在于 --cni-bin-dir(默认是 /opt/cni/bin)下。如果有多个CNI配置文件,kubelet 将会使用按文件名的字典顺序排列 的第一个作为配置文件。

CNI规范定义:

  • 网络配置文件的格式

  • 容器runtime与CNI插件的通信协议

  • 基于提供的配置执行网络插件的步骤

  • 网络插件调用其他功能插件的步骤

  • 插件返回给runtime结果的数据格式

2. CNI配置文件格式

CNI配置文件的格式为JSON格式,配置文件的默认路径:/etc/cni/net.d。插件二进制默认的路径为:/opt/cni/bin。

2.1. 主配置的字段

  • cniVersion (string):CNI规范使用的版本,例如版本为0.4.0。

  • name (string):目标网络的名称。

  • disableCheck (boolean):关闭CHECK操作。

  • plugins (list):CNI插件列表及插件配置。

2.2. 插件配置字段

根据不同的插件,插件配置所需的字段不同。

必选字段:

  • type (string):节点上插件二进制的名称,比如bridge,sriov,macvlan等。

可选字段:

  • capabilities (dictionary)

  • ipMasq (boolean):为目标网络配上Outbound Masquerade(地址伪装),即:由容器内部通过网关向外发送数据包时,对数据包的源IP地址进行修改。

    当我们的容器以宿主机作为网关时,这个参数是必须要设置的。否则,从容器内部发出的数据包就没有办法通过网关路由到其他网段。因为容器内部的IP地址无法被目标网段识别,所以这些数据包最终会被丢弃掉。

  • ipam (dictionary):IPAM(IP Adderss Management)即IP地址管理,提供了一系列方法用于对IP和路由进行管理。它对应的是由CNI提供的一组标准IPAM插件,比如像host-local,dhcp,static等。比如文中用到的bridge插件,会调用我们所指定的IPAM插件,实现对网络设备IP地址的分配和管理。**如果是自己开发的ipam插件,则相关的入参可以自己定义和实现。

    以下以host-local为例说明。

    • type:指定所用IPAM插件的名称,在我们的例子里,用的是host-local。

    • subnet:为目标网络分配网段,包括网络ID和子网掩码,以CIDR形式标记。在我们的例子里为10.15.10.0/24,也就是目标网段为10.15.10.0,子网掩码为255.255.255.0。

    • routes:用于指定路由规则,插件会为我们在容器的路由表里生成相应的规则。其中,dst表示希望到达的目标网段,以CIDR形式标记。gw对应网关的IP地址,也就是要到达目标网段所要经过的“next hop(下一跳)”。如果省略gw的话,那么插件会自动帮我们选择默认网关。在我们的例子里,gw选择的是默认网关,而dst为0.0.0.0/0则代表“任何网络”,表示数据包将通过默认网关发往任何网络。实际上,这对应的是一条默认路由规则,即:当所有其他路由规则都不匹配时,将选择该路由。

    • rangeStart:允许分配的IP地址范围的起始值

    • rangeEnd:允许分配的IP地址范围的结束值

    • gateway:为网关(也就是我们将要在宿主机上创建的bridge)指定的IP地址。如果省略的话,那么插件会自动从允许分配的IP地址范围内选择起始值作为网关的IP地址。

  • dns (dictionary, optional):dns配置

    • nameservers (list of strings, optional)

    • domain (string, optional)

    • search (list of strings, optional)

    • options (list of strings, optional)

2.3. 配置文件示例

$ mkdir -p /etc/cni/net.d
$ cat >/etc/cni/net.d/10-mynet.conf <<EOF
{
  "cniVersion": "1.0.0",
  "name": "dbnet",
  "plugins": [
    {
      "type": "bridge",
      // plugin specific parameters
      "bridge": "cni0",
      "keyA": ["some more", "plugin specific", "configuration"],

      "ipam": {
        "type": "host-local",
        // ipam specific
        "subnet": "10.1.0.0/16",
        "gateway": "10.1.0.1",
        "routes": [
            {"dst": "0.0.0.0/0"}
        ]
      },
      "dns": {
        "nameservers": [ "10.1.0.1" ]
      }
    },
    {
      "type": "tuning",
      "capabilities": {
        "mac": true
      },
      "sysctl": {
        "net.core.somaxconn": "500"
      }
    },
    {
        "type": "portmap",
        "capabilities": {"portMappings": true}
    }
  ]
}

3. CNI插件

3.1. 安装插件

安装CNI二进制插件,插件下载地:https://github.com/containernetworking/plugins/releases

# 下载二进制
wget https://github.com/containernetworking/plugins/releases/download/v1.1.0/cni-plugins-linux-amd64-v1.1.0.tgz

# 解压文件
tar -zvxf cni-plugins-linux-amd64-v1.1.0.tgz -C /opt/cni/bin/

# 查看解压文件
# ll -h
总用量 63M
-rwxr-xr-x 1 root root 3.7M 2月  24 01:01 bandwidth
-rwxr-xr-x 1 root root 4.1M 2月  24 01:01 bridge
-rwxr-xr-x 1 root root 9.3M 2月  24 01:01 dhcp
-rwxr-xr-x 1 root root 4.2M 2月  24 01:01 firewall
-rwxr-xr-x 1 root root 3.7M 2月  24 01:01 host-device
-rwxr-xr-x 1 root root 3.1M 2月  24 01:01 host-local
-rwxr-xr-x 1 root root 3.8M 2月  24 01:01 ipvlan
-rwxr-xr-x 1 root root 3.2M 2月  24 01:01 loopback
-rwxr-xr-x 1 root root 3.8M 2月  24 01:01 macvlan
-rwxr-xr-x 1 root root 3.6M 2月  24 01:01 portmap
-rwxr-xr-x 1 root root 4.0M 2月  24 01:01 ptp
-rwxr-xr-x 1 root root 3.4M 2月  24 01:01 sbr
-rwxr-xr-x 1 root root 2.7M 2月  24 01:01 static
-rwxr-xr-x 1 root root 3.3M 2月  24 01:01 tuning
-rwxr-xr-x 1 root root 3.8M 2月  24 01:01 vlan
-rwxr-xr-x 1 root root 3.4M 2月  24 01:01 vrf

3.2. 插件分类

参考:https://www.cni.dev/plugins/current/

分类
插件
说明

main

bridge

Creates a bridge, adds the host and the container to it

ipvlan

Adds an ipvlan interface in the container

macvlan

Creates a new MAC address, forwards all traffic to that to the container

ptp

Creates a veth pair

Moves an already-existing device into a container

vlan

Creates a vlan interface off a master

IPAM

dhcp

Runs a daemon on the host to make DHCP requests on behalf of a container

host-local

Maintains a local database of allocated IPs

static

Allocates static IPv4/IPv6 addresses to containers

meta

tuning

Changes sysctl parameters of an existing interface

portmap

An iptables-based portmapping plugin. Maps ports from the host’s address space to the container

bandwidth

Allows bandwidth-limiting through use of traffic control tbf (ingress/egress)

sbr

A plugin that configures source based routing for an interface (from which it is chained)

firewall

A firewall plugin which uses iptables or firewalld to add rules to allow traffic to/from the container

4. CNI插件接口

具体可参考:https://github.com/containernetworking/cni/blob/master/SPEC.md#cni-operations

CNI定义的接口操作有:

  • ADD:添加容器网络,在容器启动时调用。

  • DEL:删除容器网络,在容器删除时调用。

  • CHECK:检查容器网络是否正常。

  • VERSION:显示插件版本。

这些操作通过CNI_COMMAND环境变量来传递给CNI插件二进制。

其中环境变量包括:

  • CNI_COMMAND:命令操作,包括 ADD, DEL, CHECK, or VERSION。

  • CNI_CONTAINERID:容器的ID,有runtime分配,不为空。

  • CNI_NETNS:容器的网络命名空间,命名空间路径,例如:/run/netns/[nsname]

  • CNI_IFNAME:容器内的网卡名称。

  • CNI_ARGS:其他参数。

  • CNI_PATH:CNI插件二进制的路径。

4.1. ADD接口:添加容器网络

在容器的网络命名空间CNI_NETNS中创建CNI_IFNAME网卡设备,或者调整网卡配置。

必选参数:

  • CNI_COMMAND

  • CNI_CONTAINERID

  • CNI_NETNS

  • CNI_IFNAME

可选参数:

  • CNI_ARGS

  • CNI_PATH

4.2. DEL接口:删除容器网络

删除容器网络命名空间CNI_NETNS中的容器网卡CNI_IFNAME,或者撤销ADD修改操作。

必选参数:

  • CNI_COMMAND

  • CNI_CONTAINERID

  • CNI_IFNAME

可选参数:

  • CNI_NETNS

  • CNI_ARGS

  • CNI_PATH

4.3. CHECK接口:检查容器网络

4.4. VERSION接口:输出CNI的版本

参考:

  • https://www.cni.dev/docs/spec/

  • https://github.com/containernetworking/cni

  • https://github.com/containernetworking/cni/blob/spec-v0.4.0/SPEC.md

  • https://kubernetes.io/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/

  • https://github.com/containernetworking/plugins/tree/master/plugins

  • https://www.cni.dev/plugins/current/

  • https://cloud.tencent.com/developer/news/600713

CNI 规约
配置CNI插件
host-device