0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

multus cni是什么?k8s多網(wǎng)卡方案之multus用法介紹

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-11-06 09:35 ? 次閱讀

一、multus cni 出現(xiàn)的背景

在k8s的環(huán)境中啟動一個容器,默認情況下只存在兩個虛擬網(wǎng)絡接口(loopback 和 eth0), loopback 的流量始終都會在本容器內(nèi)或本機循環(huán),對業(yè)務起到支撐作用的是 eth0,能夠滿足大部分的業(yè)務場景。

但是當一個應用或服務既需要對外提供 API 調(diào)用服務,也需要滿足自身基于分布式特性產(chǎn)生的數(shù)據(jù)同步(一些業(yè)務場景的控制面和數(shù)據(jù)面的分離場景),那么這時候一張網(wǎng)卡的性能顯然很難達到生產(chǎn)級別的要求,網(wǎng)絡流量延時、阻塞便成為此應用的一項瓶頸。

為了實現(xiàn)生產(chǎn)環(huán)境的實際需求,出現(xiàn)了許多容器多網(wǎng)絡方案。根據(jù)開源社區(qū)活躍度、是否實現(xiàn) CNI 規(guī)范以及穩(wěn)定性,大部分場景使用 multus-cni 作為在 K8s 環(huán)境下的容器多網(wǎng)絡方案。

二、multus cni 介紹

Multus CNI 是一種符合CNI規(guī)范的開源插件,為實現(xiàn) K8s環(huán)境下容器多網(wǎng)卡而提出的解決方案并與其他 CNI 插件搭配使用。Multus CNI 本身不提供網(wǎng)絡配置功能,它是通過用其他滿足 CNI 規(guī)范的插件進行容器的網(wǎng)絡配置。

如下圖所示,當集群環(huán)境存在 Multus CNI 插件并添加額外配置后,將會發(fā)現(xiàn)此容器內(nèi)不再僅有 eth0 接口

e3f89f1c-7bd3-11ee-939d-92fbcf53809c.png

CNI 是一組限于容器網(wǎng)絡面的規(guī)范,定義了容器網(wǎng)絡資源創(chuàng)建、管理的規(guī)則。其自身實現(xiàn)并提供了內(nèi)置且通用的網(wǎng)絡插件,同時為第三方實現(xiàn)其規(guī)范預留了擴展。

cni類型如下:

類型作用及插件

Main負責容器接口(網(wǎng)橋、虛擬網(wǎng)卡)的創(chuàng)建bridge、ipvlan、macvlan、ptp等

Ipampod Ip地址的分配管理host-local、dhcp、calico-ipam、static等

Meta用于和第三方插件適配擴展應用或則內(nèi)核參數(shù)調(diào)整tuning、bandwidth、portmap等

以上可以得知,Multus CNI 屬于 Meta 類, 它可以與其他第三方插件適配,主插件來作為 Pod 的主網(wǎng)絡并且被 K8s所感知,它們可以搭配使用且不沖突。

Main 插件是用于在集群中創(chuàng)建額外的網(wǎng)絡:


1:bridge:創(chuàng)建基于網(wǎng)橋的額外網(wǎng)絡可讓同一主機中的 Pod 相互通信,并與主機通信。
2:host-device:創(chuàng)建 host-device 額外網(wǎng)絡可讓 Pod 訪問主機系統(tǒng)上的物理以太網(wǎng)網(wǎng)絡設備。
3:macvlan:創(chuàng)建基于 macvlan 的額外網(wǎng)絡可讓主機上的 Pod 通過使用物理網(wǎng)絡接口與其他主機和那些主機上的 Pod 通信。附加到基于 macvlan 的額外網(wǎng)絡的每個 Pod 都會獲得一個唯一的 MAC 地址。
4:ipvlan:創(chuàng)建基于 ipvlan 的額外網(wǎng)絡可讓主機上的 Pod 與其他主機和那些主機上的 Pod 通信,這類似于基于 macvlan 的額外網(wǎng)絡。與基于 macvlan 的額外網(wǎng)絡不同,每個 Pod 共享與父級物理網(wǎng)絡接口相同的 MAC 地址。
5:SR-IOV:創(chuàng)建基于 SR-IOV 的額外網(wǎng)絡可讓 Pod 附加到主機系統(tǒng)上支持 SR-IOV 的硬件的虛擬功能 (VF) 接口。




