tnblog
首页
视频
资源
登录

CNI IPVLAN MACVLAN

5390人阅读 2022/12/13 21:40 总访问:3467010 评论:0 收藏:0 手机
分类: 容器编排

CNI IPVLAN MACVLAN

前言


我们前面讲了Vxlan、IPIP、UDP、、等等一大堆,我不晓得大家有没有统计过要走多少次内核。
以Flannel Vxlan为例子。


首先我们的Pod需要通过内核封装数据包,发送到我们的cni0网桥上,网桥发送到flannel.1时又需要经过内核进行数据封装,最后发送到另外一台主机时还需要经过内核。内核是神啊?性能很好?没走一步就要经过它。肯定是消耗大量性能的。
如果再碰到集群中的pod里面又是一个集群的情况,那要经过的内核次数又多了。
所以IPVLAN、MACVLAN就出来了。

IPVLAN、MACVLAN 简述


主要功能把pod的网卡,直接拉到与主机同一平面,你访问我的pod我让它少走弯路直接连到pod中去,这样只需要经过一次内核就可以到达目标点。

内核要求要高于4.2版本。


ipvlan和macvlan类似,都是从一个主机接口虚拟出多个虚拟网络接口。唯一比较大的区别就是ipvlan虚拟出的子接口都有相同的mac地址。

  1. # 升级内核
  2. rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  3. rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
  4. yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
  5. grub2-set-default 0
  6. reboot
  7. uname -rs

IPVLAN 模式


可查看我以往的文章:https://www.tnblog.net/hb/article/details/6279

Kubernetes IPVLAN L2模式


首先默认情况厦Kubernetes自带ipvlan的插件(我们可以通过ls /opt/cni/bin)
所以我们默认只需要为每个节点配置网络即可(vim /etc/cni/net.d/10-ipvlan.conf)。

  1. {
  2. "name": "ipvlannet",
  3. "type": "ipvlan",
  4. "master": "eth0",
  5. "mode": "l2",
  6. "ipam": {
  7. "type": "host-local",
  8. "subnet": "10.211.55.0/24",
  9. "rangeStart": "10.211.55.129",
  10. "rangeEnd": "10.211.55.250",
  11. "gateway": "10.211.55.1",
  12. "routes": [
  13. { "dst": "0.0.0.0/0" }
  14. ]
  15. }
  16. }
  1. // master 节点 10.211.55.7
  2. {
  3. "name": "ipvlannet",
  4. "type": "ipvlan",
  5. "master": "eth0",
  6. "mode": "l2",
  7. "ipam": {
  8. "type": "host-local",
  9. "subnet": "10.211.55.0/24",
  10. "rangeStart": "10.211.55.129",
  11. "rangeEnd": "10.211.55.139",
  12. "gateway": "10.211.55.1",
  13. "routes": [
  14. { "dst": "0.0.0.0/0" }
  15. ]
  16. }
  17. }
  18. // node1 节点 10.211.55.8
  19. {
  20. "name": "ipvlannet",
  21. "type": "ipvlan",
  22. "master": "eth0",
  23. "mode": "l2",
  24. "ipam": {
  25. "type": "host-local",
  26. "subnet": "10.211.55.0/24",
  27. "rangeStart": "10.211.55.140",
  28. "rangeEnd": "10.211.55.149",
  29. "gateway": "10.211.55.1",
  30. "routes": [
  31. { "dst": "0.0.0.0/0" }
  32. ]
  33. }
  34. }
  35. // node2 节点 10.211.55.9
  36. {
  37. "name": "ipvlannet",
  38. "type": "ipvlan",
  39. "master": "eth0",
  40. "mode": "l2",
  41. "ipam": {
  42. "type": "host-local",
  43. "subnet": "10.211.55.0/24",
  44. "rangeStart": "10.211.55.119",
  45. "rangeEnd": "10.211.55.128",
  46. "gateway": "10.211.55.1",
  47. "routes": [
  48. { "dst": "0.0.0.0/0" }
  49. ]
  50. }
  51. }
参数 描述
name ipvlan的网络名称。
type ipvlan
master 要从属的主机接口的名称。默认为默认路由接口。
ipam 要用于此网络的IPAM配置(设置网段)。
ipam.type host-local IPAM插件从一组地址范围中分配ip地址。它将状态本地存储在主机文件系统上,从而确保单个主机上IP地址的唯一性。
ipam.subnet 网段范围(与主机网段范围保持一致)
ipam.rangeStart 网段开始范围
ipam.rangeEnd 网段结束范围。
ipam.gateway 网段网关。
ipam.routes 要添加到容器命名空间的路由列表。每个路由都是一个带有dst和可选gw字段的字典。如果省略了gw,将使用gateway的值。


然后我们运行一个DaemonSet这样确保我们的Pod再不同的节点上运行。

  1. vim cni_demo_template.yaml
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. labels:
  5. app: cni
  6. name: cni
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: cni
  11. template:
  12. metadata:
  13. annotations:
  14. cni: "ipvlannet"
  15. labels:
  16. app: cni
  17. spec:
  18. containers:
  19. - image: burlyluo/nettoolbox
  20. name: nettoolbox
  21. ---
  1. kubectl apply -f cni_demo_template.yaml
  2. # 查看pod
  3. kubectl get pod -o wide
  4. # 尝试ping
  5. kubectl exec pod/cni-cbct6 -- ping 10.211.55.119


我们通过如下命令来看mac值与主机的是否相等。

  1. kubectl exec pod/cni-cbct6 -- ifconfig
  2. # node1上
  3. ifconfig


