本文介紹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