使用多重 CNI 外掛程式在 OKE 上部署啟用 SR-IOV 的網路介面容器應用程式
簡介
在本教學課程中,我們將探討如何運用進階網路功能,在 Oracle Cloud Infrastructure Kubernetes Engine (OKE) 內的虛擬實例工作者節點上部署容器化應用程式。具體而言,我們將為容器網路介面啟用單一根 I/O 虛擬化 (SR-IOV) ,並設定 Multus CNI 外掛程式,為您的容器啟用多址網路。
透過結合 SR-IOV 與 Multus,您可以為 AI、機器學習和即時資料處理等專業工作負載實現高效能、低延遲的網路。本教學課程將逐步說明如何設定 OKE 環境、使用已啟用 SR-IOV 的介面部署工作節點,以及使用 Multus CNI 管理 Pod 中的多個網路介面。無論您是要進行高速封包處理,還是需要微調 Kubernetes 網路,本教學課程都將為您提供入門所需的工具和知識。
注意:
- 發布此教學課程時,虛擬執行處理上的 Pod 或容器若是 OKE 叢集的一部分,也無法與 Multus CNI Plugin 一起使用 SR-IOV CNI。
- 在本教學課程中,我們將示範如何在虛擬執行處理 (屬於 OKE 叢集的一部分) 上執行的 Pod 或容器內使用啟用 SR-IOV 的介面虛擬網路介面卡 (VNIC) (位於虛擬實例上) 可用於 Pod 中,並可透過 Multus CNI 外掛程式 (其中完全未使用 SR-IOV CNI 外掛程式) 的協助使用。
- 裸機執行處理 (OKE 叢集的一部分) 支援 SR-IOV CNI 外掛程式,並搭配 Multus CNI 外掛程式。此教學課程超出範圍。
目標
- 使用多重 CNI Plugin 在啟用 SR-IOV 的網路介面的 OKE 內虛擬執行處理工作節點上部署容器應用程式。
作業 1:使用堡壘主機、操作員、三個 VM 工作節點及 Flannel CNI Plugin 部署 OKE
確定已使用下列設定部署 OKE:
- 堡壘主機
- 運算子
- 3 個 VM 工作節點
- Flannel CNI 外掛程式
此設定詳列於以下教學課程中:使用 Oracle Cloud Infrastructure Kubernetes Engine 部署 Kubernetes 叢集與 Terraform 。
下列影像顯示我們將在整個教學課程中使用的元件視覺總覽。
工作 2:在每個工作節點上啟用 SR-IOV (硬體輔助) 網路
注意:必須對屬於 OKE 叢集的所有工作節點執行下列步驟。
下圖顯示 OKE 叢集內將在此教學課程中搭配使用的工作節點視覺總覽。
在執行處理上啟用 SR-IOV
-
使用 SSH 登入執行處理或工作節點。
- 執行
lspci
指令,確認目前所有 VNIC 使用哪個網路驅動程式。 - 請注意,這裡使用了
Virtio
網路驅動程式。
- 前往 OCI 主控台的執行處理詳細資訊頁面。
- 向下捲動。
- 請注意, NIC 附件類型現在是 PARAVIRTUALIZED 。
- 前往 OCI 主控台的執行處理詳細資訊頁面。
- 按一下其他動作。
- 按一下編輯。
- 執行
-
按一下顯示進階選項,
- 按一下啟動選項,然後選取硬體輔助 (SR-IOV) 網路作為網路類型。
- 按一下儲存變更。
-
按一下重新啟動執行處理以確認執行處理重新啟動。
-
請注意,執行處理狀態已變更為 STOPPING 。
-
請注意,執行處理狀態已變更為 STARTING 。
-
請注意,執行處理狀態已變更為 RUNNING 。
- 向下捲動。
- 請注意, NIC 附件類型現在是 VFIO 。
-
下圖顯示目前已設定的視覺化總覽。
工作 3:為啟用 SR-IOV 的 VNIC 建立新的子網路
我們會建立一個專用的子網路,讓啟用 SR-IOV 的介面能夠使用。
工作 3.1:建立安全清單
由於我們已經在其他子網路使用安全清單,但我們也需要為新建立的 SR-IOV 子網路提供專用的安全清單。
-
前往 OCI 主控台。
- 瀏覽至虛擬雲端網路。
- 按一下現有的 VCN。
- 按一下安全清單。
- 按一下建立安全清單。
-
在傳入規則 1 中,輸入下列資訊。
- 輸入名稱。
- 選取 CIDR 作為來源類型。
- 輸入
0.0.0.0/0
作為來源 CIDR 。 - 選取所有協定作為 IP 協定。
- 向下捲動。
- 在傳出規則 1 中,輸入下列資訊。
- 選取 CIDR 作為來源類型。
- 輸入
0.0.0.0/0
作為來源 CIDR 。 - 選取所有協定作為 IP 協定。
- 按一下建立安全清單。
-
請注意,將會建立新的安全清單。
工作 3.2:建立子網路
-
前往虛擬雲端網路詳細資訊頁面。
- 按一下子網路。
- 請注意已為 OKE 環境建立的現有子網路。
- 按一下建立子網路。
- 輸入名稱。
- 輸入 IPv4 CIDR 區塊。
- 向下捲動。
- 選取專用子網路。
- 向下捲動。
- 為 DHCP 選項選取 [ 預設 DHCP 選項 ]。
- 選取在任務 3.1 中建立的安全清單。
- 按一下建立子網路。
-
請注意,系統會建立網路子網路。
注意:
- 子網路本身沒有任何支援 SR-IOV 的技術元件。
- 在本教學課程中,我們使用標準 OCI 子網路,以允許使用 SR-IOV 技術傳輸流量。
-
下圖顯示目前已設定的視覺化總覽。
作業 4:新增第二個 VNIC 連附項
下圖以視覺化方式總覽,瞭解工作者節點在新增第二個 VNIC 之前,如何透過單一 VNIC 連線至工作者節點子網路。
在將第二個 VNIC 連附項新增至工作節點之前,請先建立一個網路安全群組。
作業 4.1:建立網路安全群組 (NSG)
我們已經在其他 VNIC 使用 NSG,但我們還需要為新建立的 VNIC 提供專用的 NSG,我們將會新增至屬於 OKE 叢集一部分的現有虛擬執行處理,以作為 Kubernetes 工作節點的方式播放。此介面將是已啟用 SR-IOV 的 VNIC。
-
前往虛擬雲端網路詳細資訊頁面。
- 瀏覽至網路安全群組。
- 按一下建立網路安全群組。
-
新增下列規則。
- 傳入:
- 允許來源類型:選取 CIDR 。
- 來源:輸入
0.0.0.0/0
。 - 目的地:將目的地留白。
- 協定:允許所有協定。
- 傳出:
- 允許來源類型:選取 CIDR 。
- 來源:將來源保留空白。
- 目的地:輸入
0.0.0.0/0
。 - 協定:允許所有協定。
- 傳入:
-
請注意,已建立 NSG。我們會將其套用至我們將建立的新 (次要) VNIC (在 OKE 叢集中的每個工作節點上)。
作業 4.2:新增 VNIC
-
瀏覽至每個虛擬工作節點執行處理,並在每個工作節點新增第二個 VNIC。
- 瀏覽至每個虛擬工作節點執行處理,然後按一下連附的 VNIC 。
- 請注意,已經有現有的 VNIC。
- 按一下建立 VNIC 即可新增第二個 VNIC。
- 輸入名稱。
- 選取 VCN 。
- 選取在任務 3.2 中建立的子網路。
- 選取使用網路安全群組來控制流量。
- 選取在任務 4.1 中建立的 NSG 。
- 向下捲動。
- 選取自動指派專用 IPv4 位址。
- 按一下儲存變更。
-
請注意,第二個 VNIC 會建立並連附至虛擬工作節點執行處理,以及連附至我們的子網路。
-
使用 SSH 登入執行處理或工作節點。
- 執行
lspci
指令,確認目前所有 VNIC 使用哪個網路驅動程式。 - 請注意, Mellanox Technologies ConnectX 系列使用 mlx5Gen 虛擬功能網路驅動程式。
Mellanox Technologies ConnectX 系列 mlx5Gen 虛擬功能網路驅動程式為 SR-IOV 使用的虛擬功能 (VF) 驅動程式。因此,會針對具有 VF 的 SR-IOV 啟用 VNIC。
- 執行
-
下圖顯示目前已設定的視覺化總覽。
工作 5:指定 IP 位址給具有預設閘道的新第二個 VNIC
現在第二個 VNIC 已經在作業 4 中建立並連附,我們需要為其指定一個 IP 位址。新增第二個介面至執行處理時,您可以將它指定至與第一個介面相同的子網路,或是選擇新的子網路。
第二個介面未啟用 DHCP,因此必須手動指派 IP 位址。
對於第二個介面,有不同的指定 IP 位址的方法。
-
方法 1:使用 Oracle Cloud Infrastructure 命令行介面 (OCI CLI) (
oci-utils
套裝程式),使用 OCI-network-config 命令將 IP 位址指派給 OCI Compute 執行處理的第二個介面。 -
方法 2:使用 OCI CLI (
oci-utils
套裝程式),使用 ocid 協助程式將 IP 位址指派給 OCI Compute 執行處理的第二個介面。 -
方法 3:使用 OCI_Multi_VNIC_Setup 程序檔。
-
方法 4:為
/etc/sysconfig/network-scripts/
資料夾中的新 VNIC 手動建立介面組態檔。
對於所有工作者節點,我們已指派 IP 位址給次要 vNIC (ens5
)。我們使用方法 3 將 IP 位址指定給次要 vNIC (ens5
)。如需有關將 IP 位址指派給第二個 VNIC 的詳細資訊,請參閱 Assign an IP Address to a Second Interface on an Oracle Linux Instance 。
將 IP 位址指定給 VNIC 後,我們需要確認第二個 VNIC 上的 IP 位址是否正確設定。我們也可以驗證是否在所有節點集區工作節點上啟用 SR-IOV。
我們的 OKE 叢集包括:
節點集區 | |
---|---|
NP1 | 1 個工作節點 |
NP2 | 3 x 工作節點 |
我們將驗證所有節點集區中的所有工作節點。
工作 5.1:驗證節點集區 1 中的所有節點 (np1
)
-
在 OKE 叢集中,按一下節點。
-
按一下第一個節點集區 (
np1
)。 -
按一下屬於此節點集區的工作節點。
- 請注意, NIC 連附項類型為 VFIO (這表示此虛擬執行處理工作節點已啟用 SR-IOV)。
- 請注意,系統會為此工作節點建立並附加第二個 VNIC。
工作 5.2:驗證節點集區 2 中的所有節點 (np2
)
-
逐一按一下節點,然後開始驗證。
- 請注意, NIC 連附項類型為 VFIO (這表示此虛擬執行處理工作節點已啟用 SR-IOV)。
- 請注意,系統會為此工作節點建立並附加第二個 VNIC。
-
移至節點集區 2 (
np2
) 摘要頁面。按一下節點集區中的第二個工作節點。- 請注意, NIC 連附項類型為 VFIO (這表示此虛擬執行處理工作節點已啟用 SR-IOV)。
- 請注意,系統會為此工作節點建立並附加第二個 VNIC。
-
移至節點集區 2 (
np2
) 摘要頁面。按一下節點集區中的第三個工作節點。- 請注意, NIC 連附項類型為 VFIO (這表示此虛擬執行處理工作節點已啟用 SR-IOV)。
- 請注意,系統會為此工作節點建立並附加第二個 VNIC。
-
使用 SSH 登入 Kubernetes Operator。
執行
kubectl get nodes
命令以擷取所有工作節點的清單和 IP 位址。[opc@o-sqrtga ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.112.134 Ready node 68d v1.30.1 10.0.66.97 Ready node 68d v1.30.1 10.0.73.242 Ready node 68d v1.30.1 10.0.89.50 Ready node 68d v1.30.1 [opc@o-sqrtga ~]$
-
為了讓您能夠輕鬆地透過 SSH 進入所有工作節點,我們建立了下表。
工作節點名稱 ens3 IP SSH 命令工作節點 cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 10.0.112.134 ssh -i id_rsa opc@10.0.112.134
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 10.0.66.97 ssh -i id_rsa opc@10.0.66.97
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 10.0.73.242 ssh -i id_rsa opc@10.0.73.242
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 10.0.89.50 ssh -i id_rsa opc@10.0.89.50
- 在您可以透過 SSH 連線至所有虛擬工作節點之前,請先確定您有正確的私密金鑰可供使用。
- 在所有工作節點中執行 SSH 的
ssh -i <private key> opc@<ip-address>
命令。
-
在
cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0
工作節點上執行ip a
命令。請注意,順利設定 IP 位址後,
ens5
(第二個 VNIC) 在 SR-IOV 介面的 Task 3.2 中建立的子網路範圍內會有一個 IP 位址。[opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:59:58 brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.112.134/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 85530sec preferred_lft 85530sec inet6 fe80::17ff:fe00:5958/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:d4:a2 brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.30/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::8106:c09e:61fa:1d2a/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 3a:b7:fb:e6:2e:cf brd ff:ff:ff:ff:ff:ff inet 10.244.1.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::38b7:fbff:fee6:2ecf/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether de:35:f5:51:85:5d brd ff:ff:ff:ff:ff:ff inet 10.244.1.1/25 brd 10.244.1.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::dc35:f5ff:fe51:855d/64 scope link valid_lft forever preferred_lft forever 6: veth1cdaac17@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 76:e2:92:ad:37:40 brd ff:ff:ff:ff:ff:ff link-netns 1935ba66-34cc-4468-8abb-f66add46d08b inet6 fe80::74e2:92ff:fead:3740/64 scope link valid_lft forever preferred_lft forever 7: vethbcd391ab@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 9a:9a:0f:d6:48:17 brd ff:ff:ff:ff:ff:ff link-netns 3f02d5fd-596e-4b9f-8a35-35f2f946901b inet6 fe80::989a:fff:fed6:4817/64 scope link valid_lft forever preferred_lft forever 8: vethc15fa705@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3a:d2:c8:66:d1:0b brd ff:ff:ff:ff:ff:ff link-netns f581b7f2-cfa0-46eb-b0aa-37001a11116d inet6 fe80::38d2:c8ff:fe66:d10b/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$
-
在
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1
工作節點上執行ip a
命令。請注意,順利設定 IP 位址後,
ens5
(第二個 VNIC) 在 SR-IOV 介面的 Task 3.2 中建立的子網路範圍內會有一個 IP 位址。[opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:16:ca brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.66.97/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 85859sec preferred_lft 85859sec inet6 fe80::17ff:fe00:16ca/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:7b:4f brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.15/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::87eb:4195:cacf:a6da/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 02:92:e7:f5:8e:29 brd ff:ff:ff:ff:ff:ff inet 10.244.1.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::92:e7ff:fef5:8e29/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether f6:08:06:e2:bc:9d brd ff:ff:ff:ff:ff:ff inet 10.244.1.129/25 brd 10.244.1.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::f408:6ff:fee2:bc9d/64 scope link valid_lft forever preferred_lft forever 6: veth5db97290@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c2:e0:b5:7e:ce:ed brd ff:ff:ff:ff:ff:ff link-netns 3682b5cd-9039-4931-aecc-b50d46dabaf1 inet6 fe80::c0e0:b5ff:fe7e:ceed/64 scope link valid_lft forever preferred_lft forever 7: veth6fd818a5@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3e:a8:7d:84:d3:b9 brd ff:ff:ff:ff:ff:ff link-netns 08141d6b-5ec0-4f3f-a312-a00b30f82ade inet6 fe80::3ca8:7dff:fe84:d3b9/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$
-
在
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0
工作節點上執行ip a
命令。請注意,順利設定 IP 位址後,
ens5
(第二個 VNIC) 在 SR-IOV 介面的 Task 3.2 中建立的子網路範圍內會有一個 IP 位址。[opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:49:9c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.73.242/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 86085sec preferred_lft 86085sec inet6 fe80::17ff:fe00:499c/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:b7:51 brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.14/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::bc31:aa09:4e05:9ab7/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 9a:c7:1b:30:e8:9a brd ff:ff:ff:ff:ff:ff inet 10.244.0.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::98c7:1bff:fe30:e89a/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether 2a:2b:cb:fb:15:82 brd ff:ff:ff:ff:ff:ff inet 10.244.0.1/25 brd 10.244.0.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::282b:cbff:fefb:1582/64 scope link valid_lft forever preferred_lft forever 6: veth06343057@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ca:70:83:13:dc:ed brd ff:ff:ff:ff:ff:ff link-netns fb0f181f-7c3a-4fb6-8bf0-5a65d39486c1 inet6 fe80::c870:83ff:fe13:dced/64 scope link valid_lft forever preferred_lft forever 7: veth8af17165@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c6:a0:be:75:9b:d9 brd ff:ff:ff:ff:ff:ff link-netns c07346e6-33f5-4e80-ba5e-74f7487b5daa inet6 fe80::c4a0:beff:fe75:9bd9/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$
-
在
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2
工作節點上執行ip a
命令。請注意,順利設定 IP 位址後,
ens5
(第二個 VNIC) 在 SR-IOV 介面的 Task 3.2 中建立的子網路範圍內會有一個 IP 位址。[opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:ac:7c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.89.50/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 86327sec preferred_lft 86327sec inet6 fe80::17ff:fe00:ac7c/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:4c:0d brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.16/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::91eb:344e:829e:35de/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether aa:31:9f:d0:b3:3c brd ff:ff:ff:ff:ff:ff inet 10.244.0.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::a831:9fff:fed0:b33c/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether b2:0d:c0:de:02:61 brd ff:ff:ff:ff:ff:ff inet 10.244.0.129/25 brd 10.244.0.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::b00d:c0ff:fede:261/64 scope link valid_lft forever preferred_lft forever 6: vethb37e8987@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 7a:93:1d:2a:33:8c brd ff:ff:ff:ff:ff:ff link-netns ab3262ca-4a80-4b02-a39f-4209d003f148 inet6 fe80::7893:1dff:fe2a:338c/64 scope link valid_lft forever preferred_lft forever 7: veth73a651ce@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ae:e4:97:89:ba:6e brd ff:ff:ff:ff:ff:ff link-netns 9307bfbd-8165-46bf-916c-e1180b6cbd83 inet6 fe80::ace4:97ff:fe89:ba6e/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$
-
我們已驗證第二個 VNIC (
ens5
) 上是否已設定所有 IP 位址,我們可以建立包含該資訊的下列表格。ens3 IP ens3 千瓦 ens5 IP ens5 千瓦 10.0.112.134 10.0.64.1 10.0.3.30/27 10.0.3.1 10.0.66.97 10.0.64.1 10.0.3.15/27 10.0.3.1 10.0.73.242 10.0.64.1 10.0.3.14/27 10.0.3.1 10.0.89.50 10.0.64.1 10.0.3.16/27 10.0.3.1 -
下圖顯示目前已設定的視覺化總覽。
工作 6:在工作節點上安裝 Meta-Plugin CNI (多重 CNI)
Multus CNI 是一個 Kubernetes 容器網路介面 (CNI) 外掛程式,可讓您將多個網路介面附加到 Pod。
Multus CNI 的運作方式
-
作為中繼外掛程式: Multus 不提供網路本身,而是呼叫其他 CNI 外掛程式。
-
建立多個網路介面:每個 Pod 可透過結合多個 CNI 外掛程式 (例如 Flannel、Calico、SR-IOV) 來擁有一個以上的網路介面。
-
使用組態檔:主要網路是使用預設 CNI 來設定,而其他網路則是根據自訂資源定義 (CRD) 來附加。
我們需要多國 CNI
-
多重網路隔離:適用於需要個別管理和資料層的工作負載。
-
高效能網路:使用 SR-IOV 或 DPDK 直接存取硬體。
-
適用於 Pod 的多址機制:支援需要多個網路介面的網路功能虛擬化 (NFV) 和電信業者使用案例。
作業 6.1:使用精簡安裝方法安裝 Multus CNI
-
SSH 進入 Kubernetes Operator。
-
執行下列指令以複製 Multus Git 函式庫。
git clone https://github.com/k8snetworkplumbingwg/multus-cni.git && cd multus-cni
-
執行下列指令,以使用精簡安裝方法安裝 Multus 常駐程式集。
kubectl apply -f deployments/multus-daemonset.yml && cd ..
-
Multus 常駐程式集執行什麼
-
啟動 Multus 常駐程式集,這會在每個節點上執行一個 Pod,將 Multus 二進位檔置於
/opt/cni/bin
中的每個節點上。 -
讀取
/etc/cni/net.d
中的語彙 (依字母順序) 第一個組態檔,然後以/etc/cni/net.d/00-multus.conf
為每個節點上的 Multus 建立一個新的組態檔,這個組態會自動產生,並且以預設網路組態為基礎 (假設第一個組態為字母順序)。 -
在每個節點上建立名為
/etc/cni/net.d/multus.d
的目錄,其中包含 Multus 存取 Kubernetes API 的認證資訊。
工作 6.2:驗證 Multus 安裝
-
執行下列命令 (在 Kubernetes Operator 上) 以驗證是否已在所有工作節點上安裝 Multus 協助程式集。
kubectl get pods --all-namespaces | grep -i multus
-
您也可以驗證工作節點本身是否已安裝 Multus 協助程式集。
- 使用下列命令,將
ssh -i id_rsa opc@10.0.112.134
命令 SSH 執行到工作節點中。 - 使用下列指令執行
cd /etc/cni/net.d/
指令來變更目錄。 - 執行
ls -l
指令,使用下列指令列出目錄輸出。 - 請注意,會列出
00-multus.conf
和multus.d
檔案。
- 執行
sudo more 00-multus.conf
命令以檢視00-multus.conf
檔案的內容。 - 記下
00-multus.conf
檔案的內容。
- 使用下列命令,將
作業 7:將網路介面連附至 Pod
在這項任務中,我們將對應或附加此 VNIC 的容器介面。
若要在 Pod 上附加其他介面,我們需要有連接介面的組態。
-
這會封裝在
NetworkAttachmentDefinition
類型的自訂資源中。 -
此組態基本上是封裝為自訂資源的 CNI 組態。
有數個 CNI 外掛程式可以與 Multus 一起使用以完成此作業。如需詳細資訊,請參閱外掛程式總覽。
-
在此處所述的方法中,目標是專門為單一 Pod 提供 SR-IOV 虛擬功能 (VF),讓 Pod 能夠在不干擾的情況下利用功能,或是在兩者之間提供任何層。
-
若要將 Pod 獨佔存取權授予 VF,我們可以利用主機裝置外掛程式,將介面移到 Pod 的命名空間中,讓它擁有對它的獨佔存取權。如需更多資訊,請參閱 host-device 。
下列範例顯示設定已新增至節點之次要 ens5
介面的 NetworkAttachmentDefinition
物件。
-
ipam
外掛程式配置決定了這些介面的 IP 位址管理方式。 -
在此範例中,由於我們想要使用 OCI 指派給次要介面的相同 IP 位址,因此我們將靜態
ipam
組態與適當的路由搭配使用。 -
ipam
組態也支援其他方法 (例如host-local
或dhcp
),以提供更靈活的組態。
作業 7.1:建立網路附件定義
NetworkAttachmentDefinition
用於設定網路附件,例如 Pod 的次要介面。
設定 NetworkAttachmentDefinition
的方式有兩種:
- 使用 JSON CNI 組態的
NetworkAttachmentDefinition
。 NetworkAttachmentDefinition
(含 CNI 組態檔)。
注意:在本教學課程中,我們將使用 CNI 組態檔來使用此方法。
我們有 4 個工作節點,每個工作節點都有第二個 VNIC,我們將對應至容器 (Pod) 上的介面。
-
執行下列命令,為所有工作節點和對應的 VNIC 建立 CNI 組態檔。
ens3 ens5 名稱 網路 奈米命令 10.0.112.134 10.0.3.30/27 斯里夫族 -1 10.0.3.0/27 sudo nano sriov-vnic-1.yaml
10.0.66.97 10.0.3.15/27 斯里奧夫族 -2 10.0.3.0/27 sudo nano sriov-vnic-2.yaml
10.0.73.242 10.0.3.14/27 斯里奧夫族 -3 10.0.3.0/27 sudo nano sriov-vnic-3.yaml
10.0.89.50 10.0.3.16/27 斯里奧夫族 -4 10.0.3.0/27 sudo nano sriov-vnic-4.yaml
-
在 Kubernetes Operator 上執行下列步驟。使用
sudo nano sriov-vnic-1.yaml
命令為第一個工作節點建立新的 YAML 檔案。-
請確定名稱是唯一且具描述性的。在此範例中,我們使用
sriov-vnic-1
。 -
使用您剛新增之第二個介面卡的 IP 位址 (
ens5
)。 -
請確定
dst network
也正確,這與在任務 3.2 中建立的子網路相同。
sriov-vnic-1.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-1 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.30/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
-
使用
sudo nano sriov-vnic-2.yaml
命令為第二個工作節點建立新的 YAML 檔案。sriov-vnic-2.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-2 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.15/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
使用
sudo nano sriov-vnic-3.yaml
命令為第三個工作節點建立新的 YAML 檔案。sriov-vnic-3.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-3 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.14/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
使用
sudo nano sriov-vnic-4.yaml
命令為第四個工作節點建立新的 YAML 檔案。sriov-vnic-4.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-4 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.16/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
將
NetworkAttachmentDefinition
套用至工作節點。- 執行第一個節點的
kubectl apply -f sriov-vnic-1.yaml
命令。 - 執行第二個節點的
kubectl apply -f sriov-vnic-2.yaml
命令。 - 執行第三個節點的
kubectl apply -f sriov-vnic-3.yaml
命令。 - 執行第四個節點的
kubectl apply -f sriov-vnic-4.yaml
命令。
如果正確套用
NetworkAttachmentDefinition
,您會看到類似輸出的內容。[opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-1.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 created [opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-2.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 created [opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-3.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 created [opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-4.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4 created [opc@o-sqrtga ~]$
- 執行第一個節點的
-
執行
kubectl get network-attachment-definitions.k8s.cni.cncf.io
命令來驗證是否正確套用NetworkAttachmentDefinitions
。[opc@o-sqrtga ~]$ kubectl get network-attachment-definitions.k8s.cni.cncf.io NAME AGE sriov-vnic-1 96s sriov-vnic-2 72s sriov-vnic-3 60s sriov-vnic-4 48s [opc@o-sqrtga ~]$
-
執行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 -o yaml
命令,以取得第一個工作節點套用的NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-1","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.30/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:03:55Z" generation: 1 name: sriov-vnic-1 namespace: default resourceVersion: "22915413" uid: 2d529130-2147-4f49-9d78-4e5aa12aea62 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.30/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
執行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 -o yaml
命令,以取得第二個工作節點套用的NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-2","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.15/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:04:19Z" generation: 1 name: sriov-vnic-2 namespace: default resourceVersion: "22915508" uid: aec5740c-a093-43d3-bd6a-2209ee9e5c96 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.15/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
執行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 -o yaml
命令,以取得適用於第三個工作節點的NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-3","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.14/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:04:31Z" generation: 1 name: sriov-vnic-3 namespace: default resourceVersion: "22915558" uid: 91b970ff-328f-4b6b-a0d8-7cdd07d7bca3 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.14/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
執行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4 -o yaml
命令,以取得第四個工作節點套用的NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-4","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.16/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:04:43Z" generation: 1 name: sriov-vnic-4 namespace: default resourceVersion: "22915607" uid: 383fd3f0-7e5e-46ec-9997-29cbc9a2dcea spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.16/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }' [opc@o-sqrtga ~]$
-
下圖顯示目前已設定的視覺化總覽。
作業 7.2:使用連附的 NetworkDefinitionAttachment
建立 Pod
在這項任務中,我們會將 NetworkAttachmentDefinitions
與實際的容器或 Pod 連結。
在下表中,我們已針對要代管哪些工作節點的 Pod 建立對應。
職工 (主要) 節點 IP | ens5 | 名稱 | POD 名稱 | 已完成 |
---|---|---|---|---|
10.0.112.134 | 10.0.3.30/27 | 斯里夫族 -1 | testpod1 | 是 |
10.0.66.97 | 10.0.3.15/27 | 斯里奧夫族 -2 | testpod2 | 是 |
10.0.73.242 | 10.0.3.14/27 | 斯里奧夫族 -3 | testpod3 | 是 |
10.0.89.50 | 10.0.3.16/27 | 斯里奧夫族 -4 | testpod4 | 是 |
作業 7.3:使用節點相關性建立 Pod
Kubernetes 預設會決定 Pod 的放置位置 (工作節點)。在本範例中,這是不可能的,因為 NetworkAttachmentDefinition
連結到 IP 位址,且此 IP 位址連結到 VNIC,且此 VNIC 連結到特定的工作節點。因此,我們需要確定我們建立的 Pod 會結束在想要的工作節點上,當我們將 NetworkAttachmentDefinition
附加至 Pod 時,這是必要的。
如果我們沒有這樣做,則 Pod 可能會在 Pod 可用的 IP 位址所在的不同位置結束。因此,Pod 將無法使用啟用 SR-IOV 的介面進行通訊。
-
使用
kubectl get nodes
命令取得所有可用的節點。[opc@o-sqrtga ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.112.134 Ready node 68d v1.30.1 10.0.66.97 Ready node 68d v1.30.1 10.0.73.242 Ready node 68d v1.30.1 10.0.89.50 Ready node 68d v1.30.1 [opc@o-sqrtga ~]$
- 使用
kubectl label node 10.0.112.134 node_type=testpod1
命令將標籤指派給工作節點 1。 - 使用
kubectl label node 10.0.66.97 node_type=testpod2
命令將標籤指派給工作節點 2。 - 使用
kubectl label node 10.0.73.242 node_type=testpod3
命令將標籤指派給工作節點 3。 - 使用
kubectl label node 10.0.89.50 node_type=testpod4
命令將標籤指派給工作節點 4。
[opc@o-sqrtga ~]$ kubectl label node 10.0.112.134 node_type=testpod1 node/10.0.112.134 labeled [opc@o-sqrtga ~]$ kubectl label node 10.0.73.242 node_type=testpod3 node/10.0.73.242 labeled [opc@o-sqrtga ~]$ kubectl label node 10.0.66.97 node_type=testpod2 node/10.0.66.97 labeled [opc@o-sqrtga ~]$ kubectl label node 10.0.89.50 node_type=testpod4 node/10.0.89.50 labeled [opc@o-sqrtga ~]$
- 使用
-
下圖顯示目前已設定的視覺化總覽。
-
使用
sudo nano testpod1-v2.yaml
命令建立testpod1
的 YAML 檔案。-
請注意,我們將先前建立的
NetworkAttachmentDefinition
(sriov-vnic-1
) 連結至此測試 Pod 的annotations
區段。 -
請注意
spec:affinity:nodeAffinity
區段,其中我們會將測試 Pod 連結至標籤為testpod1
的特定工作節點。
sudo nano testpod1-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod1 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-1 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod1 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
-
-
使用
sudo nano testpod2-v2.yaml
命令建立testpod2
的 YAML 檔案。-
請注意,我們將先前建立的
NetworkAttachmentDefinition
(sriov-vnic-2
) 連結至此測試 Pod 的annotations
區段。 -
請注意
spec:affinity:nodeAffinity
區段,其中我們會將測試 Pod 連結至標籤為testpod2
的特定工作節點。
sudo nano testpod2-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod2 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod2 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
-
-
使用
sudo nano testpod3-v2.yaml
命令建立testpod3
的 YAML 檔案。-
請注意,我們將先前建立的
NetworkAttachmentDefinition
(sriov-vnic-3
) 連結至此測試 Pod 的annotations
區段。 -
請注意
spec:affinity:nodeAffinity
區段,其中我們會將測試 Pod 連結至標籤為testpod3
的特定工作節點。
sudo nano testpod3-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod3 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-3 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod3 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
-
-
使用
sudo nano testpod4-v2.yaml
命令建立testpod4
的 YAML 檔案。-
請注意,我們將先前建立的
NetworkAttachmentDefinition
(sriov-vnic-4
) 連結至此測試 Pod 的annotations
區段。 -
請注意,我們會將測試 Pod 連結至標籤為
testpod4
之特定工作節點的spec:affinity:nodeAffinity
區段
sudo nano testpod4-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod4 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-4 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod4 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
- 使用
kubectl apply -f testpod1-v2.yaml
命令套用 YAML 檔案來建立testpod1
。 - 使用
kubectl apply -f testpod2-v2.yaml
命令套用 YAML 檔案來建立testpod2
。 - 使用
kubectl apply -f testpod3-v2.yaml
命令套用 YAML 檔案來建立testpod3
。 - 使用
kubectl apply -f testpod4-v2.yaml
命令套用 YAML 檔案來建立testpod4
。
[opc@o-sqrtga ~]$ kubectl apply -f testpod1-v2.yaml pod/testpod1 created [opc@o-sqrtga ~]$ kubectl apply -f testpod2-v2.yaml pod/testpod2 created [opc@o-sqrtga ~]$ kubectl apply -f testpod3-v2.yaml pod/testpod3 created [opc@o-sqrtga ~]$ kubectl apply -f testpod4-v2.yaml pod/testpod4 created [opc@o-sqrtga ~]$
-
-
驗證是否使用
kubectl get pod
命令建立測試 Pod。請注意,所有測試 Pod 都會建立並具有Running
STATUS 。[opc@o-sqrtga ~]$ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-576c6b7b6-6fn6f 1/1 Running 3 40d my-nginx-576c6b7b6-k9wwc 1/1 Running 3 40d my-nginx-576c6b7b6-z8xkd 1/1 Running 6 40d mysql-6d7f5d5944-dlm78 1/1 Running 12 35d testpod1 1/1 Running 0 2m29s testpod2 1/1 Running 0 2m17s testpod3 1/1 Running 0 2m5s testpod4 1/1 Running 0 111s [opc@o-sqrtga ~]$
-
使用
kubectl get pod testpod1 -o wide
命令,確認testpod1
是否在標籤為testpod1
的工作節點10.0.112.134
上執行。[opc@o-sqrtga ~]$ kubectl get pod testpod1 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod1 1/1 Running 0 3m41s 10.244.1.6 10.0.112.134 <none> <none>
-
使用
kubectl get pod testpod2 -o wide
命令,確認testpod2
是否在標籤為testpod2
的工作節點10.0.66.97
上執行。[opc@o-sqrtga ~]$ kubectl get pod testpod2 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod2 1/1 Running 0 3m33s 10.244.1.133 10.0.66.97 <none> <none>
-
使用
kubectl get pod testpod3 -o wide
命令,確認testpod3
是否在標籤為testpod3
的工作節點10.0.73.242
上執行。[opc@o-sqrtga ~]$ kubectl get pod testpod3 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod3 1/1 Running 0 3m25s 10.244.0.5 10.0.73.242 <none> <none>
-
使用
kubectl get pod testpod4 -o wide
命令,確認testpod4
是否在標籤為testpod4
的工作節點10.0.89.50
上執行。[opc@o-sqrtga ~]$ kubectl get pod testpod4 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod4 1/1 Running 0 3m22s 10.244.0.133 10.0.89.50 <none> <none>
-
下圖顯示目前已設定的視覺化總覽。
作業 7.4:驗證測試 Pod 上的 IP 位址
-
使用
kubectl exec -it testpod1 -- ip addr show
命令,驗證net1
Pod 介面的testpod1
IP 位址。請注意,
net1
介面的 IP 位址為10.0.3.30/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> 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: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether ca:28:e4:5f:66:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.0.132/25 brd 10.244.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::c828:e4ff:fe5f:66c4/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:4c:0d brd ff:ff:ff:ff:ff:ff inet 10.0.3.30/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:4c0d/64 scope link valid_lft forever preferred_lft forever
-
使用
kubectl exec -it testpod2 -- ip addr show
命令,驗證net1
Pod 介面的testpod2
IP 位址。請注意,
net1
介面的 IP 位址為10.0.3.15/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod2 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> 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: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether da:ce:84:22:fc:29 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.1.132/25 brd 10.244.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::d8ce:84ff:fe22:fc29/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:7b:4f brd ff:ff:ff:ff:ff:ff inet 10.0.3.15/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:7b4f/64 scope link valid_lft forever preferred_lft forever
-
使用
kubectl exec -it testpod3 -- ip addr show
命令,驗證net1
Pod 介面的testpod3
IP 位址。請注意,
net1
介面的 IP 位址為10.0.3.14/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod3 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> 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: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether de:f2:81:10:04:b2 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.0.4/25 brd 10.244.0.127 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::dcf2:81ff:fe10:4b2/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:b7:51 brd ff:ff:ff:ff:ff:ff inet 10.0.3.14/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:b751/64 scope link valid_lft forever preferred_lft forever
-
使用
kubectl exec -it testpod4 -- ip addr show
命令,驗證net1
Pod 介面的testpod4
IP 位址。請注意,
net1
介面的 IP 位址為10.0.3.16/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod4 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> 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: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether ea:63:eb:57:9c:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.1.5/25 brd 10.244.1.127 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::e863:ebff:fe57:9c99/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:d4:a2 brd ff:ff:ff:ff:ff:ff inet 10.0.3.16/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:d4a2/64 scope link valid_lft forever preferred_lft forever [opc@o-sqrtga ~]$
-
下表概述所有測試 Pod 之
net1
介面的所有 IP 位址。POD 名稱 net1 IP testpod1 10.0.3.30/27 testpod2 10.0.3.15/27 testpod3 10.0.3.14/27 testpod4 10.0.3.16/27 注意:這些 IP 位址的範圍與在「工作 3」中建立的 OCI 子網路相同,以放置啟用 SR-IOV 的 VNIC。
工作 7.5:驗證工作節點上的 IP 位址
-
現在測試 Pod
net1
介面具有 IP 位址,請注意,此 IP 位址是用來作為工作節點上ens5
介面的 IP 位址。此 IP 位址現在會從ens5
工作節點介面移至net1
測試 Pod 介面。 -
使用
ssh -i id_rsa opc@10.0.112.134
命令進入第一個工作節點的 SSH。-
使用
ip a
指令取得所有介面的 IP 位址。 -
請注意,已從工作節點移除
ens5
介面。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.112.134 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 20:42:19 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:59:58 brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.112.134/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82180sec preferred_lft 82180sec inet6 fe80::17ff:fe00:5958/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 3a:b7:fb:e6:2e:cf brd ff:ff:ff:ff:ff:ff inet 10.244.1.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::38b7:fbff:fee6:2ecf/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether de:35:f5:51:85:5d brd ff:ff:ff:ff:ff:ff inet 10.244.1.1/25 brd 10.244.1.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::dc35:f5ff:fe51:855d/64 scope link valid_lft forever preferred_lft forever 6: veth1cdaac17@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 76:e2:92:ad:37:40 brd ff:ff:ff:ff:ff:ff link-netns 1935ba66-34cc-4468-8abb-f66add46d08b inet6 fe80::74e2:92ff:fead:3740/64 scope link valid_lft forever preferred_lft forever 7: vethbcd391ab@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 9a:9a:0f:d6:48:17 brd ff:ff:ff:ff:ff:ff link-netns 3f02d5fd-596e-4b9f-8a35-35f2f946901b inet6 fe80::989a:fff:fed6:4817/64 scope link valid_lft forever preferred_lft forever 8: vethc15fa705@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3a:d2:c8:66:d1:0b brd ff:ff:ff:ff:ff:ff link-netns f581b7f2-cfa0-46eb-b0aa-37001a11116d inet6 fe80::38d2:c8ff:fe66:d10b/64 scope link valid_lft forever preferred_lft forever 9: vethc663e496@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 7e:0b:bb:5d:49:8c brd ff:ff:ff:ff:ff:ff link-netns d3993135-0f2f-4b06-b16d-31d659f8230d inet6 fe80::7c0b:bbff:fe5d:498c/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$ exit logout Connection to 10.0.112.134 closed.
-
-
使用
ssh -i id_rsa opc@10.0.66.97
命令進入第二個工作節點的 SSH。-
使用
ip a
指令取得所有介面的 IP 位址。 -
請注意,已從工作節點移除
ens5
介面。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.66.97 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 19:47:55 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:16:ca brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.66.97/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82502sec preferred_lft 82502sec inet6 fe80::17ff:fe00:16ca/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 02:92:e7:f5:8e:29 brd ff:ff:ff:ff:ff:ff inet 10.244.1.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::92:e7ff:fef5:8e29/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether f6:08:06:e2:bc:9d brd ff:ff:ff:ff:ff:ff inet 10.244.1.129/25 brd 10.244.1.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::f408:6ff:fee2:bc9d/64 scope link valid_lft forever preferred_lft forever 6: veth5db97290@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c2:e0:b5:7e:ce:ed brd ff:ff:ff:ff:ff:ff link-netns 3682b5cd-9039-4931-aecc-b50d46dabaf1 inet6 fe80::c0e0:b5ff:fe7e:ceed/64 scope link valid_lft forever preferred_lft forever 7: veth6fd818a5@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3e:a8:7d:84:d3:b9 brd ff:ff:ff:ff:ff:ff link-netns 08141d6b-5ec0-4f3f-a312-a00b30f82ade inet6 fe80::3ca8:7dff:fe84:d3b9/64 scope link valid_lft forever preferred_lft forever 8: veth26f6b686@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ae:bf:36:ca:52:cf brd ff:ff:ff:ff:ff:ff link-netns f533714a-69be-4b20-be30-30ba71494f7a inet6 fe80::acbf:36ff:feca:52cf/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$ exit logout Connection to 10.0.66.97 closed.
-
-
使用
ssh -i id_rsa opc@10.0.73.242
命令登入第三個工作節點。-
使用
ip a
指令取得所有介面的 IP 位址。 -
請注意,已從工作節點移除
ens5
介面。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.73.242 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 20:08:31 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:49:9c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.73.242/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82733sec preferred_lft 82733sec inet6 fe80::17ff:fe00:499c/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 9a:c7:1b:30:e8:9a brd ff:ff:ff:ff:ff:ff inet 10.244.0.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::98c7:1bff:fe30:e89a/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether 2a:2b:cb:fb:15:82 brd ff:ff:ff:ff:ff:ff inet 10.244.0.1/25 brd 10.244.0.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::282b:cbff:fefb:1582/64 scope link valid_lft forever preferred_lft forever 6: veth06343057@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ca:70:83:13:dc:ed brd ff:ff:ff:ff:ff:ff link-netns fb0f181f-7c3a-4fb6-8bf0-5a65d39486c1 inet6 fe80::c870:83ff:fe13:dced/64 scope link valid_lft forever preferred_lft forever 7: veth8af17165@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c6:a0:be:75:9b:d9 brd ff:ff:ff:ff:ff:ff link-netns c07346e6-33f5-4e80-ba5e-74f7487b5daa inet6 fe80::c4a0:beff:fe75:9bd9/64 scope link valid_lft forever preferred_lft forever 8: veth170b8774@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether e6:c9:42:60:8f:e7 brd ff:ff:ff:ff:ff:ff link-netns edef0c81-0477-43fa-b260-6b81626e7d87 inet6 fe80::e4c9:42ff:fe60:8fe7/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$ exit logout Connection to 10.0.73.242 closed.
-
-
使用
ssh -i id_rsa opc@10.0.89.50
命令登入第四個工作節點。-
使用
ip a
指令取得所有介面的 IP 位址。 -
請注意,已從工作節點移除
ens5
介面。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.89.50 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 19:49:27 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:ac:7c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.89.50/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82976sec preferred_lft 82976sec inet6 fe80::17ff:fe00:ac7c/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether aa:31:9f:d0:b3:3c brd ff:ff:ff:ff:ff:ff inet 10.244.0.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::a831:9fff:fed0:b33c/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether b2:0d:c0:de:02:61 brd ff:ff:ff:ff:ff:ff inet 10.244.0.129/25 brd 10.244.0.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::b00d:c0ff:fede:261/64 scope link valid_lft forever preferred_lft forever 6: vethb37e8987@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 7a:93:1d:2a:33:8c brd ff:ff:ff:ff:ff:ff link-netns ab3262ca-4a80-4b02-a39f-4209d003f148 inet6 fe80::7893:1dff:fe2a:338c/64 scope link valid_lft forever preferred_lft forever 7: veth73a651ce@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ae:e4:97:89:ba:6e brd ff:ff:ff:ff:ff:ff link-netns 9307bfbd-8165-46bf-916c-e1180b6cbd83 inet6 fe80::ace4:97ff:fe89:ba6e/64 scope link valid_lft forever preferred_lft forever 8: veth42c3a604@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether f2:e6:ba:72:8f:b2 brd ff:ff:ff:ff:ff:ff link-netns a7eb561c-8182-49b2-9e43-7c52845620a7 inet6 fe80::f0e6:baff:fe72:8fb2/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$ exit logout Connection to 10.0.89.50 closed. [opc@o-sqrtga ~]$
-
-
下圖顯示目前已設定的視覺化總覽。
作業 8:在多個 Pod 之間執行偵測測試
所有 Pod 都具有來自 OCI 子網路的 IP 位址,而 OCI 子網路中已連附啟用 SR-IOV 的 VNIC,我們可以進行一些 ping 測試來驗證網路連線是否正常運作。
-
下表提供從 Kubernetes Operator 連線至測試 Pod 的命令。
我們需要在每個 Pod 中進行
exec
,才能執行偵測測試或查看路由表。ens3 net1 名稱 POD 名稱 command - 命令 10.0.112.134 10.0.3.30/27 斯里夫族 -1 testpod1 kubectl exec -it testpod1 -- /bin/bash
10.0.66.97 10.0.3.15/27 斯里奧夫族 -2 testpod2 kubectl exec -it testpod2 -- /bin/bash
10.0.73.242 10.0.3.14/27 斯里奧夫族 -3 testpod3 kubectl exec -it testpod3 -- /bin/bash
10.0.89.50 10.0.3.16/27 斯里奧夫族 -4 testpod4 kubectl exec -it testpod4 -- /bin/bash
-
執行
kubectl exec -it testpod1 -- route -n
命令,直接從testpod1
的 Kubernetes Operator 終端機查看路由表。請注意,
testpod1
的路由表具有eth0
的預設閘道,而net1
則是我們的 SR-IOV 啟用的介面。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.0.129 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 10.244.0.129 255.255.0.0 UG 0 0 0 eth0 10.244.0.128 0.0.0.0 255.255.255.128 U 0 0 0 eth0
-
執行
kubectl exec -it testpod2 -- route -n
命令,直接從testpod2
的 Kubernetes Operator 終端機查看路由表。請注意,
testpod2
的路由表具有eth0
的預設閘道,而net1
則是我們的 SR-IOV 啟用的介面。[opc@o-sqrtga ~]$ kubectl exec -it testpod2 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.1.129 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 10.244.1.129 255.255.0.0 UG 0 0 0 eth0 10.244.1.128 0.0.0.0 255.255.255.128 U 0 0 0 eth0
-
執行
kubectl exec -it testpod3 -- route -n
命令,直接從testpod3
的 Kubernetes Operator 終端機查看路由表。請注意,
testpod3
的路由表具有eth0
的預設閘道,而net1
則是我們的 SR-IOV 啟用的介面。[opc@o-sqrtga ~]$ kubectl exec -it testpod3 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.0.1 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 0.0.0.0 255.255.255.128 U 0 0 0 eth0 10.244.0.0 10.244.0.1 255.255.0.0 UG 0 0 0 eth0
-
執行
kubectl exec -it testpod4 -- route -n
命令,直接從testpod4
的 Kubernetes Operator 終端機查看路由表。請注意,
testpod4
的路由表具有eth0
的預設閘道,而net1
則是我們的 SR-IOV 啟用的介面。[opc@o-sqrtga ~]$ kubectl exec -it testpod4 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.1.1 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 10.244.1.1 255.255.0.0 UG 0 0 0 eth0 10.244.1.0 0.0.0.0 255.255.255.128 U 0 0 0 eth0 [opc@o-sqrtga ~]$
-
若要直接從測試 Pod 執行 Kubernetes Operator 的偵測測試,我們需要 ping 命令。
下表提供了所有測試 Pod 的所有 ping 命令。此命令會從特定測試 Pod 偵測至所有其他測試 Pod (包括其
net1
IP 位址)。來源 Pod 名稱 command - 命令 testpod1 kubectl exec -it testpod1 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod1 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod1 -- ping -I net1 10.0.3.14 -c 4
kubectl exec -it testpod1 -- ping -I net1 10.0.3.16 -c 4
testpod2 kubectl exec -it testpod2 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod2 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod2 -- ping -I net1 10.0.3.14 -c 4
kubectl exec -it testpod2 -- ping -I net1 10.0.3.16 -c 4
testpod3 kubectl exec -it testpod3 -- ping -I net1 10.0.3.14 -c 4
kubectl exec -it testpod3 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod3 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod3 -- ping -I net1 10.0.3.16 -c 4
testpod4 kubectl exec -it testpod4 -- ping -I net1 10.0.3.16 -c 4
kubectl exec -it testpod4 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod4 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod4 -- ping -I net1 10.0.3.14 -c 4
注意:在此範例中,我們使用
testpod1
來偵測所有其他測試 Podnet1
IP 位址。
-
執行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.30 -c 4
命令,從testpod1
偵測至testpod1
。請注意,偵測具有
4 packets transmitted, 4 received, 0% packet loss
。因此 ping 成功。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.30 -c 4 PING 10.0.3.30 (10.0.3.30) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.30: icmp_seq=1 ttl=64 time=0.043 ms 64 bytes from 10.0.3.30: icmp_seq=2 ttl=64 time=0.024 ms 64 bytes from 10.0.3.30: icmp_seq=3 ttl=64 time=0.037 ms 64 bytes from 10.0.3.30: icmp_seq=4 ttl=64 time=0.026 ms --- 10.0.3.30 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3087ms rtt min/avg/max/mdev = 0.024/0.032/0.043/0.009 ms
-
執行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.15 -c 4
命令,從testpod1
偵測至testpod2
。請注意,偵測具有
4 packets transmitted, 4 received, 0% packet loss
。因此 ping 成功。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.15 -c 4 PING 10.0.3.15 (10.0.3.15) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.15: icmp_seq=1 ttl=64 time=0.383 ms 64 bytes from 10.0.3.15: icmp_seq=2 ttl=64 time=0.113 ms 64 bytes from 10.0.3.15: icmp_seq=3 ttl=64 time=0.114 ms 64 bytes from 10.0.3.15: icmp_seq=4 ttl=64 time=0.101 ms --- 10.0.3.15 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3109ms rtt min/avg/max/mdev = 0.101/0.177/0.383/0.119 ms
-
執行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.14 -c 4
命令,從testpod1
偵測至testpod3
。請注意,偵測具有
4 packets transmitted, 4 received, 0% packet loss
。因此 ping 成功。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.14 -c 4 PING 10.0.3.14 (10.0.3.14) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.14: icmp_seq=1 ttl=64 time=0.399 ms 64 bytes from 10.0.3.14: icmp_seq=2 ttl=64 time=0.100 ms 64 bytes from 10.0.3.14: icmp_seq=3 ttl=64 time=0.130 ms 64 bytes from 10.0.3.14: icmp_seq=4 ttl=64 time=0.124 ms --- 10.0.3.14 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3057ms rtt min/avg/max/mdev = 0.100/0.188/0.399/0.122 ms
-
執行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.16 -c 4
命令,從testpod1
偵測至testpod4
。請注意,偵測具有
4 packets transmitted, 4 received, 0% packet loss
。因此 ping 成功。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.16 -c 4 PING 10.0.3.16 (10.0.3.16) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.16: icmp_seq=1 ttl=64 time=0.369 ms 64 bytes from 10.0.3.16: icmp_seq=2 ttl=64 time=0.154 ms 64 bytes from 10.0.3.16: icmp_seq=3 ttl=64 time=0.155 ms 64 bytes from 10.0.3.16: icmp_seq=4 ttl=64 time=0.163 ms --- 10.0.3.16 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3110ms rtt min/avg/max/mdev = 0.154/0.210/0.369/0.092 ms [opc@o-sqrtga ~]$
備註:我們尚未包含所有其他測試 Pod 的所有其他偵測輸出,但您有該想法。
-
下圖顯示目前已設定的視覺化總覽。
工作 9:( 選擇性 ) 建置具有多個介面的 Pod
到目前為止,我們只準備了一個 VNIC (支援 SR-IOV 時會發生此情況),並將此 VNIC 移入 Pod。我們已經為四個不同的測試 Pod 做了這一點。
現在,如果我們想要在特定 Pod 中新增或移動更多 VNIC,該怎麼辦?您必須重複下列步驟:
- 建立新的 OCI 子網路。
- 建立新的 VNIC 並指定 IP 位址。
- 建立新的
NetworkAttachmentDefinitions
。 - 新增註解以更新測試 Pod YAML 檔案。
在這項任務中,您會發現一個範例,其中我們將建立額外的子網路 VNIC、指派 IP 位址 NetworkAttachmentDefinition
,並將其新增至建立 testpod1
的 Pod YAML 檔案。
-
這是網路
10.0.4.0/27
上 IP 位址為10.0.4.29/27
之新介面ens6
的NetworkAttachmentDefinition
。請注意,這是網路
10.0.3.0/27
上 IP 位址為10.0.3.30/27
之介面ens5
之前的另一個NetworkAttachmentDefinition
。sriov-vnic-2-new.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-2-new spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens6", "ipam": { "type": "static", "addresses": [ { "address": "10.0.4.29/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.4.0/27", "gw": "0.0.0.0" } ] } }'
-
這是
testpod1
的 (更新的) YAML 檔案。請注意
annotations
中有參考新NetworkAttachmentDefinition
;sriov-vnic-2-new
的其他行。sudo nano testpod1-v3.yaml apiVersion: v1 kind: Pod metadata: name: testpod1 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-1 k8s.v1.cni.cncf.io/networks: sriov-vnic-2-new spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod1 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
工作 10:移除所有 Pod 部署和 NetworkAttachmentDefinitions
若要重新開始或使用 NetworkAttachmentDefinitions
清除容器,請依照下列步驟進行:
-
使用
kubectl get pod
命令取得所有 Pod。[opc@o-sqrtga ~]$ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-576c6b7b6-6fn6f 1/1 Running 3 105d my-nginx-576c6b7b6-k9wwc 1/1 Running 3 105d my-nginx-576c6b7b6-z8xkd 1/1 Running 6 105d mysql-6d7f5d5944-dlm78 1/1 Running 12 100d testpod1 1/1 Running 0 64d testpod2 1/1 Running 0 64d testpod3 1/1 Running 0 64d testpod4 1/1 Running 0 64d [opc@o-sqrtga ~]$
-
使用下列命令刪除測試 Pod。
kubectl delete -f testpod1-v2.yaml kubectl delete -f testpod2-v2.yaml kubectl delete -f testpod3-v2.yaml kubectl delete -f testpod4-v2.yaml
-
使用
kubectl get network-attachment-definitions.k8s.cni.cncf.io
命令取得所有NetworkAttachmentDefinitions
。[opc@o-sqrtga ~]$ kubectl get network-attachment-definitions.k8s.cni.cncf.io NAME AGE sriov-vnic-1 64d sriov-vnic-2 64d sriov-vnic-3 64d sriov-vnic-4 64d [opc@o-sqrtga ~]$
-
使用下列指令刪除
NetworkAttachmentDefinitions
。kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4
相關連結
確認
- 作者 - Iwan Hoogendoorn (OCI 網路專家)
其他學習資源
在 docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Deploy SR-IOV Enabled Network Interfaces Container Apps on OKE Using Multus CNI Plugin
G28062-02
Copyright ©2025, Oracle and/or its affiliates.