前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CNI 小精灵 GENIE

CNI 小精灵 GENIE

作者头像
sealyun
发布2019-09-12 15:33:57
1.6K0
发布2019-09-12 15:33:57
举报
文章被收录于专栏:sealyun

想同时使用多个CNI? 想往容器里塞多张网卡?试试这款CNI插件 CNI-Genie

genie可以引用CNI插件,包含默认CNI插件如(bridge macvlan ipvlan loopback)第三方插件如 calico,romana,weave-net

或者一些专用CNI插件如SR-IOV,DPDK等,可以调用在宿主机上的任意CNI插件.

甚至可以让容器一张网卡通过calico分配,另一张网卡走flannel走。

多网卡与CNI任意选择

现在,在node节点上运行的kubelet最多只连接一个CNI插件,即Canal或Romana或Weave。CNI-Genie可以在运行时选用在该特定节点上运行的任何现有CNI插件。

当前Kubernetes无法做到这一点的原因是,当您启动kubelet时,您需要将cni-plugin详细信息作为“kubelet”进程的一部分传递。在这种情况下,您只需选择一个现有的CNI插件,并将其传递给kubelet。如果我们想让某些pod使用Canal网络和其他一组pod来使用weave网络怎么办?这在Kubernetes目前是不可能的。对于任何多网络支持,我们需要对Kubernetes进行更改,这会导致向后兼容性问题。

因此,CNI-Genie“多个CNI插件”功能旨在解决此问题,而无更改及Kubernetes代码

  • 用户可能不同场景对网络需求不同,如我们的一个场景,有些用户需要pod漂移保持ip不变,这样我们让其走ovn网络,有些云原生应用不关心地址变动就走calico
  • 访问的网络不同,如一个业务处理业务走的是业务网(千兆),把数据存储到大数据平台走的存储网(25G),这样给容器同时分配两张网卡
  • 不同的CNI插件在端口映射,NAT,隧道,中断主机端口/接口的需求方面是不同的

如下:

控制面数据面网卡分离,高速网络与低速分离,流媒体控制流与数据流分离

Network Attachment Definitions

NetworkAttachmentDefinition 是一个用户可指定网络配置的CRD,然后pod选用该CRD. 这块一般人我不告诉他。

Smart CNI

根据用户关注的性能指标自动选择CNI,例如占用率,子网数量,延迟,带宽这些“KPI” 去选择CNI

网络隔离

为租户提供专用的“物理”网络 在共享的“物理”网络上为不同租户隔离的“逻辑”网络

网络级ACL

用于网络级ACL的CNI-Genie网络策略引擎

针对给定workload在不同(物理或逻辑)网络之间进行实时切换

价格最小化:随着网络价格的变化,将工作负载动态切换到更便宜的网络 最大化网络利用率:在阈值时动态地将工作负载切换到较不拥挤的网络

使用介绍

安装略

下面针对几个主要功能对genie进行介绍:

多网卡与CNI选择

选择不同的CNI只需要在pod中加一个annotations即可

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx-canal-master
  labels:
    app: web
  annotations:
    cni: "canal"
spec:
  containers:
    - name: key-value-store
      image: nginx:latest
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 6379

上图最重要的就是4,5,6三个步骤:

  1. kubelet调用CNI Genie
  2. CNI Genie调用apiserver根据pod名查询pod annotations
  3. genie去调用真正的CNI
  4. 返回结果给kubelet
  5. 返回网络信息给apiserver写入etcd

多网卡不同CNI:

代码语言:javascript
复制
  annotations:
    cni: "weave,canal"

kubectl get pod只会显示一个ip, describe能看到两张网卡的ip:

代码语言:javascript
复制
annotations:
    cni: canal,weave
    multi-ip-preferences: '{"multi_entry":2,"ips":{"":
    {},"ip1":
    {"ip":"10.244.0.201","interface":"eth0"},
    "ip2":{"ip":"10.32.0.4","interface":"eth1"}}}'

进容器也可以看到两张网卡了:

代码语言:javascript
复制
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0@if49589: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default
    link/ether 7e:99:f7:87:81:c6 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.201/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::7c99:f7ff:fe87:81c6/64 scope link
       valid_lft forever preferred_lft forever
49590: eth1@if49591: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default
    link/ether 36:b0:8c:f0:9f:58 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.4/12 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::34b0:8cff:fef0:9f58/64 scope link
       valid_lft forever preferred_lft forever

通过CRD定义网卡

定义一个NAD(NetworkAttachmentDefinition)

代码语言:javascript
复制
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: weavenet
spec:
  config: '{
    "cniVersion": "0.3.0",
    "plugins": [
        {
            "name": "weave",
            "type": "weave-net",
            "hairpinMode": true
        },
        {
            "type": "portmap",
            "capabilities": {"portMappings": true},
            "snat": true
        }
    ]
}
'

pod使用该NAD,还可指定默认插件,没写annotation就走默认CNI

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx-netattachdef-flannel-weave
  annotations:
    k8s.v1.cni.cncf.io/networks: flannel@eth1, network/weavenet@eth5
spec:
  containers:
    - name: key-value-store
      image: nginx:latest
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80

智能CNI选择

CNI-Genie可以与cAdvisor交互,收集每个容器的网络使用信息,以决定网络走哪个CNI

支持以下KPI:

  • 网络延迟
  • 网络带宽
  • 端到端响应时间
  • 使用的IP地址百分比,即(使用的IP地址数)/(IP地址总数)
  • 入住率
  • 用户填写问卷以查找用例优化的CNI插件

使用时直接不指定CNI即可

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx-smart-pick
  labels:
    app: web
  annotations:
    cni: ""

你可以把一个CNI的流量打满,那么新创建的pod就会自动选择别的CNI

从指定IP地址池内分配地址

代码语言:javascript
复制
apiVersion: alpha.network.k8s.io/v1
kind: Logicalnetwork
metadata:
  name: net1
  namespace: default
spec:
  physicalNet: "phynet1"
  sub_subnet: "10.32.0.0/24"

pod 使用时用 networks字段指定即可

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx-single-network-pod
  labels:
    app: web
  annotations:
    cni: ""
    networks: net1

总结

genie在很多复杂网络场景还是非常有作用的,我们主要用其来管理虚拟机网络,以达到虚拟机与容器在同一个平台上运行

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 sealyun 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多网卡与CNI任意选择
  • Network Attachment Definitions
  • Smart CNI
  • 网络隔离
  • 网络级ACL
  • 针对给定workload在不同(物理或逻辑)网络之间进行实时切换
  • 使用介绍
    • 多网卡与CNI选择
      • 通过CRD定义网卡
        • 智能CNI选择
          • 从指定IP地址池内分配地址
          • 总结
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档