CNI(Container Network Interface)是Kubernetes中实现网络插件的接口标准。CNI Chain是一种CNI插件模式,支持结合多个CNI插件实现更灵活的网络配置。在Kubernetes集群中,CNI Chain可将多个CNI插件组成一个链,每个插件负责处理特定的网络任务,例如IP分配、路由等。当容器创建时,CNI Chain首先调用第一个插件,并将输出传递给下一个插件,直到所有插件都完成任务。
ACK不保证多个CNI插件之间可以协作。配置自定义CNI Chain属于高危操作,请在充分理解多个CNI功能后进行配置,谨慎操作,避免配置错误导致业务中断。
前提条件
已创建Kubernetes托管版集群,且集群的网络插件为Terway。更多信息,请参见创建ACK托管集群。
使用限制
Terway版本需大于等于v1.5.6。关于如何升级组件版本,请参见管理组件。
配置自定义CNI Chain
当您需要使用CNI Chain时,需要在Terway配置文件中增加您需要的插件。
操作步骤
修改Terway配置文件,执行以下命令,修改
eni-config
配置文件。kubectl edit cm -nkube-system eni-config
配置参数
说明
10-terway.conf
terway CNI 配置,请勿修改其中内容。
重要请勿修改原有配置内容。
10-terway.conflist
自定义CNI Chain配置。
plugins
中第一个cni配置应当为10-terway.conf
内配置。重要文档内配置仅为示例说明,请勿直接拷贝,导致配置错误。
配置块的内容应当为JSON格式,请保证格式正确。
配置文件示例
kind: ConfigMap apiVersion: v1 metadata: name: eni-config namespace: kube-system data: 10-terway.conflist: | { "plugins": [ { "cniVersion": "0.4.0", "name": "terway", "type": "terway", "capabilities": {"bandwidth": true} }, { "type": "portmap", "capabilities": {"portMappings": true}, "externalSetMarkChain":"KUBE-MARK-MASQ" } ] } 10-terway.conf: | { "cniVersion": "0.4.0", "name": "terway", "type": "terway", "capabilities": {"bandwidth": true} }
使用
kubectl rollout restart -n kube-system daemonset.apps/terway-eniip
重建Terway Pods。若配置正确,您可以在节点
etc/cni/net.d/10-terway.conflis
配置文件中查看您自定义的插件配置。
使用案例
ACK不保证多个CNI插件之间可以协作。配置自定义CNI Chain属于高危操作,请在充分理解多个CNI功能后进行配置,谨慎操作,避免配置错误导致业务中断。
下文使用案例仅供参考。
设置portmap
Portmap插件的主要职责是将Pod的内部端口映射到宿主机的端口上,从而允许外部网络访问Pod的特定服务。
配置示例
kind: ConfigMap
apiVersion: v1
metadata:
name: eni-config
namespace: kube-system
data:
10-terway.conflist: |
{
"plugins": [
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"externalSetMarkChain":"KUBE-MARK-MASQ"
}
]
}
10-terway.conf: |
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
}
关闭容器内IPv6功能
在容器内,即使您的集群并未启用IPv6双栈功能,容器的网络接口在创建后仍会自动分配一个IPv6本地链路地址,属于fe80::/64
网段。这是操作系统内核的默认行为,通常是无害的,并不会干扰正常业务运行。
然而,如果您的应用程序在处理网络地址时存在错误,可能会错误地将这个IPv6 Link-Local地址识别为Pod的IP,并尝试使用它进行通信。但Link-Local地址旨在用于同一链路内的设备间通信,并不能用于网络通信,这可能会导致您的应用程序运行异常。在这种情况下,您的应用程序代码存在缺陷,请优先向应用程序的供应商报告并寻求解决方案。
如果您仍然需要在容器内关闭IPv6本地链路地址,您可以通过配置tuning
插件实现。
配置示例
kind: ConfigMap
apiVersion: v1
metadata:
name: eni-config
namespace: kube-system
data:
10-terway.conflist: |
{
"plugins": [
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
},
{
"type": "tuning",
"sysctl": {
"net.ipv6.conf.all.disable_ipv6": "1",
"net.ipv6.conf.default.disable_ipv6": "1",
"net.ipv6.conf.lo.disable_ipv6": "1"
}
}
]
}
10-terway.conf: |
{
"cniVersion": "0.4.0",
"name": "terway",
"type": "terway",
"capabilities": {"bandwidth": true}
}