在 Kubernetes中,網絡是非常重要的一個領域。Kubernetes 本身不提供網絡解決方案,但是提供了 CN I規范。這些規范被許多 CNI 插件(例如 WeaveNet,Flannel,Calico 等)遵守。這些插件中任何一個都可以在集群上使用和部署以提供網絡解決方案。該網絡稱為集群的默認網絡。此默認網絡使 Pods 不僅可以在同一節點上而且可以在群集中的各個節點之間相互通信。
隨著發展,Kubernetes 缺乏支持 VNF 中多個網絡接口的所需功能。傳統上,網絡功能使用多個網絡接口分離控制,管理和控制用戶/數據的網絡平面。他們還用于支持不同的協議,滿足不同的調整和配置要求。
為了解決這個需求,英特爾實現了 MULTUS 的 CNI 插件,其中提供了將多個接口添加到 Pod 的功能。這允許 POD 通過不同的接口連接到多個網絡,并且每個接口都將使用其自己的 CNI 插件。
下面是 Multus CNI 提供的連接到 Pod 的網絡接口的圖示。該圖顯示了具有三個接口的容器:eth0
,net0
和net1
。eth0
連接 Kubernetes 集群網絡以連接kubernetes服務器/服務(例如 Kubernetes api-server,kubelet 等)。net0
和net1
是其他網絡附件,并通過使用其他 CNI 插件(例如vlan / vxlan / ptp)連接到其他網絡。
MULTUS 工作原理
Kubernetes 當前沒有提供為POD添加額外的接口選項的規定,或支持多個 CNI 插件同時工作的規定,但是它確實提供了一種由 API 服務器擴展受支持的API的機制。使用 "自定義資源定義" 可以做到這一點。MULTUS依賴于 "自定義資源定義" 來存儲其他接口和CNI插件所需的信息。
我們首先需要確保將 MULTUS 二進制文件放置在 /opt/cni/bin
位置的所有節點上,并在/etc/cni/net.d
位置創建一個新的配置文件。與 MULTUS 使用的 kubeconfig 文件一起使用。
在/etc/cni/net.d
中創建的新配置文件基于集群中已經存在的默認網絡配置。
在此之后,CRD 用于定義新的種類名稱 "NetworkAttachmentDefinition",以及服務帳戶和 MULTUS 的集群角色以及相應的綁定。這個新的集群角色將提供對隨 CRD 添加的新 API 組以及默認 API 組中 Pod 資源的訪問權限。
然后創建類型為 "NetworkAttachmentDefinition" 的客戶資源實例,該實例稍后將在創建具有多個接口的 Pod 時使用。
部署示例
在本文中,我們將多次提及兩件事:
- "默認網絡" - 這是您的Pod到Pod網絡。這就是集群中 Pod 之間相互通信的方式,以及它們之間的連通性。一般而言,這被稱為名為 eth0 的接口。此接口始終連接到您的 Pod,以便它們之間可以相互連接。除此之外,我們還將添加接口。
- “ CRD” - 自定義資源定義。自定義資源是擴展 Kubernetes API 的一種方式。我們在這里使用這些存儲 Multus 可以讀取的一些信息。首先,我們使用它們來存儲附加到您的 Pod 的每個其他接口的配置。
目前支持 Kubernetes 1.16+ 版本。
安裝
我們建議的用于部署 Multus 的快速入門方法是使用 Daemonset(在群集中的每個節點上運行 Pod 的方法)進行部署,該 Pod 會安裝 Multus 二進制文件并配置 Multus 以供使用。
首先,克隆此 GitHub 存儲庫。
$gitclonehttps://github.com/intel/multus-cni.git&&cdmultus-cni
我們將在此存儲庫中使用帶有kubectl的YAML文件。
$cat./images/multus-daemonset.yml|kubectlapply-f-
Multus daemonset 完成了那些工作?
-
啟動 Multus 守護程序集,這會在每個節點上運行一個pod,從而在
/opt/cni/bin
中的每個節點上放置一個 Multus 二進制文件 -
按照字母順序讀取
/etc/cni/net.d
中的第一個配置文件,并為 Multus 創建一個新的配置文件,即/etc/cni/net.d/00-multus.conf
,此配置是自動生成并基于默認網絡配置(假定是按字母順序排列的第一個配置) -
在每個節點上創建一個
/etc/cni/net.d/multus.d
目錄,其中包含用于 Multus 訪問 Kubernetes API 的身份驗證信息。
創建其他接口
我們要做的第一件事是為我們附加到Pod的每個其他接口創建配置。我們將通過創建自定義資源來做到這一點。快速入門安裝的一部分會創建一個 "CRD" (自定義資源定義,它是我們保留這些自定義資源的位置),我們將在其中存儲每個接口的配置。
CNI 配置
我們將添加的每個配置都是CNI配置。如果您不熟悉它們,讓我們快速分解它們。這是一個示例CNI配置:
{
"cniVersion":"0.3.0",
"type":"loopback",
"additional":"information"
}
CNI配置是 JSON,我們這里有一個結構,其中包含一些我們感興趣的東西:
-
cniVersion
:告訴每個 CNI 插件正在使用哪個版本,如果使用的版本太晚(或太早),則可以提供插件信息。 -
type
:告訴 CNI 在磁盤上調用哪個二進制文件。每個 CNI 插件都是一個二進制文件。通常,這些二進制文件存儲在每個節點上的/opt/cni/bin
中,并且 CNI 執行此二進制文件。在這種情況下,我們指定了loopback
二進制文件(它將創建一個loopback
類型的網絡接口)。如果這是您首次安裝 Multus,則可能需要驗證 "type" 字段中的插件是否確實在/opt/cni/bin
目錄中。 -
additional
:此字段以此處為例,每個 CNI 插件都可以在JSON中指定所需的任何配置參數。這些特定于您在 "type" 字段中調用的二進制文件。
當 CNI 配置更改時,您不需要重新加載或刷新 Kubelets。每次創建和刪除 Pod 時都會讀取這些內容。因此,如果您更改配置,它將在下一次創建 Pod 時應用。如果現有 Pod 需要新配置,則可能需要重新啟動。
將配置存儲為自定義資源
因此,我們要創建一個附加接口。讓我們創建一個 macvlan 接口供 Pod 使用。我們將創建一個自定義資源,該資源定義接口的 CNI 配置。
請注意,在以下命令中有一種:NetworkAttachmentDefinition
。這是我們配置的名字-它是 Kubernetes 的自定義擴展,定義了我們如何將網絡連接到 Pod。
其次,注意配置字段。您將看到這是一個 CNI 配置,就像我們前面解釋的那樣。
最后但非常重要的一點是,在元數據下注意 name 字段-在這里我們為該配置指定名稱,這是我們告訴 pod 使用此配置的方式。這里的名稱是macvlan-conf
-我們正在為 macvlan 創建配置。
這是創建此示例配置的命令:
apiVersion:"k8s.cni.cncf.io/v1"
kind:NetworkAttachmentDefinition
metadata:
name:macvlan-conf
spec:
config:'{
"cniVersion":"0.3.0",
"type":"macvlan",
"master":"eth0",
"mode":"bridge",
"ipam":{
"type":"host-local",
"subnet":"192.168.1.0/24",
"rangeStart":"192.168.1.200",
"rangeEnd":"192.168.1.216",
"routes":[
{"dst":"0.0.0.0/0"}
],
"gateway":"192.168.1.1"
}
}'
本示例使用 eth0 作為主參數,此主參數應與集群中主機上的接口名稱匹配。
您可以查看使用 kubectl 創建的配置,方法如下:
$kubectlgetnetwork-attachment-definitions
您可以通過描述它們來獲得更多詳細信息:
$kubectldescribenetwork-attachment-definitionsmacvlan-conf
創建一個附加附加接口的Pod
我們將創建一個 pod。就像您之前可能創建的任何pod一樣,它看起來都很熟悉,但是,我們將有一個特殊的注釋字段-在這種情況下,我們將有一個名為k8s.v1.cni.cncf.io/networks
的注釋。如上創建的,該字段以逗號分隔的列表列出了 NetworkAttachmentDefinitions 的名稱。請注意,在下面的命令中,我們具有 k8s.v1.cni.cncf.io/networks
的注釋:macvlan-conf
其中macvlan-conf
是我們在創建配置時使用的名稱。
讓我們繼續使用以下命令創建一個 pod:
apiVersion:v1
kind:Pod
metadata:
name:samplepod
annotations:
k8s.v1.cni.cncf.io/networks:macvlan-conf
spec:
containers:
-name:samplepod
command:["/bin/ash","-c","trap:TERMINT;sleepinfinity&wait"]
image:alpine
您現在可以檢查Pod并查看連接了哪些接口,如下所示:
$kubectlexec-itsamplepod--ipa
您應該看到,有 3 個接口:
-
lo
環回接口 -
eth0
我們的默認網絡 -
net1
是我們使用macvlan配置創建的新接口
網絡狀態 Annotations
為了確認,請使用kubectl describe pod pod samplepod
,然后會有一個注釋部分,類似于以下內容:
Annotations:k8s.v1.cni.cncf.io/networks:macvlan-conf
k8s.v1.cni.cncf.io/networks-status:
[{
"name":"cbr0",
"ips":[
"10.244.1.73"
],
"default":true,
"dns":{}
},{
"name":"macvlan-conf",
"interface":"net1",
"ips":[
"192.168.1.205"
],
"mac":"869655:0d",
"dns":{}
}]
該元數據告訴我們,我們有兩個成功運行的 CNI 插件。
如果我想要更多接口怎么辦?
您可以通過創建更多的自定義資源,然后在pod的注釋中引用它們,來向pod添加更多接口。您還可以重復使用配置,例如,要將兩個 macvlan 接口附加到 Pod,可以創建如下 Pod:
apiVersion:v1
kind:Pod
metadata:
name:samplepod
annotations:
k8s.v1.cni.cncf.io/networks:macvlan-conf,macvlan-conf
spec:
containers:
-name:samplepod
command:["/bin/ash","-c","trap:TERMINT;sleepinfinity&wait"]
image:alpine
請注意,注釋現在讀取為k8s.v1.cni.cncf.io/networks:macvlan-conf,macvlan-conf
。如果我們有兩次使用相同的配置,并用逗號分隔。
審核編輯 :李倩
-
網卡
+關注
關注
4文章
307瀏覽量
27374 -
網絡接口
+關注
關注
0文章
85瀏覽量
17207
原文標題:Kubernetes Pod 多網卡方案 Multus
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論