###############################################################
Ipam(IP Address Management)插件主要用來負責分配 IP 地址:




1:dhcp插件,節(jié)點上需要有 DHCP server;
2:host-local插件 ,是給定子網(wǎng)范圍,在單個幾點上基于這個子網(wǎng)進行 ip 地址分配;
3:static插件,靜態(tài)地址管理,直接指定 ip 地址使用的。
4:calico-ipam ,是 clalico cni 自己的 ip 地址分配插件,是一種集中式 ip 分配插件;
5:whereabouts ,也是一個集中式 ip 分配插件,用的比較少,使用了 sriov 設備才用到的,這個是 k8snetworkplumbingwg 社區(qū)開源的。




###########################################
Meta 插件:由 CNI 社區(qū)維護的內(nèi)部插件




1:flannel,這就是專門為 Flannel 項目提供的 CNI 插件;
2:tunning,是一個通過 sysctl 調(diào)整網(wǎng)絡設備參數(shù)的二進制文件;
3:portmap ,是一個通過 iptables 配置端口映射的二進制文件;
4:bandwidth ,是一個使用 Token Bucket Filter(TBF)來進行限流的二進制文件;
5:calico,是專門為 Calico 項目提供的 CNI 插件。

三、multus cni 部署

本次測試環(huán)境中使用的主cni為calico,網(wǎng)絡模式是ipip模式,如下:

[root@node1 ~]# kubectl get po -A  | grep calico
kube-system            calico-kube-controllers-75c594996d-x49mw     1/1     Running   5 (13d ago)    206d
kube-system            calico-node-htq5b                            1/1     Running   1 (13d ago)    206d
kube-system            calico-node-x6xwl                            1/1     Running   1 (13d ago)    206d
kube-system            calico-node-xdx46                            1/1     Running   1 (13d ago)    206d




#######查看IPIPMODE為Always
[root@node1 ~]# calicoctl  get ippool -o wide 
NAME                  CIDR             NAT    IPIPMODE   VXLANMODE   DISABLED   DISABLEBGPEXPORT   SELECTOR   
default-ipv4-ippool   10.233.64.0/18   true   Always     Never       false      false              all()      

下載multus cni文件部署multus 服務

1: 克隆文件
git clone https://github.com/k8snetworkplumbingwg/multus-cni.git && cd multus-cni/deployments




##################################
2:部署服務
[root@node1 deployments]# kubectl  apply -f multus-daemonset-thick.yml
customresourcedefinition.apiextensions.k8s.io/network-attachment-definitions.k8s.cni.cncf.io changed
clusterrole.rbac.authorization.k8s.io/multus changed
clusterrolebinding.rbac.authorization.k8s.io/multus changed
serviceaccount/multus changed
configmap/multus-daemon-config changed
daemonset.apps/kube-multus-ds created
[root@node1 deployments]# 




#################################
3:查看multus服務是否正常
[root@node1 ~]# kubectl get ds -n kube-system  | grep multus
kube-multus-ds   3         3         3       3            3                              44s
[root@node1 ~]# 
[root@node1 ~]# kubectl get po -o wide  -n kube-system  | grep multus
kube-multus-ds-fqdxg                       1/1     Running   0              53s    192.168.5.126   node2              
kube-multus-ds-gx2c7                       1/1     Running   0              53s    192.168.5.27    node3              
kube-multus-ds-z2j4n                       1/1     Running   0              53s    192.168.5.79    node1              
[root@node1 ~]#

