JCNR 用例和配置概述
总结 阅读本章,查看在容器网络接口 (CNI) 模式下部署时的各种瞻博网络云原生路由器用例的配置示例。
瞻博网络云原生路由器可以部署为虚拟交换机或传输路由器,也可以部署为纯容器网络功能 (CNF) 或容器网络接口 (CNI)。在 CNF 模式下,节点上没有运行应用程序 Pod,路由器仅通过系统上的各种接口执行数据包交换或转发。在 CNI 模式下,使用基于软件的网络接口(如 veth 对或基于 DPDK 虚拟用户的接口)的应用程序 Pod 连接到云原生路由器。本章提供将不同工作负载接口类型附加到云原生路由器 CNI 实例的配置示例。
配置示例
JCNR CNI 部署为辅助 CNI,Multus 部署为主 CNI,以便为应用程序 Pod 创建不同类型的辅助接口。Multus 使用网络附件定义 (NAD) 文件为应用程序 Pod 配置辅助接口。NAD 指定如何创建辅助接口、IP 地址分配、网络实例等。一个容器可以有一个或多个 NAD,通常每个容器接口一个。的config:
NAD 文件中的字段定义 JCNR 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 实施 虚拟交换机 — 第 2 层实施 |
接口类型 | 要么是“veth”,要么是“virtio” |
vlanId | 有效的 VLAN ID “1-4095” |
bridgeVlanId | 有效的 VLAN ID “1-4095” |
vlanIdList | 命令分隔的 vlan-id 列表,例如:“1, 5, 7, 10-20” |
父接口 | 应在容器中显示的有效接口名称。子接口/子接口将父接口作为其前缀,后跟“.” 如果指定了父接口,则必须显式指定子接口。 |
vrfTarget | vrf 路由实例的路由目标 |
桥域 | 桥接域,虚拟交换机实例中应将 Pod 接口附加到该域下。 |
类型 (IPAM) | 静态 — 为所有 Pod 分配相同的 IP,为每个 Pod 分配唯一 IP;为每个接口的每个 Pod 定义唯一的 NAD 主机本地 - 同一主机上每个容器接口的唯一 IP 地址。IP 地址在两个不同的节点上不是唯一的 位置 — 跨所有节点的每个 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 时,称为 kubelet 的 Kubernetes 组件会调用 Multus CNI 来设置 Pod 网络和接口。Multus 读取 pod.yaml 文件的注释部分以引用相应的 NAD。如果 NAD 指向 jcnr
CNI 插件,Multus 将调用 JCNR-CNI 来设置 Pod 接口。JCNR-CNI 按照 NAD 中指定的方式创建接口。然后,JCNR-CNI 生成配置并将其推送到 cRPD 中。
故障 排除
由于各种原因,Pod 主要无法启动:
-
未找到图像
-
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