Whereabouts 是 IP 位址管理 (IPAM) CNI 外掛程式,可跨叢集中的所有節點動態指派 IP 位址給 Pod。不同於其他 IPAM 外掛程式 (例如 host-local
) 僅指派 IP 位址給同一節點上的 Pod,whereabouts
指派叢集範圍的 IP 位址。
在本主題中,我們說明如何將次要網路介面連結到 Pod,而指派給該 Pod 的 IP 位址在您使用 whereabouts
指定的範圍內。例如,您會有 Antrea 或 Calico 作為主要 CNI、使用 macvlan 或 ipvlan 建立的次要介面,以及 Whereabouts 作為 IPAM CNI。
kubectl
,如安裝 Tanzu CLI 和其他工具中所述。large
或 extra-large
的工作負載叢集工作節點,如預定義的節點大小中所述。若要在工作負載叢集上安裝 Whereabouts 套件,並將叢集設定為使用該套件,請執行以下動作:
設定和安裝 Whereabouts。
建立組態檔來擷取 Whereabouts 參數。
tanzu package available get whereabouts.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
附註部署
whereabouts
元件的命名空間必須為kube-system
。任何自訂的命名空間安裝都將失敗。
其中,PACKAGE-VERSION
是您要安裝的 Whereabouts 套件版本,FILE-PATH
是用來儲存組態檔的位置,例如,whereabouts-data-values.yaml
。上面的命令建立名為 whereabouts-data-values.yaml
的組態檔,其中包含預設值。
執行 tanzu package available list
命令以列出可用的 Whereabouts 套件版本,例如:
tanzu package available list whereabouts.tanzu.vmware.com -A
NAME VERSION RELEASED-AT NAMESPACE
whereabouts.tanzu.vmware.com 0.5.1+vmware.2-tkg.1 2022-30-04 18:00:00 +0000 UTC tanzu-package-repo-global
附註如果在網路受限環境中操作,請確保可以存取自訂映像登錄。
執行 tanzu package available get
命令搭配 --values-schema
,以查看可設定哪些欄位值:
tanzu package available get whereabouts.tanzu.vmware.com/VERSION --values-schema -o FORMAT
其中:- VERSION
是 tanzu package available list
輸出中列出的版本 - FORMAT
為 yaml
或 json
在 whereabouts-data-values.yaml
組態檔中填入所需的欄位值。
從 whereabouts-data-values.yaml
檔案中移除所有註解:
yq -i eval '... comments=""' whereabouts-cni-default-values.yaml
執行 tanzu package install
以安裝套件。
tanzu package install whereabouts --package whereabouts.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file whereabouts-data-values.yaml --namespace TARGET-NAMESPACE
其中:
TARGET-NAMESPACE
是要在其中安裝 Whereabouts 軟體包的命名空間。例如,my-packages
或 tanzu-cli-managed-packages
命名空間。
--namespace
旗標,則 Tanzu CLI 會在 default
命名空間中安裝套件。kubectl create namespace my-packages
。AVAILABLE-PACKAGE-VERSION
是您在上方所擷取的版本,例如 0.5.1+vmware.2-tkg.1
。執行 tanzu package installed get
以檢查已安裝的套件狀態。
tanzu package installed get whereabouts -o <json|yaml|table>
為 NetworkAttachmentDefinition
建立自訂資源定義 (CRD),針對以 Whereabouts 為 IPAM 類型的 Multus CNI 所使用的網路介面定義 CNI 組態。
建立 CRD 規格。例如,此 multus-cni-crd.yaml
指定名為 macvlan-conf
的 NetworkAttachmentDefinition
,其中設定 macvlan
CNI 並以 whereabouts
為 IPAM 類型:
---
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
spec:
config: '{
"cniVersion": "0.3.1",
"plugins": [
{
"type": "macvlan",
"capabilities": { "ips": true },
"master": "eth0",
"mode": "bridge",
"ipam": {
"type": "whereabouts",
"range": "192.168.20.0/24",
"range_start": "192.168.20.10",
"range_end": "192.168.20.100",
"gateway": "192.168.20.1"
}
} ]
}'
建立資源,例如 kubectl create -f multus-cni-crd.yaml
建立含有註解 k8s.v1.cni.cncf.io/networks
的 Pod,以指定要新增的其他網路。
建立網繭規格,例如 my-multi-cni-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: pod0
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
containers:
- name: pod0
command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
image: docker.io/kserving/tools:latest
建立網繭。例如,kubectl create -f my-multi-cni-crd.yaml
建立網繭 pod0
。
建立的網繭會有三個網路介面:
lo
回送介面eth0
由 Antrea 或 Calico CNI 管理的預設網繭網路net1
透過註解 k8s.v1.cni.cncf.io/networks: macvlan-conf
建立的新介面。附註預設網路的名稱為
eth0
,其他網路網繭介面的名稱為net1
、net2
等。
在 pod0
上執行 kubectl describe pod
,並確認註解 k8s.v1.cni.cncf.io/network-status
列出所有網路介面。
例如:
$ kubectl describe pod pod0
Name: pod0
Namespace: default
Priority: 0
Node: tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
Start Time: Thu, 25 August 2022 15:31:20 +0000
Labels: <none>
Annotations: k8s.v1.cni.cncf.io/network-status:
[{
"name": "",
"interface": "eth0",
"ips": [
"100.96.1.80"
],
"mac": "66:39:dc:63:50:a3",
"default": true,
"dns": {}
},{
"name": "default/macvlan-conf",
"interface": "net1",
"ips": [
"192.168.20.11"
],
"mac": "02:77:cb:a0:60:e3",
"dns": {}
}]
k8s.v1.cni.cncf.io/networks: macvlan-conf
然後,執行 kubectl exec sample-pod -- ip a show dev net1
,以檢查目標介面是否以上面註解列出的 IP 啟動並執行。針對將在下一步建立的其他網繭,重複此步驟以驗證組態。
建立兩個額外的網繭:pod1
在同一節點上,pod2
在另一個節點上。我們將使用這些網繭驗證單一節點內和整個叢集的節點之間的網路存取。
現在,您可以檢查同一節點中的網繭和整個叢集的網繭之間的網路存取。
驗證同一節點上的網繭之間的網路存取是否正常運作。例如,以下命令驗證 pod0
是否可以透過指派的 IP 位址連線到 pod1
。
kubectl exec -it pod0 -- ping -c 3 192.168.20.12
PING 192.168.20.12 (192.168.20.12) 56(84) bytes of data.
64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.237 ms
64 bytes from 192.168.20.12: icmp_seq=2 ttl=64 time=0.215 ms
64 bytes from 192.168.20.12: icmp_seq=3 ttl=64 time=0.156 ms
--- 192.168.20.12 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.156/0.202/0.237/0.037 ms
驗證不同節點上的網繭之間的網路存取是否正常運作。例如,以下命令驗證 pod0
是否可以透過指派的 IP 位址連線到 pod2
。
kubectl exec -it pod0 -- ping -c 3 <192.168.20.13
PING 192.168.20.13 (192.168.20.13) 56(84) bytes of data.
64 bytes from 192.168.20.13: icmp_seq=1 ttl=64 time=0.799 ms
64 bytes from 192.168.20.13: icmp_seq=2 ttl=64 time=0.626 ms
64 bytes from 192.168.20.13: icmp_seq=3 ttl=64 time=0.655 ms
--- 192.168.20.13 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.626/0.693/0.799/0.078 ms