multus cni作為ds 進程,會在每個節(jié)點做已下操作

1:在每個節(jié)點運行multus-daemon進程
[root@node1 net.d]# ps -ef | grep multus 
root     25811 25696  0 18:33 ?        00:00:00 /usr/src/multus-cni/bin/multus-daemon
root     31445 14072  0 18:43 pts/0    00:00:00 grep --color=auto multus
[root@node1 net.d]# 




#################################
2:在每個節(jié)點的/opt/cni/bin/上生成一個 Multus 二進制可執(zhí)行文件??蓤?zhí)行文件的作用是配置 Pod 的網(wǎng)絡棧,DaemonSet 的作用是實現(xiàn)網(wǎng)絡互通。
[root@node1 net.d]# ll /opt/cni/bin/  | grep multus 
-rwxr-xr-x 1 root root 45946850 Nov  1 18:33 multus-shim
[root@node1 net.d]# 




注意:一個 Network Namespace 的網(wǎng)絡棧包括:網(wǎng)卡(Network interface)、回環(huán)設備(Loopback Device)、路由表(Routing Table)和 iptables 規(guī)則。




##########################
3:在每個節(jié)點的/etc/cni/net.d目錄下生成00-multus.conf,如下:
[root@node1 net.d]# cat 00-multus.conf  | jq .
{
  "capabilities": {
    "bandwidth": true,
    "portMappings": true
  },
  "cniVersion": "0.3.1",
  "logLevel": "verbose",
  "logToStderr": true,
  "name": "multus-cni-network",
  "clusterNetwork": "/host/etc/cni/net.d/10-calico.conflist",  ##從此文件讀取集群calico網(wǎng)絡配置(版本不一樣,文件內(nèi)容可能會有差異,以自己環(huán)境為準)
  "type": "multus-shim"
}

至此multus cni的部署已經(jīng)完成,接下來需要測試使用,網(wǎng)上的一些教程使用的大部分是macvlan的形式,比較簡單。本次我們打算使用calico和flannel兩種cni相結(jié)合的方式來實現(xiàn)pod 的多網(wǎng)卡方案。

四、環(huán)境信息

已有環(huán)境的信息如下:

calico網(wǎng)絡作為master plugin,走eth0網(wǎng)卡;flannel網(wǎng)絡作為attachment網(wǎng)絡,走eth1網(wǎng)卡

主機         eth0          eth1
node1  192.168.5.79    192.168.10.11
node2  192.168.5.126  192.168.10.12
node3  192.168.5.27    192.168.10.13
每個節(jié)點使用eth0作為默認路由
[root@node1 ~]# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.5.1     0.0.0.0         UG    0      0        0 eth0
10.233.90.0     0.0.0.0         255.255.255.0   U     0      0        0 *
10.233.90.1     0.0.0.0         255.255.255.255 UH    0      0        0 cali41f400bfcca
10.233.92.0     192.168.5.27    255.255.255.0   UG    0      0        0 tunl0
10.233.96.0     192.168.5.126   255.255.255.0   UG    0      0        0 tunl0
169.254.169.254 192.168.10.2    255.255.255.255 UGH   0      0        0 eth1
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1

主機網(wǎng)絡拓撲如下:

e403444e-7bd3-11ee-939d-92fbcf53809c.png

五、flannel部署

下載yaml文件

在主機運行wget下載flannel的yaml 文件
[root@node1 ~]# wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

修改啟動參數(shù)

1:此次是calico和flannel網(wǎng)絡分離使用不同的網(wǎng)卡,所以要修改flannel網(wǎng)絡使用的網(wǎng)卡為eth1

編輯flannel.yaml文件,添加如下內(nèi)容
     containers:
      - name: kube-flannel
        image: docker.io/flannel/flannel:v0.22.3
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth1                    ####設置使用網(wǎng)卡為eth1




