为Pod配置带宽限制

本文介绍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:
      # 以下省略

开启集群带宽限制功能

  1. 执行以下命令,打开并编辑Flannel组件的ConfigMap。

    kubectl edit cm -n kube-system kube-flannel-cfg
  2. 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}
            }
          ]
        }
  1. 执行以下命令,删除所有Flannel容器使其自动重建容器,重建后配置开始生效。

    删除重建Flannel不会影响存量业务的运行。

    kubectl -n kube-system delete pod -l app=flannel
  1. 执行以下命令,确保所有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>
  1. 执行以下命令,确保所有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