自定义 JCNR 配置
总结 阅读本主题可了解如何使用 ConfigMap 自定义 JCNR 配置。
JCNR 配置图
从瞻博网络云原生路由器 (JCNR) 23.3 版开始,JCNR 支持在 L3 模式下部署时使用 ConfigMap 自定义配置。在基于云的部署中,如果节点发生故障,JCNR Pod 可能会在更新或不同的节点上生成。配置映射将配置参数与节点名称分离,改为基于节点标签。这使 JCNR CNI 部署人员能够使用配置参数,将其应用于 cRPD 配置模板并呈现配置,只要节点有匹配的标签即可。配置映射是一个 API 对象,用于将数据存储在键值对中。配置映射定义与标签匹配的节点使用的每节点变量。键值对用于通过 go 模板呈现配置。配置的模板必须在目录中可用 Juniper_Cloud_Native_Router_release_number/helmchart/charts/jcnr-cni/files/
,以便将配置应用于 cRPD 容器。
在安装 JCNR 之前,您必须应用 ConfigMap,以使用自定义配置创建 cRPD Pod。如果您希望在安装 JCNR 之后的任何时候应用配置参数,则必须删除并重新生成 cRPD 容器。默认情况下,配置参数将应用于任何新生成的 cRPD Pod。通过 ConfigMap 进行的 JCNR 自定义是可选的。
JCNR 还支持通过节点注释进行自定义,以便向后兼容以前的版本。考虑到节点注释与节点名称相结合,强烈建议通过 ConfigMap 自定义 JCNR,特别是用于云部署。有关更多信息,请参阅 使用节点注释自定义 JCNR 配置 。
配置示例
示例配置映射和模板文件可在目录下 Juniper_Cloud_Native_Router_<release-number>/helmchart/cRPD_examples
找到。
您可以为集群中的不同节点标签定义键值对。下面提供了该文件 jcnr-params-configmap.yaml
的示例:
apiVersion: v1 kind: ConfigMap metadata: name: jcnr-params namespace: jcnr data: jcnr1: | { "isoLoopbackAddr": "49.0004.1000.0000.0001.00", "IPv4LoopbackAddr": "110.1.1.2", "srIPv4NodeIndex": "2000", "srIPv6NodeIndex": "3000", "BGPIPv4Neighbor": "110.1.1.254", "BGPLocalAsn": "64512" } jcnr2: | { "isoLoopbackAddr": "49.0004.1000.0000.0000.00", "IPv4LoopbackAddr": "110.1.1.3", "srIPv4NodeIndex": "2001", "srIPv6NodeIndex": "3001", "BGPIPv4Neighbor": "110.1.2.254", "BGPLocalAsn": "64512" }
您在注释中定义的键值对用于通过 go 模板呈现 cRPD 配置。下面提供了模板文件的示例 jcnr-cni-custom-config-cm.tmpl
:
apply-groups [custom]; groups { custom { interfaces { lo0 { unit 0 { {{if .Params.isoLoopbackAddr}} family iso { address {{.Params.isoLoopbackAddr}}; } {{end}} family inet { address {{.Params.IPv4LoopbackAddr}}; } } } } routing-options { router-id {{.Params.IPv4LoopbackAddr}} route-distinguisher-id {{.Params.IPv4LoopbackAddr}} } protocols { isis { interface all; {{if and .Env.SRGB_START_LABEL .Env.SRGB_INDEX_RANGE}} source-packet-routing { srgb start-label {{.Env.SRGB_START_LABEL}} index-range {{.Env.SRGB_INDEX_RANGE}}; node-segment { {{if .Params.srIPv4NodeIndex}} ipv4-index {{.Params.srIPv4NodeIndex}}; {{end}} {{if .Params.srIPv6NodeIndex}} ipv6-index {{.Params.srIPv6NodeIndex}}; {{end}} } } {{end}} level 1 disable; } ldp { interface all; } mpls { interface all; } } policy-options { # policy to signal dynamic UDP tunnel attributes to BGP routes policy-statement udp-export { then community add udp; } community udp members encapsulation:0L:13; } protocols { bgp { group jcnrbgp1 { type internal; local-address {{.Params.IPv4LoopbackAddr}}; local-as {{.Params.BGPLocalAsn}}; neighbor {{.Params.BGPIPv4Neighbor}}; family inet-vpn { unicast; } family inet6-vpn { unicast; } } } } routing-options { dynamic-tunnels { dyn-tunnels { source-address {{.Params.IPv4LoopbackAddr}}; udp; destination-networks {{.Params.BGPIPv4Neighbor}}/32; } } } } }
您可以在模板中定义其他 cRPD 配置层次结构。要从 中 jcnr-params-configmap.yaml
定义的配置映射呈现的值必须定义为 {{.Params.var-name}}
。任何环境变量(如 中 values.yaml
定义的变量)都必须定义为 {{.Env.variable_name}}
。
完成以下步骤以应用自定义项。
-
根据配置映射中使用的键标记每个节点。
kubectl label nodes <node_name1> jcnr.juniper.net/params-profile=jcnr1 kubectl label nodes <node_name2> jcnr.juniper.net/params-profile=jcnr2
- 使用下面提供的命令将配置映射应用于群集节点:
# kubectl apply -f jcnr-params-configmap.yaml configmap/jcnr-params created
- 配置模板后,必须将
jcnr-cni-custom-config.tmpl
文件Juniper_Cloud_Native_Router_release_number/helmchart/charts/jcnr-cni/files/
复制到目录中。# cp Juniper_Cloud_Native_Router_release_number/helmchart/cRPD_examples/jcnr-cni-custom-config-cm.tmpl Juniper_Cloud_Native_Router_release_number/helmchart/charts/jcnr-cni/files/ #
- 部署云原生路由器组件,包括 cRPD。安装完成后, 访问 cRPD CLI 并在模式下发出
show configuration | display set
命令cli
以查看您应用的自定义配置。root@jcnr-01> show configuration ## Last commit: 2023-06-23 08:30:42 EDT by root version 20230608.143922_builder.r1342735; groups { base { /* OMITTED */ }; custom { interfaces { lo0 { unit 0 { family inet { address 110.1.1.2/32; } family iso { address 49.0004.1000.0000.0001.00; } } } } policy-options { # policy to signal dynamic UDP tunnel attributes to BGP routes policy-statement udp-export { then { community add udp; } } community udp members encapsulation:0L:13; } routing-options { route-distinguisher-id 110.1.1.2; router-id 110.1.1.2; dynamic-tunnels { dyn-tunnels { source-address 110.1.1.2; udp; destination-networks { 110.1.1.254/32; } } } } protocols { bgp { group jcnrbgp1 { type internal; local-address 110.1.1.2; family inet-vpn { unicast; } family inet6-vpn { unicast; } local-as 64512; neighbor 110.1.1.254; } } isis { interface all; source-packet-routing { srgb start-label 400000 index-range 4000; node-segment { ipv4-index 2000; ipv6-index 3000; } } level 1 disable; } ldp { interface all; } mpls { interface all; } } } cni { /* OMITTED */ }; internal { /* OMITTED */ }; } apply-groups [ custom base internal ];
修改配置映射
如果您希望在 JCNR 安装后随时更改配置映射,则必须删除 cRPD Pod 并使用以下命令重生它:kubectl patch sts kube-crpd-worker-sts -n jcnr -p '{"spec":{"template":{"metadata":{"annotations":{"configmap-reload/timestamp":"'$(date +%s)'"}}}}}'
故障 排除
如果通过 go 模板呈现和应用无效的配置,cRPD Pod 将继续以状态重新启动 CrashLoopBackOff
。呈现的配置将保存在 /config
JCNR 主机上的目录中,为 juniper.conf.master
。您可以将渲染的配置手动应用于正在运行的 cRPD 容器,以验证配置并识别问题。对于 AWS EKS 部署,您可以在目录中的 cRPD Pod 中找到 /config
呈现的配置。