#######################################3
2:修改網(wǎng)絡,避免和現(xiàn)有的calico以及物理網(wǎng)絡沖突
  net-conf.json: |
    {
      "Network": "10.233.0.0/16",  
      "Backend": {
        "Type": "vxlan"   ###網(wǎng)絡模式為vxlan
      }
    }

部署flannel

1:部署flannel
[root@node1 ~]# kubectl apply -f  flannel.yaml 
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[root@node1 ~]# 




#################################
2:查看pod啟動狀態(tài)
[root@node1 ~]# kubectl get po -A -o wide   | grep flannel 
kube-flannel           kube-flannel-ds-6tkzg                        1/1     Running   0              3m39s   192.168.5.126   node2              
kube-flannel           kube-flannel-ds-72ccp                        1/1     Running   0              5m20s   192.168.5.79    node1              
kube-flannel           kube-flannel-ds-gvhlc                        1/1     Running   0              3m47s   192.168.5.27    node3              
[root@node1 ~]# 








###########################
3:查看flannel的啟動日志
[root@node1 ~]# kubectl logs kube-flannel-ds-6tkzg  -n kube-flannel
Defaulted container "kube-flannel" out of: kube-flannel, install-cni-plugin (init), install-cni (init)
I1102 03:07:31.013498       1 main.go:212] CLI flags config: {etcdEndpoints:http://127.0.0.1:4001,http://127.0.0.1:2379 etcdPrefix:/coreos.com/network etcdKeyfile: etcdCertfile: etcdCAFile: etcdUsername: etcdPassword: version:false kubeSubnetMgr:true kubeApiUrl: kubeAnnotationPrefix:flannel.alpha.coreos.com kubeConfigFile: iface:[eth1] ifaceRegex:[] ipMasq:true ifaceCanReach: subnetFile:/run/flannel/subnet.env publicIP: publicIPv6: subnetLeaseRenewMargin:60 healthzIP:0.0.0.0 healthzPort:0 iptablesResyncSeconds:5 iptablesForwardRules:true netConfPath:/etc/kube-flannel/net-conf.json setNodeNetworkUnavailable:true useMultiClusterCidr:false}
W1102 03:07:31.013748       1 client_config.go:617] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I1102 03:07:31.133998       1 kube.go:145] Waiting 10m0s for node controller to sync
I1102 03:07:31.134230       1 kube.go:490] Starting kube subnet manager
I1102 03:07:31.145860       1 kube.go:511] Creating the node lease for IPv4. This is the n.Spec.PodCIDRs: [10.233.64.0/24]
I1102 03:07:31.146023       1 kube.go:511] Creating the node lease for IPv4. This is the n.Spec.PodCIDRs: [10.233.66.0/24]
I1102 03:07:32.134217       1 kube.go:152] Node controller sync successful
I1102 03:07:32.134272       1 main.go:232] Created subnet manager: Kubernetes Subnet Manager - node2
I1102 03:07:32.134290       1 main.go:235] Installing signal handlers
I1102 03:07:32.134579       1 main.go:543] Found network config - Backend type: vxlan
I1102 03:07:32.135308       1 match.go:259] Using interface with name eth1 and address 192.168.10.12
I1102 03:07:32.135345       1 match.go:281] Defaulting external address to interface address (192.168.10.12)
I1102 03:07:32.135446       1 vxlan.go:141] VXLAN config: VNI=1 Port=0 GBP=false Learning=false DirectRouting=false
W1102 03:07:32.178714       1 main.go:596] no subnet found for key: FLANNEL_SUBNET in file: /run/flannel/subnet.env
I1102 03:07:32.178731       1 main.go:482] Current network or subnet (10.233.0.0/16, 10.233.65.0/24) is not equal to previous one (0.0.0.0/0, 0.0.0.0/0), trying to recycle old iptables rules
I1102 03:07:32.181267       1 kube.go:511] Creating the node lease for IPv4. This is the n.Spec.PodCIDRs: [10.233.65.0/24]
I1102 03:07:32.229373       1 main.go:357] Setting up masking rules
I1102 03:07:32.232287       1 main.go:408] Changing default FORWARD chain policy to ACCEPT
I1102 03:07:32.234353       1 iptables.go:290] generated 7 rules
I1102 03:07:32.236378       1 main.go:436] Wrote subnet file to /run/flannel/subnet.env
I1102 03:07:32.236397       1 main.go:440] Running backend.
I1102 03:07:32.236791       1 iptables.go:290] generated 3 rules
I1102 03:07:32.236913       1 vxlan_network.go:65] watching for new subnet leases