我们发现它们的MAC地址是相等的。
接下来尝试外部通信,也是没问题的。

Kubernetes IPVLAN L3模式


L3模式下,ipvlan有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相ping通对方,因为ipvlan会在中间做报文的转发工作。

L3模式下的虚拟接口不会接收到多播或者广播的报文(ipvlan的虚拟接口会显示NOARP标志),在这个模式下,所有的网络报文都会发送给父接口,因此所有的ARP过程或者多播都是在底层的父接口完成的。需要注意的是:外部网络默认情况下是不知道ipvlan虚拟出来的网络的,如果不在外部路由器上配置好对应的路由规则,ipvlan的网络是不能被外部直接访问的。


我们就可以使用为不同的节点配置不同的网段,设置不一样的网段文件了,注意把mode改为l3三层路由器模式。

  1. // master
  2. {
  3. "name": "ipvlannet",
  4. "type": "ipvlan",
  5. "master": "eth0",
  6. "mode": "l3",
  7. "ipam": {
  8. "type": "host-local",
  9. "subnet": "10.211.56.0/24"
  10. }
  11. }
  12. // node1
  13. {
  14. "name": "ipvlannet",
  15. "type": "ipvlan",
  16. "master": "eth0",
  17. "mode": "l3",
  18. "ipam": {
  19. "type": "host-local",
  20. "subnet": "10.211.57.0/24"
  21. }
  22. }
  23. // node2
  24. {
  25. "name": "ipvlannet",
  26. "type": "ipvlan",
  27. "master": "eth0",
  28. "mode": "l3",
  29. "ipam": {
  30. "type": "host-local",
  31. "subnet": "10.211.59.0/24"
  32. }
  33. }


然后为我们的pod cni_demo_template.yaml文件添加网络的一些权限。

  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. labels:
  5. app: cni
  6. name: cni
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: cni
  11. template:
  12. metadata:
  13. annotations:
  14. cni: "ipvlannet"
  15. labels:
  16. app: cni
  17. spec:
  18. containers:
  19. - image: burlyluo/nettoolbox
  20. name: nettoolbox
  21. securityContext:
  22. privileged: false
  23. capabilities:
  24. add: ["NET_ADMIN", "NET_RAW"]
  25. ---


然后运行起来。

  1. kubectl apply -f cni_demo_template.yaml
  2. kubectl get pod -o wide


现在两个pod由于没有路由是ping不通的,而且他们的节点也同样没有路由。
所以我们需要先配置路由才可以进行访问。
首先我们配置node1上的节点路由与pod cni-jslth 路由,然后配置node2上的节点路由与pod cni-9v5w6的路由。

  1. # node1 pod 配置路由
  2. kubectl exec pod/cni-jslth -- route add -net 10.211.59.0/24 dev eth0
  3. # 配置 node1 节点路由
  4. route add -net 10.211.59.0/24 gw 10.211.55.9
  5. # node2 pod 配置路由
  6. kubectl exec pod/cni-9v5w6 -- route add -net 10.211.57.0/24 dev eth0
  7. # 配置 node2 节点路由
  8. route add -net 10.211.57.0/24 gw 10.211.55.8


然后我们再次尝试ping,就没问题了。


觉得麻烦的话我们可以在以后,用.net默认来添加这些路由信息。。

Kubernetes MACVLAN


MACVLAN 只是与IPVLAN有一点不同。
它会给子接口进行分配mac地址。
所以它的问题在于:一台主机上会进行分配多台mac地址。IEEE 802.11 协议标准不喜欢同一个客户端上有多个mac地址,这意味着macvlan无法在无限网卡上进行通信。

实践


我们只需要更改将类型更改为macvlan,并且模式改为bridge就可以了。

  1. # 删除ipvlan文件
  2. rm /etc/cni/net.d/10-ipvlan.conf
  3. # 编辑ipmac
  4. vim /etc/cni/net.d/10-macvlan.conf
  1. // master 节点 10.211.55.7
  2. {
  3. "name": "ipvlannet",
  4. "type": "macvlan",
  5. "master": "eth0",
  6. "mode": "bridge",
  7. "ipam": {
  8. "type": "host-local",
  9. "subnet": "10.211.55.0/24",
  10. "rangeStart": "10.211.55.129",
  11. "rangeEnd": "10.211.55.139",
  12. "gateway": "10.211.55.1",
  13. "routes": [
  14. { "dst": "0.0.0.0/0" }
  15. ]
  16. }
  17. }
  18. // node1 节点 10.211.55.8
  19. {
  20. "name": "ipvlannet",
  21. "type": "macvlan",
  22. "master": "eth0",
  23. "mode": "bridge",
  24. "ipam": {
  25. "type": "host-local",
  26. "subnet": "10.211.55.0/24",
  27. "rangeStart": "10.211.55.140",
  28. "rangeEnd": "10.211.55.149",
  29. "gateway": "10.211.55.1",
  30. "routes": [
  31. { "dst": "0.0.0.0/0" }
  32. ]
  33. }
  34. }
  35. // node2 节点 10.211.55.9
  36. {
  37. "name": "ipvlannet",
  38. "type": "macvlan",
  39. "master": "eth0",
  40. "mode": "bridge",
  41. "ipam": {
  42. "type": "host-local",
  43. "subnet": "10.211.55.0/24",
  44. "rangeStart": "10.211.55.119",
  45. "rangeEnd": "10.211.55.128",
  46. "gateway": "10.211.55.1",
  47. "routes": [
  48. { "dst": "0.0.0.0/0" }
  49. ]
  50. }
  51. }


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

bk

2021/2/2 18:26:42

[good][good]

这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术