云原生路由器用例和配置概述
阅读本章,查看在容器网络接口 (CNI) 模式下部署时各种瞻博网络云原生路由器用例的配置示例。
瞻博网络云原生路由器可以部署为虚拟交换机或中转路由器,也可以是纯容器网络功能 (CNF) 或容器网络接口 (CNI)。在 CNF 模式下,节点上没有运行应用 Pod,路由器仅通过系统上的各种接口执行数据包交换或转发。在 CNI 模式下,使用基于软件的网络接口(例如 veth-pair 或基于 DPDK vhost-user 的接口)的应用 Pod 连接到云原生路由器。本章提供将不同工作负载接口类型附加到云原生路由器 CNI 实例的配置示例。
配置示例
云原生路由器 CNI 与 Multus 一起部署为辅助 CNI,以便为应用 Pod 创建不同类型的辅助接口。Multus 使用网络附件定义 (NAD) 文件为应用程序 Pod 配置辅助接口。NAD 指定如何创建辅助接口、IP 地址分配、网络实例等。一个 Pod 可以有一个或多个 NAD,通常每个 Pod 接口有一个。这config: NAD 文件中的字段定义了云原生路由器 CNI 配置。以下是NAD的通用格式:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: <vrf-name>
spec:
config: '{
"cniVersion":"0.4.0",
"name": "<vrf-name>",
"plugins": [
{
"type": "jcnr",
"args": {
"key1":"value1",
"key2","value2",
....
},
"ipam": {
"type": "<ipam-type>",
....
},
"kubeConfig":"/etc/kubernetes/kubelet.conf"
}
]
}'
| 密钥 | 说明 |
|---|---|
| 实例名称 | 路由实例名称 |
| 实例类型 | 其中之一: 虚拟路由器 - 用于非 VPN 相关应用 vrf — 第 3 层 VPN 实施 virtual-switch — 第 2 层实施 |
| 接口类型 | “veth”或“virtio” |
| vlanId | 有效的 VLAN ID“1-4095” |
| 桥接VlanId | 有效的 VLAN ID“1-4095” |
| vlanIdList | 分隔 vlan-id 的命令列表,例如:“1、5、7、10-20” |
| parentInterface | 有效的接口名称,因为它应该显示在容器中。子接口/子接口的 parentInterface 前缀后跟 “.”,如果指定了 parentInterface,则必须显式指定子接口。 |
| vrfTarget | vrf 路由实例的路由目标 |
| 桥接域 | 在虚拟交换机实例中附加 Pod 接口的桥接域。 |
| 类型 (IPAM) | 静态 — 为所有 Pod 分配相同的 IP,要为每个 Pod 分配唯一 IP,请为每个 Pod 定义每个接口的唯一 NAD host-local — 同一主机上每个 Pod 接口的唯一 IP 地址。IP 地址在两个不同的节点上不是唯一的 whereabouts - 跨所有节点为每个 Pod 提供唯一的 IP 地址 |
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: vswitch-pod1-bd100
spec:
config: '{
"cniVersion":"0.4.0",
"name": "vswitch-pod1-bd100",
"plugins": [
{
"type": "jcnr",
"args": {
"instanceName": "vswitch",
"instanceType": "virtual-switch",
"interfaceType": "veth",
"bridgeDomain": "bd100",
"bridgeVlanId": "100"
},
"ipam": {
"type": "static",
"addresses":[
{
"address":"99.61.0.2/16",
"gateway":"99.61.0.1"
},
{
"address":"1234::99.61.0.2/120",
"gateway":"1234::99.61.0.1"
}
]
},
"kubeConfig":"/etc/kubernetes/kubelet.conf"
}
]
}'
k8s.v1.cni.cncf.io/networks 注解。例如:
apiVersion: v1
kind: Pod
metadata:
name: pod1
annotations:
k8s.v1.cni.cncf.io/networks: vswitch-pod1-bd100
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kind-worker
containers:
- name: pod1
image: ubuntu:latest
imagePullPolicy: IfNotPresent
securityContext:
privileged: false
env:
- name: KUBERNETES_POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
volumeMounts:
- name: dpdk
mountPath: /dpdk
subPathExpr: $(KUBERNETES_POD_UID)
volumes:
- name: dpdk
hostPath:
path: /var/run/jcnr/containers
/dpdk/dpdk-interfaces.json 在应用程序容器内供 DPDK 应用程序使用。它也会作为 Pod 注释导出到 Pod 中。
创建用于云原生路由器的 Pod 时,名为 kubelet 的 Kubernetes 组件会调用 Multus CNI 来设置 Pod 网络和接口。Multus 读取 pod.yaml 文件的注释部分以引用相应的 NAD。如果 NAD 指向 jcnr CNI 插件,Multus 将调用 JCNR-CNI 来设置 pod 接口。JCNR-CNI 按照 NAD 中指定的方式创建接口。然后,JCNR-CNI 生成配置并将其推送到 cRPD 中。
故障 排除
由于各种原因,Pod main 无法出现:
-
未找到图像
-
CNI 添加接口失败
-
CNI 无法将配置推送到 cRPD 中
-
CNI 无法调用 vRouter REST API
-
NAD 无效或未定义
以下命令可用于对 Pod 问题进行故障排除:
# Check the Pod status kubectl get pods –A
# Check pod state and CNI logs kubectl describe pod <pod-name>
# Check the pod logs kubectl logs pod <pod-name>
# Check the net-attach-def kubectl get net-attach-def <net-attach-def-name> -o yaml
# Check CNI logs tail –f /var/log/jcnr/jcnr-cni.log
# Check the cRPD config added by CNI (on the cRPD CLI) cli> show configuration groups cni