###########################
4:確認各個節(jié)點flannel插件以及網(wǎng)絡正常
[root@node1 ~]# ll /opt/cni/bin/  | grep flannel
-rwxr-xr-x 1 root root  2414517 Nov  2 11:03 flannel  ###會在每個節(jié)點生成flannel的二進制文件




[root@node1 ~]# cat /var/run/flannel/subnet.env   ###每個節(jié)點可用網(wǎng)絡的CIDR
FLANNEL_NETWORK=10.233.0.0/16
FLANNEL_SUBNET=10.233.64.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
[root@node1 ~]# 




[root@node1 ~]# ip  a    ###在每個節(jié)點多了一個flannel.1的網(wǎng)橋
49: flannel.1:  mtu 1450 qdisc noqueue state UNKNOWN group default 
    link/ether d2:7e:4a:31:fe:e9 brd ff:ff:ff:ff:ff:ff
    inet 10.233.64.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::d07e:4aff:fe31:fee9/64 scope link 
       valid_lft forever preferred_lft forever




#############################################
5:創(chuàng)建NetworkAttachmentDefinition
編輯yaml文件內(nèi)容如下:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: flannel
spec:
  config: '{
      "cniVersion": "0.3.0",
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": false  #這里要設為false,否則flannel會在容器里面添加默認路由,走flannel生成的net1網(wǎng)卡;因為calico使用了默認網(wǎng)卡eth0,所以容器里面的默認路由也要走calico生成的容器網(wǎng)卡
      }
    }'
    
[root@node1 ~]# kubectl apply -f  flannel-nad.yaml
networkattachmentdefinition.k8s.cni.cncf.io/flannel created
[root@node1 ~]#
[root@node1 ~]# kubectl get Network-Attachment-Definition -A
NAMESPACE   NAME      AGE
default     flannel   27s

六、修改calico網(wǎng)絡使用網(wǎng)卡

因為環(huán)境在最初之前已經(jīng)部署了calico,是按照calico網(wǎng)絡默認方式選擇的可用的ip地址,因為這次要測試流量分離所以最好要修改下。

calico選擇ip的方式有兩種
1:first-found:第一個接口的第一個有效IP地址,會排除docker網(wǎng)絡,localhost。我們環(huán)境中有兩個網(wǎng)卡,所以要選擇一個有效的的網(wǎng)卡
2:can-reach=DESTINATION:可以理解為calico會從部署節(jié)點路由中獲取到達目的ip或者域名的源ip地址

我們檢查下目前calico使用的是哪種模式如下:

[root@node1 ~]# kubectl get  ds -n kube-system    | grep calico 
calico-node      3         3         3       3            3           kubernetes.io/os=linux   207d
[root@node1 ~]# 




###查看calico daemonset中IP_AUTODETECTION_METHOD 配置
[root@node1 ~]# kubectl get  ds/calico-node -n kube-system  -o yaml




    - name: IP_AUTODETECTION_METHOD
          value: can-reach=$(NODEIP)  ###可以看到使用是can-reach方式,將本機eth0的ip作為流量網(wǎng)卡使用




####進入pod查看環(huán)境變量,如下:
[root@node1 ~]# kubectl exec -it calico-node-htq5b -nkube-system bash
[root@node1 /]# env  | grep IP_AUTODETECTION_METHOD
IP_AUTODETECTION_METHOD=can-reach=192.168.5.79    ###可以看到是本機eth0的ip
[root@node1 /]#

