用户使用自定义 CNI 插件方法
概述
本文档介绍如何在 CCE 中使用和配置 CCE CNI,以满足自定义容器网络的需求。内容涵盖 V2 与 V1 两个版本下的容器网络模式确认、官方支持插件扩展、自定义 CNI 插件接入,以及 sysctl 配置方式。
前提条件
- 已获取目标
CCE集群的访问凭证,并可在运维终端执行kubectl;同时具备读取kube-system命名空间下相关ConfigMap的权限。 - 如需修改或验证节点侧
CNI配置,已具备目标节点登录权限,并可访问/etc/cni/net.d/00-cce-cni.conflist。 - 使用
V2能力时,已安装cce-network-v2组件且版本不低于2.10.0;所使用的CNI规范版本不低于0.4.0。## 背景
为了更好地满足用户对于高度定制化网络配置的需求,cce-network 不仅允许用户使用默认的 CNI 插件,更提供了一种机制,使用户能够自定义 CNI 插件。这种自定义能力极大地增强了网络配置的灵活性,从而使得用户可以根据自己的具体需求,进行详细的网络设计和配置。
自定义 CNI 插件的方法包括了对官方支持的插件的选择配置,以及通过修改配置文件直接部署用户自定义的插件。
本文描述了如何使用和配置 CCE CNI,从而实现用户自定义 CNI 插件的配置。
V2 版本使用说明
适用于已安装 cce-network-v2 组件且版本不低于 2.10.0 的集群。
1 确认容器网络模式
导航路径:容器引擎 CCE -> 集群列表
在已配置目标集群访问凭证的终端中执行以下命令,查看 cce-network-v2-config 的 ipam 字段:
1kubectl get cm -n kube-system cce-network-v2-config -o yaml
如果返回 403 Forbidden,请先为当前访问身份补齐 kube-system 命名空间下 ConfigMap 的读取权限后再继续。
vpc-route开头表示基于 VPC 路由的网络方案vpc-eni, 开头表示基于弹性网卡的网络方案
2 自定义 CCE 官方支持的插件
下面提供 CCE 官方支持的插件列表。用户可以通过修改 cce-network-v2-config 中 cced 配置下的 ext-cni-plugins 字段进行选择。
| 插件名称 | 提供者 | 插件描述 | 插件版本 |
|---|---|---|---|
| portmap | 社区 | 社区的 CNI 插件,支持Pod 上配置端口直通能力。当开启 DataPath V2 时,该插件会自动失效。 | v1.0.0 及以上版本 |
| cilium-cni | CCE | Cilium CNI 插件,支持网络策略、service加速等。 | v1.12.5-baidu 及以上版本 |
| endpoint-probe | CCE | CCE 提供的 CNI 插件,用于支持 Pod Qos 等能力。 | v2.9.0 及以上版本 |
| cptp | CCE | CCE 提供的默认 CNI 插件,支持Pod基础网络通信能力。 | v1.0.0 及以上版本 |
| exclusive-device | CCE | CCE 提供的 CNI 插件,支持Pod独占网卡能力。 | v2.6.0 及以上版本 |
| sbr-eip | CCE | CCE 提供的 CNI 插件,支持Pod 直通 EIP 功能。 | v2.6.0 及以上版本 |
例如需要开启 portmap 插件,则可以通过如下配置文件进行重新部署。
- 修改cni插件模板
1kubectl edit cm cce-network-v2-config -n kube-system -o yaml
2
3apiVersion: v1
4data:
5 cced: |
6 ……
7 ext-cni-plugins:
8 - portmap
9 - endpoint-probe
10 ……
- 清理cni配置文件
需要在修改后重启
daemonset cce-network-agent
1kubectl rollout restart daemonset -n kube-system cce-network-agent
- 验证
登录任意已完成更新的节点,执行以下命令,确认 /etc/cni/net.d/00-cce-cni.conflist 中已包含用户自定义的插件配置:
1cat /etc/cni/net.d/00-cce-cni.conflist
期望结果示例如下:
1{
2 "cniVersion": "0.4.0",
3 "name": "generic-veth",
4 "ipam": {},
5 "dns": {},
6 "plugins": [
7 {
8 "ipam": {
9 "type": "cipam"
10 },
11 "mtu": 1500,
12 "type": "cptp"
13 },
14 {
15 "capabilities": {
16 "portMappings": true
17 },
18 "externalSetMarkChain": "KUBE-MARK-MASQ",
19 "type": "portmap"
20 },
21 {
22 "type": "endpoint-probe"
23 }
24 ]
25}
验证时重点确认以下内容:
plugins数组中存在type: "portmap"。plugins数组中存在type: "endpoint-probe"。plugins数组中仍保留type: "cptp"。cniVersion不低于0.4.0。
3 自定义 CNI 插件
CCE 也支持保留用户自定义的 CNI 插件。用户可以通过修改主机配置文件 /etc/cni/net.d/00-cce-cni.conflist 自行部署 CNI 配置文件。CCE 在更新时,会继续保留用户自定义的 CNI 插件,并将其插入到插件链尾端。
注意: 自定义
CNI插件配置错误,可能导致 Pod 创建或删除异常。修改前请确认插件二进制已经部署到目标节点,并保留原始配置以便回滚。
配置示例如下:
1{
2 "name": "generic-veth",
3 "cniVersion": "0.4.0",
4 "plugins": [
5 {
6 "type": "cptp",
7 "ipam": {
8 "type": "cipam"
9 },
10 "mtu": 1500
11 },
12 {
13 "type": "endpoint-probe"
14 },
15 {
16 "type": "user-cni"
17 }
18 ]
19}
CCE 容器网络在启动时会自动读取该配置文件。如果发现了用户自定义的 CNI 插件,则在后续更新 CNI 配置时,会把用户自定义插件自动插入到插件链的尾端。
V1 版本使用说明
1 确认容器网络模式
执行 kubectl get cm -n kube-system cce-cni-node-agent -o yaml,查看 cniMode 字段。
vpc-route-开头表示基于 VPC 实例路由的网络方案vpc-secondary-ip-, 开头表示基于弹性网卡的网络方案
2 修改 CNI 配置文件模板
导航路径:容器引擎 CCE -> 集群列表
根据步骤 1 获取的网络模式,执行以下命令编辑 ConfigMap:
1kubectl edit cm -n kube-system cce-cni-config-template
手动编辑对应模式模板中的 plugins 列表,在最后追加 sysctl 插件配置。保存后等待约 1 分钟,所有节点的 CNI 配置将会更新。
修改完的样例如下:
1 cce-cni-secondary-ip-veth: |
2 {
3 "name":"{{ .NetworkName }}",
4 "cniVersion":"0.3.1",
5 "plugins":[
6 {
7 "type":"ptp",
8 "enableARPProxy":true,
9 "vethPrefix":"veth",
10 "mtu": {{ .VethMTU }},
11 "ipam":{
12 "type":"eni-ipam",
13 "endpoint":"{{ .IPAMEndPoint }}",
14 "instanceType":"{{ .InstanceType }}",
15 "deleteENIScopeLinkRoute":true
16 }
17 },
18 {
19 "type":"sysctl",
20 "kubeconfig":"/etc/cni/net.d/cce-cni.d/cce-cni.kubeconfig"
21 }
22 ]
23 }
3 集群粒度的配置(可选)
在步骤 2 中的配置里,可以继续添加 sysctl 字段,指明需要配置的参数。
如下配置生效后,集群内所有新建的容器都会将 /proc/sys/net/core/somaxconn 设置为 8192。
1{
2 "type":"sysctl",
3 "kubeconfig":"/etc/cni/net.d/cce-cni.d/cce-cni.kubeconfig",
4 "sysctl":{
5 "net.core.somaxconn":"8192"
6 }
7}
该配置仅对保存后新建的容器生效,已运行容器不会自动更新。不同内核版本可配置的 netns 级 sysctl 参数范围不同,建议先在测试集群验证后再推广到生产环境。
4 应用粒度的配置(可选)
在完成步骤 2 后,用户可以通过指定 Pod 的 annotations,传递 sysctl 参数的配置。
采用如下的 yaml 的创建的 nginx 容器,将会设置 /proc/sys/net/core/somaxconn 为 8192 以及 /proc/sys/net/ipv4/tcp_tw_reuse 为 1。
1kind: Deployment
2apiVersion: apps/v1
3metadata:
4 name: nginx-example
5spec:
6 replicas: 1
7 selector:
8 matchLabels:
9 app: nginx-example
10 template:
11 metadata:
12 labels:
13 app: nginx-example
14 annotations:
15 net.sysctl.cce.io/net.core.somaxconn: "8192"
16 net.sysctl.cce.io/net.ipv4.tcp_tw_reuse: "1"
17 spec:
18 containers:
19 - name: nginx-example
20 image: nginx:alpine
21 imagePullPolicy: IfNotPresent
注意事项
用户自定义的 CNI 插件,必须满足以下条件:
- 确保 CNI 插件的 type 字段不为空且不要与已有插件重复;
- 确保 CNI 插件的可执行程序/opt/cni/bin/{user-cni} 存在且可执行,否则 kubelet 无法正常创建 Pod;
- 确保 CNI 插件完整的遵循了 CNI 规范,确保 CNI DEL 操作可以正常执行。防止 CNI 插件异常导致 Pod 无法删除重建,持续在故障中无法恢复。
- 确保 CNI 配置是一个合法的 JSON 格式文件
- 不同版本内核中 netns 可配置的 sysctl 参数不同,请小心配置否则容器可能无法启动
评价此篇文章
