Whereabouts 是一个 IP 地址管理(IP Address Management,IPAM)CNI 插件,可跨集群中的所有节点为 Pod 动态分配 IP 地址。与仅将 IP 地址分配给同一节点上的 Pod 的其他 IPAM 插件(如 host-local
)相比,whereabouts
可在集群范围内分配 IP 地址。
在本主题中,我们将展示如何将辅助网络接口连接到使用 whereabouts
指定的范围内分配的 IP 地址的 Pod。例如,可将 Antrea 或 Calico 作为主 CNI,将使用 macvlan 或 ipvlan 和 Whereabouts 创建的辅助接口作为 IPAM CNI。
kubectl
,如安装 Tanzu CLI 和 Kubernetes 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.6.1+vmware.2-tkg.1 2023-30-04 18:00:00 +0000 UTC tanzu-package-repo-global
注意如果在网络受限的环境中运行,请确保可以访问自定义映像注册表。
使用 --values-schema
运行 tanzu package available get
命令以查看可以设置哪些字段值:
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.6.1+vmware.2-tkg.1
。运行 tanzu package installed get
以检查已安装软件包的状态。
tanzu package installed get whereabouts -o <json|yaml|table>
为 NetworkAttachmentDefinition
创建自定义资源定义 (CRD),该定义明确了 Multus CNI 使用的网络接口的 CNI 配置,其中 Whereabouts 作为 IPAM 类型。
创建 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,以指定要添加的其他网络。
创建 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
创建 Pod。例如,kubectl create -f my-multi-cni-crd.yaml
创建 Pod pod0
。
在创建 Pod 后,它将具有三个网络接口:
lo
环回接口eth0
由 Antrea 或 Calico CNI 管理的默认 Pod 网络net1
通过注释 k8s.v1.cni.cncf.io/networks: macvlan-conf
创建新接口。注意默认网络将获取名称
eth0
,其他网络 Pod 接口将该名称获取为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。重复此步骤以验证将在下一步中创建的其他 Pod 的配置。
创建两个额外的 Pod:在同一节点上创建 pod1
,在其他节点上创建 pod2
。我们将使用这些 Pod 验证集群内单个节点和节点内的网络访问。
现在,可以检查同一节点中的 Pod 与集群中 Pod 之间的网络访问。
验证同一节点上的 Pod 之间的网络访问正常工作。例如,以下命令验证 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
验证不同节点上的 Pod 之间的网络访问正常工作。例如,以下命令验证 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