修改calico使用指定網(wǎng)卡eth0

有以下兩種方式
1:命令行執(zhí)行替換變量
[root@node1 ~]# kubectl set env daemonset/calico-node  -n kube-system IP_AUTODETECTION_METHOD=interface=eth0
daemonset.apps/calico-node env updated




####修改完之后,pod自動重啟如下:
[root@node1 ~]# kubectl get  pod  -n kube-system    | grep calico 
calico-kube-controllers-75c594996d-x49mw   1/1     Running   5 (13d ago)    207d
calico-node-749ll                          1/1     Running   0              12s
calico-node-hbz99                          1/1     Running   0              33s
calico-node-lgpcj                          1/1     Running   0              43s








##############################################
2:編輯daemonset ,如下:
[root@node1 ~]# kubectl edit daemonset/calico-node  -n kube-system




        - name: IP_AUTODETECTION_METHOD
          value: interface=eth0   ###修改為eth0 ,效果和上面一樣,pod會自動重啟
          




###############################################
3:進入pod,查看是否生效
[root@node1 ~]# kubectl exec -it calico-node-749ll -nkube-system bash
[root@node3 /]# env  | grep IP_AUTODETECTION_METHOD
IP_AUTODETECTION_METHOD=interface=eth0   ###變量已經(jīng)生效
[root@node3 /]# 
[root@node3 /]#

七、啟動pod測試

1:編輯pod yaml,如下:
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx                                                                                                                                                              
  annotations:
    k8s.v1.cni.cncf.io/networks: flannel
spec:
  containers:
  - name: nginx
    image: docker.io/library/nginx:latest
    imagePullPolicy: IfNotPresent


######################################################
2:啟動pod,查看狀態(tài)
[root@node1 ~]# kubectl apply -f pod.yaml 
pod/nginx created


[root@node1 ~]# kubectl get po -o wide  ###默認顯示的還是calico的網(wǎng)絡
NAME                                      READY   STATUS    RESTARTS       AGE    IP             NODE    NOMINATED NODE   READINESS GATES
nginx                                     1/1     Running   0              8s     172.16.28.2    node3              




######################################################
3:此pod位于node3節(jié)點,ssh到node3,進入pod命名空間查看ip以及路由問題
[root@node3 ~]# crictl ps | grep nginx
fcfbae2ace1b9       12766a6745eea       4 minutes ago       Running             nginx                       0                   0365e4a0f167f       nginx
[root@node3 ~]# crictl inspect fcfbae2ace1b9  | grep -i pid
    "pid": 23237,
            "pid": 1
            "type": "pid"
[root@node3 ~]# nsenter -t 23237 -n bash 
[root@node3 ~]# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
2: tunl0@NONE:  mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if79:  mtu 1480 qdisc noqueue state UP group default 
    link/ether ea:25:5b:3169 brd ffffff:ff link-netnsid 0
    inet 172.16.28.2/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80:5bffe169/64 scope link 
       valid_lft forever preferred_lft forever
6: net1@if81:  mtu 1450 qdisc noqueue state UP group default 
    link/ether ea:86:51:86:34:69 brd ffffff:ff link-netnsid 0
    inet 10.233.66.2/24 brd 10.233.66.255 scope global net1
       valid_lft forever preferred_lft forever
    inet6 fe80:51ff3469/64 scope link 
       valid_lft forever preferred_lft forever


net1就是使用flannel網(wǎng)絡獲取到的ip地址




################################################################
4:查看容器中的路由
[root@node3 ~]# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         169.254.1.1     0.0.0.0         UG    0      0        0 eth0
10.233.0.0      10.233.66.1     255.255.0.0     UG    0      0        0 net1
10.233.66.0     0.0.0.0         255.255.255.0   U     0      0        0 net1
169.254.1.1     0.0.0.0         255.255.255.255 UH    0      0        0 eth0
[root@node3 ~]# 


