本文介绍Flannel网络插件下如何使用Kubernetes定义的Pod Annotations配置Pod出、入方向带宽限制。Flannel集群不会默认开启带宽限制功能,您可以根据本文开启该功能。
前提条件
已创建使用Flannel网络插件的ACK托管版或专有版集群,具体操作,请参见创建Kubernetes托管版集群或者创建Kubernetes专有版集群。关于如何在创建集群的过程中安装Flannel网络插件,请参见使用Flannel网络插件。
集群中已安装的Flannel网络插件版本大于等于v0.15.1.4-e02c8f12-aliyun。您可以通过组件管理页面查询到Flannel插件版本,关于如何访问组件管理页面,请参见管理组件。
说明如无法升级Flannel组件到该版本,请先升级Kubernetes版本。具体操作,请参见升级ACK集群。
配置带宽限制
Flannel集群不会默认开启带宽限制功能,您需要修改Flannel配置文件来开启该功能。如您尚未启用该功能,请参见开启集群带宽限制功能。
Flannel网络插件支持对Pod网络带宽进行控制,您可以使用以下Pod Annotations指定Pod出、入方向的最大带宽:
Annotation | 说明 |
kubernetes.io/ingress-bandwidth: 10M | 容器入方向最大带宽,示例值10Mbps。 |
kubernetes.io/egress-bandwidth: 30M | 容器出方向最大带宽,示例值30Mbps。 |
使用示例
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: demo
name: demo
namespace: default
spec:
selector:
matchLabels:
app: demo
template:
metadata:
annotations:
# 限制Pod入方向最大带宽为10Mbps
kubernetes.io/ingress-bandwidth: 10M
# 限制Pod出方向最大带宽为30Mbps
kubernetes.io/egress-bandwidth: 30M
labels:
app: demo
spec:
containers:
# 以下省略
开启集群带宽限制功能
执行以下命令,打开并编辑Flannel组件的ConfigMap。
kubectl edit cm -n kube-system kube-flannel-cfg
在
data.cni-conf.json
下,增加bandwidth
配置,见下方注释。请确保其为合法JSON格式,无多余和缺少逗号,所有符号均为英文半角格式。
修改完成后保存退出。
apiVersion: v1 data: cni-conf.json: | { "name": "cb0", "cniVersion":"0.3.1", "plugins": [ { "type": "flannel", "delegate": { "isDefaultGateway": true, "hairpinMode": true }, "dataDir": "/var/run/cni/flannel", "ipam": { "type": "host-local", "dataDir": "/var/run/cni/networks" } }, { "type": "portmap", "capabilities": { "portMappings": true }, "externalSetMarkChain": "KUBE-MARK-MASQ" }, # 增加以下 4 行,注意逗号 { "type": "bandwidth", "capabilities": {"bandwidth": true} } ] }
执行以下命令,删除所有Flannel容器使其自动重建容器,重建后配置开始生效。
删除重建Flannel不会影响存量业务的运行。
kubectl -n kube-system delete pod -l app=flannel
执行以下命令,确保所有Flannel容器处于Running状态。
kubectl -n kube-system get pod -o wide -l app=flannel
预期输出如下,说明Flannel容器正常运行。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-flannel-ds-h45zj 1/1 Running 0 67s 192.XX.XX.118 cn-hangzhou.192.XX.XX.118 <none> <none> kube-flannel-ds-mvfcw 1/1 Running 0 67s 192.XX.XX.119 cn-hangzhou.192.XX.XX.119 <none> <none>
执行以下命令,确保所有Flannel容器日志中没有异常。
kubectl -n kube-system logs <pod 名称>
预期输出如下,说明Flannel容器正常运行。
Defaulted container "kube-flannel" out of: kube-flannel, install-cni-plugin (init), install-cni (init) I0925 07:20:53.794715 1 main.go:219] CLI flags config: {etcdEndpoints:http://127.XX.XX.1:4001,http://127.XX.XX.1:2379 etcdPrefix:/coreos.com/network etcdKeyfile: etcdCertfile: etcdCAFile: etcdUsername: etcdPassword: help:false version:false autoDetectIPv4:false autoDetectIPv6:false kubeSubnetMgr:true kubeApiUrl: kubeAnnotationPrefix:flannel.alpha.coreos.com kubeConfigFile: iface:[] ifaceRegex:[] ipMasq:true subnetFile:/run/flannel/subnet.env subnetDir: publicIP: publicIPv6: subnetLeaseRenewMargin:60 healthzIP:0.0.0.0 healthzPort:0 charonExecutablePath: charonViciUri: iptablesResyncSeconds:5 iptablesForwardRules:true ipforwardResyncSeconds:600 netConfPath:/etc/kube-flannel/net-conf.json setNodeNetworkUnavailable:false} W0925 07:20:53.794782 1 client_config.go:608] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work. I0925 07:20:53.897149 1 kube.go:121] Node controller skips sync I0925 07:20:53.897176 1 main.go:239] Created subnet manager: Kubernetes Subnet Manager - cn-hangzhou.192.XX.XX.118