OVN 流量镜像¶
此功能可以将指定 Pod、指定方向的流量,通过 GRE/ERSPAN 封装后,传输到远端。
此功能要求 Kube-OVN 版本不低于 v1.12。
部署 Multus-CNI¶
参考 Multus-CNI 文档 部署 Multus。
创建附属网络¶
使用以下内容创建附属网络:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: attachnet
namespace: default
spec:
config: |
{
"cniVersion": "0.3.1",
"type": "kube-ovn",
"server_socket": "/run/openvswitch/kube-ovn-daemon.sock",
"provider": "attachnet.default.ovn"
}
其中 provider
字段格式为 <NAME>.<NAMESPACE>.ovn
。
创建 Underlay 网络¶
镜像流量是封装后进行传输的,因此用于传输的网络,MTU 需要大于被镜像的 LSP/Pod。这里我们使用 Underlay 作为传输网络。
使用以下内容创建 Underlay 网络:
apiVersion: kubeovn.io/v1
kind: ProviderNetwork
metadata:
name: net1
spec:
defaultInterface: eth1
---
apiVersion: kubeovn.io/v1
kind: Vlan
metadata:
name: vlan1
spec:
id: 0
provider: net1
---
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
name: subnet1
spec:
protocol: IPv4
cidrBlock: 172.19.0.0/16
excludeIps:
- 172.19.0.2..172.19.0.20
gateway: 172.19.0.1
vlan: vlan1
provider: attachnet.default.ovn
其中,子网的 provider
必须与附属网络的 provider
相同。
创建流量接收 Pod¶
使用以下内容创建用于接收镜像流量的 Pod:
apiVersion: v1
kind: Pod
metadata:
name: pod1
annotations:
k8s.v1.cni.cncf.io/networks: default/attachnet
spec:
containers:
- name: bash
image: docker.io/kubeovn/kube-ovn:v1.12.28
args:
- bash
- -c
- sleep infinity
securityContext:
privileged: true
创建完成后,查看 Pod 的 IP 地址:
$ kubectl get ips | grep pod1
pod1.default 10.16.0.12 00:00:00:FF:34:24 kube-ovn-worker ovn-default
pod1.default.attachnet.default.ovn 172.19.0.21 00:00:00:A0:30:68 kube-ovn-worker subnet1
记住第二网卡的 IP 地址 172.19.0.21
。
创建 OVN 流量镜像¶
使用以下命令创建 OVN 流量镜像:
kubectl ko nbctl mirror-add mirror1 gre 99 from-lport 172.19.0.21
kubectl ko nbctl lsp-attach-mirror coredns-787d4945fb-gpnkb.kube-system mirror1
其中 coredns-787d4945fb-gpnkb.kube-system
是 OVN LSP 的名称,格式通常为 <POD_NAME>.<POD_NAMESPACE>
。
相关的 OVN 命令使用方法如下:
ovn-nbctl mirror-add <NAME> <TYPE> <INDEX> <FILTER> <IP>
NAME - add a mirror with given name
TYPE - specify TYPE 'gre' or 'erspan'
INDEX - specify the tunnel INDEX value
(indicates key if GRE, erpsan_idx if ERSPAN)
FILTER - specify FILTER for mirroring selection
('to-lport' / 'from-lport')
IP - specify Sink / Destination i.e. Remote IP
ovn-nbctl mirror-del [NAME] remove mirrors
ovn-nbctl mirror-list print mirrors
ovn-nbctl lsp-attach-mirror PORT MIRROR attach source PORT to MIRROR
ovn-nbctl lsp-detach-mirror PORT MIRROR detach source PORT from MIRROR
配置流量接收 Pod¶
在前面创建的 Pod 中执行以下命令:
root@pod1:/kube-ovn# ip link add mirror1 type gretap local 172.19.0.21 key 99 dev net1
root@pod1:/kube-ovn# ip link set mirror1 up
接下来就可以在接收流量的 Pod 中进行抓包验证:
root@pod1:/kube-ovn# tcpdump -i mirror1 -nnve
tcpdump: listening on mirror1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
05:13:30.328808 00:00:00:a3:f5:e2 > 00:00:00:97:0f:6e, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Request who-has 10.16.0.7 tell 10.16.0.4, length 28
05:13:30.559167 00:00:00:a3:f5:e2 > 00:00:00:89:d5:cc, ethertype IPv4 (0x0800), length 212: (tos 0x0, ttl 64, id 57364, offset 0, flags [DF], proto UDP (17), length 198)
10.16.0.4.53 > 10.16.0.6.50472: 34511 NXDomain*- 0/1/1 (170)
05:13:30.559343 00:00:00:a3:f5:e2 > 00:00:00:89:d5:cc, ethertype IPv4 (0x0800), length 212: (tos 0x0, ttl 64, id 57365, offset 0, flags [DF], proto UDP (17), length 198)
10.16.0.4.53 > 10.16.0.6.45177: 1659 NXDomain*- 0/1/1 (170)
05:13:30.560625 00:00:00:a3:f5:e2 > 00:00:00:89:d5:cc, ethertype IPv4 (0x0800), length 200: (tos 0x0, ttl 64, id 57367, offset 0, flags [DF], proto UDP (17), length 186)
10.16.0.4.53 > 10.16.0.6.43848: 2636*- 0/1/1 (158)
05:13:30.562774 00:00:00:a3:f5:e2 > 00:00:00:89:d5:cc, ethertype IPv4 (0x0800), length 191: (tos 0x0, ttl 64, id 57368, offset 0, flags [DF], proto UDP (17), length 177)
10.16.0.4.53 > 10.16.0.6.37755: 48737 NXDomain*- 0/1/1 (149)
05:13:30.563523 00:00:00:a3:f5:e2 > 00:00:00:89:d5:cc, ethertype IPv4 (0x0800), length 187: (tos 0x0, ttl 64, id 57369, offset 0, flags [DF], proto UDP (17), length 173)
10.16.0.4.53 > 10.16.0.6.53887: 45519 NXDomain*- 0/1/1 (145)
05:13:30.564940 00:00:00:a3:f5:e2 > 00:00:00:89:d5:cc, ethertype IPv4 (0x0800), length 201: (tos 0x0, ttl 64, id 57370, offset 0, flags [DF], proto UDP (17), length 187)
10.16.0.4.53 > 10.16.0.6.40846: 25745 NXDomain*- 0/1/1 (159)
05:13:30.565140 00:00:00:a3:f5:e2 > 00:00:00:89:d5:cc, ethertype IPv4 (0x0800), length 201: (tos 0x0, ttl 64, id 57371, offset 0, flags [DF], proto UDP (17), length 187)
10.16.0.4.53 > 10.16.0.6.45214: 61875 NXDomain*- 0/1/1 (159)
05:13:30.566023 00:00:00:a3:f5:e2 > 00:00:00:55:e4:4e, ethertype IPv4 (0x0800), length 80: (tos 0x0, ttl 64, id 45937, offset 0, flags [DF], proto UDP (17), length 66)
10.16.0.4.44116 > 172.18.0.1.53: 16025+ [1au] AAAA? kube-ovn.io. (38)
注意事项¶
- 如果使用 ERSPAN 作为封装协议,OVN 节点及远端设备的 Linux 内核版本不得低于 4.14。若使用 ERSPAN 作为封装协议且使用 IPv6 作为传输网络,Linux 内核版本不得低于 4.16。
- 镜像流量的传输是单向的,只需保证 OVN 节点能够访问远端设备即可。
微信群 Slack Twitter Support Meeting