以上可以看到默認路由是容器內(nèi)部的eth0 ,走的物理機網(wǎng)卡的eth0

測試網(wǎng)絡是否可通,在容器的宿主機node3上測試兩個ip地址都可以通

e41b1af6-7bd3-11ee-939d-92fbcf53809c.png

從其他物理節(jié)點測試,calico網(wǎng)絡172段的可通,flannel的不可達,因為pod默認路由走的eth0.

e432dbc8-7bd3-11ee-939d-92fbcf53809c.png

在創(chuàng)建一個pod,測試不同主機之間的pod能否互通

[root@node1 ~]# kubectl get po -o wide   ###新建nginx2,位于node2節(jié)點
NAME                                      READY   STATUS    RESTARTS       AGE     IP             NODE    NOMINATED NODE   READINESS GATES
nginx                                     1/1     Running   0              32m     172.16.28.2    node3              
nginx2                                    1/1     Running   0              3m45s   172.16.44.1    node2              

進入nginx2容器,ping nginx容器ip,如下:

[root@node2 ~]# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
2: tunl0@NONE:  mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if85:  mtu 1480 qdisc noqueue state UP group default 
    link/ether 56:9ba45a brd ffffff:ff link-netnsid 0
    inet 172.16.44.1/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::549bfea4:da5a/64 scope link 
       valid_lft forever preferred_lft forever
6: net1@if87:  mtu 1450 qdisc noqueue state UP group default 
    link/ether a6:41f825 brd ffffff:ff link-netnsid 0
    inet 10.233.65.2/24 brd 10.233.65.255 scope global net1
       valid_lft forever preferred_lft forever
    inet6 fe80:e5ffb125/64 scope link 
       valid_lft forever preferred_lft forever








[root@node2 ~]# ping 10.233.65.2   ##測試容器本身ip
PING 10.233.65.2 (10.233.65.2) 56(84) bytes of data.
64 bytes from 10.233.65.2: icmp_seq=1 ttl=64 time=0.141 ms
^C
--- 10.233.65.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.141/0.141/0.141/0.000 ms
[root@node2 ~]# ping 10.233.66.2   ###測試node3節(jié)點ip,可通
PING 10.233.66.2 (10.233.66.2) 56(84) bytes of data.
64 bytes from 10.233.66.2: icmp_seq=1 ttl=62 time=4.77 ms
64 bytes from 10.233.66.2: icmp_seq=2 ttl=62 time=1.00 ms
^C
--- 10.233.66.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.001/2.889/4.777/1.888 ms

注意:在該環(huán)境中,如果使用networkpolicy,是能對容器的eth0顯示,并不能顯示net1網(wǎng)卡的流量策略,因為flannel本身不支持networkpolicy功能。








審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5343

    瀏覽量

    170800

原文標題:k8s 多網(wǎng)卡方案之multus用法

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對比

    相關(guān)技術(shù)都比較完善,有比較健全的Logstash、Fluentd、FileBeats等。但在Docker中,尤其在k8s中,日志采集并沒有很好的解決方案,主要原因如下:采集目標:需要采集宿主機日志
    發(fā)表于 02-28 12:49

    K8S容器編排的互通測試

    K8S容器編排NetWorkPolicy官方實例
    發(fā)表于 06-06 11:28

    K8s 從懵圈到熟練 – 集群網(wǎng)絡詳解

    導讀:阿里云 K8S 集群網(wǎng)絡目前有兩種方案:一種是 flannel 方案;另外一種是基于 calico 和彈性網(wǎng)卡 eni 的 terway 方案
    發(fā)表于 10-14 15:06

    OpenStack與K8s結(jié)合的兩種方案的詳細介紹和比較

    OpenStack與K8S結(jié)合主要有兩種方案。一是K8S部署在OpenStack平臺之上,二是K8S和OpenStack組件集成。
    的頭像 發(fā)表于 10-14 09:38 ?2.7w次閱讀

    關(guān)于K8s最詳細的解析

    一個目標:容器操作;兩地三中心;四層服務發(fā)現(xiàn);五種Pod共享資源;六個CNI常用插件;七層負載均衡;八種隔離維度;九個網(wǎng)絡模型原則;十類IP地址;百級產(chǎn)品線;千級物理機;萬級容器;相如無億,K8s有億:億級日服務人次。
    的頭像 發(fā)表于 04-08 13:55 ?7204次閱讀
    關(guān)于<b class='flag-5'>K8s</b>最詳細的解析

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對強大的集群,成千上萬的容器,突然感覺不香了。 這時候就需要我們的主角 Kubernetes 上場了,先來了解一下 K8s 的基本概念,后面再介紹實踐,由淺入深步步為營
    的頭像 發(fā)表于 06-02 11:56 ?3396次閱讀

    簡單說明k8s和Docker之間的關(guān)系

    這篇文章主要介紹k8s和Docker關(guān)系簡單說明,本文利用圖文講解的很透徹,有需要的同學可以研究下 最近項目用到kubernetes(以下簡稱k8s,k
    的頭像 發(fā)表于 06-24 15:48 ?3326次閱讀

    Kubernetes Pod網(wǎng)卡方案MULTUS

    資源定義" 可以做到這一點。MULTUS依賴于 "自定義資源定義" 來存儲其他接口和CNI插件所需的信息。
    的頭像 發(fā)表于 06-22 10:08 ?1271次閱讀

    K8S(kubernetes)學習指南

    K8S(kubernetes)學習指南
    發(fā)表于 06-29 14:14 ?0次下載

    mysql部署在k8s上的實現(xiàn)方案

    的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應用軟件之一。這里主要講 mysql 部署在 k8s 上,mysql 部署在 k8s 上的優(yōu)勢主要有以下幾點。
    的頭像 發(fā)表于 09-26 10:39 ?2441次閱讀

    kubectl的多樣用法

    kubectl是K8s官方附帶的命令行工具, 可以方便的操作K8s集群. 這篇文章主要介紹一些kubectl的別樣用法, 希望讀者有基礎的K8s
    的頭像 發(fā)表于 02-13 10:53 ?685次閱讀

    k8s集群環(huán)境中工作有多快

    命令就會很低效。 今天介紹3個工具會讓你在k8s集群環(huán)境中工作的很輕松。我將從以下幾個方面來評估工具實用性: 速度 如果你有多個k8s集群可選擇,你切換
    的頭像 發(fā)表于 05-29 14:28 ?552次閱讀
    <b class='flag-5'>多</b><b class='flag-5'>k8s</b>集群環(huán)境中工作有多快

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    k8s是什么意思? kubernetes簡稱K8s,是一個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單并且高效(powerful
    發(fā)表于 07-19 13:14 ?1085次閱讀

    K8s集群管理:為什么需要集群、集群的優(yōu)勢是什么

    隨著K8s和云原生技術(shù)的快速發(fā)展,以及各大廠商在自己的數(shù)據(jù)中心使用K8s的API進行容器化應用編排和管理,讓應用交付本身變得越來越標準化和統(tǒng)一化,并且實現(xiàn)了與底層基礎設施的完全解耦,為集群和混合云提供了一個堅實技術(shù)基礎。
    發(fā)表于 09-14 10:48 ?1122次閱讀
    <b class='flag-5'>K8s</b><b class='flag-5'>多</b>集群管理:為什么需要<b class='flag-5'>多</b>集群、<b class='flag-5'>多</b>集群的優(yōu)勢是什么

    常用的k8s容器網(wǎng)絡模式有哪些?

    常用的k8s容器網(wǎng)絡模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s的容器網(wǎng)絡模式多種多樣
    的頭像 發(fā)表于 09-19 11:29 ?180次閱讀