
# 通过配置容器内核参数增大监听队列长度
#### 使用场景
net.core.somaxconn默认监听队列（backlog）长度为128，当服务繁忙时，如果连接请求超过了监听队列的长度，新的连接请求将会被拒绝。为了避免这种情况的发生，您可以通过配置内核参数net.core.somaxconn来增大监听队列的长度。
#### 操作步骤
1. 修改kubelet配置。
   
   方式一：修改节点池kubelet配置（默认节点池不支持）
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，进入集群。
   
   2. 单击节点池后"更多 \> 配置管理"。
      图1节点池配置管理   
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001913224682.png "点击放大") 
   
   3. 修改kubelet配置参数，在"允许使用的不安全系统配置"中增加配置"\[net.core.somaxconn\]"。
      图2修改kubelet参数   
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001913223510.png "点击放大") 
    
   方式二：直接修改节点kubelet参数（不推荐）
   1. 登录节点。
   
   2. 编辑**/opt/cloud/cce/kubernetes/kubelet/kubelet** 文件。1.15之前版本为**/var/paas/kubernetes/kubelet/kubelet** 文件。
      开启net.core.somaxconn开关。
      ```
      --allowed-unsafe-sysctls=net.core.somaxconn
      ```
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001934170036.png "点击放大")
      
   
   3. 重启kubelet **systemctl restart kubelet**
      查看kubelet状态：
      **systemctl status kubelet**
      
    
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
   直接修改节点kubelet参数后，如果集群升级到更高版本或重置节点会导致配置被还原，请谨慎使用。建议使用修改节点池kubelet配置的方式。
   
   
2. （仅v1.25以下集群需执行）创建Pod安全策略。 
   在v1.25以下的CCE集群中kube-apiserver开启了Pod安全策略，需要在Pod安全策略的allowedUnsafeSysctls中增加net.core.somaxconn配置才能生效。关于CCE的安全策略介绍请参见[Pod安全策略配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0275.html)。
   示例如下：
   ```
   apiVersion: policy/v1beta1
   kind: PodSecurityPolicy
   metadata:
     annotations:
       seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
     name: sysctl-psp
   spec:
     allowedUnsafeSysctls:
     - net.core.somaxconn # 增加安全策略
     allowPrivilegeEscalation: true
     allowedCapabilities:
     - '*'
     fsGroup:
       rule: RunAsAny
     hostIPC: true
     hostNetwork: true
     hostPID: true
     hostPorts:
     - max: 65535
       min: 0
     privileged: true
     runAsGroup:
       rule: RunAsAny
     runAsUser:
       rule: RunAsAny
     seLinux:
       rule: RunAsAny
     supplementalGroups:
       rule: RunAsAny
     volumes:
     - '*'
   ```
   创建Pod安全策略sysctl-psp后，还需要为它绑定RBAC权限控制。
   示例如下：
   ```
   kind: ClusterRole
   apiVersion: rbac.authorization.k8s.io/v1
   metadata:
     name: sysctl-psp
   rules:
     - apiGroups:
         - "*"
       resources:
         - podsecuritypolicies
       resourceNames:
         - sysctl-psp
       verbs:
         - use
   ---
   apiVersion: rbac.authorization.k8s.io/v1
   kind: ClusterRoleBinding
   metadata:
     name: sysctl-psp
   roleRef:
     kind: ClusterRole
     name: sysctl-psp
     apiGroup: rbac.authorization.k8s.io
   subjects:
   - kind: Group
     name: system:authenticated
     apiGroup: rbac.authorization.k8s.io
   ```
   
   
3. 创建工作负载，并配置内核参数值，且需要与[1]中开启net.core.somaxconn的节点亲和。
   
   示例如下：
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     annotations:
       description: ''
     labels:
       appgroup: ''
     name: test1
     namespace: default
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: test1
     template:
       metadata:
         annotations:
           metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
         labels:
           app: test1
       spec:
         containers:
           - image: 'nginx:1.14-alpine-perl'
             name: container-0
             resources:
               requests:
                 cpu: 250m
                 memory: 512Mi
               limits:
                 cpu: 250m
                 memory: 512Mi
         imagePullSecrets:
           - name: default-secret
         securityContext: # 配置内核参数值
           sysctls:
             - name: net.core.somaxconn
               value: '3000'
         affinity:
           nodeAffinity: # 配置节点亲和
             requiredDuringSchedulingIgnoredDuringExecution:
               nodeSelectorTerms:
                 - matchExpressions:
                     - key: kubernetes.io/hostname
                       operator: In
                       values:
                         - 192.168.x.x       #节点名称
   ```
   
   
4. 进入容器查看参数配置是否生效。 
   ```
   kubectl exec -it <pod name> -- /bin/sh
   ```
   在容器中执行如下命令查询配置参数是否生效。
   ```
   sysctl -a |grep somax
   ```
   图3查看参数配置   
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001285120844.png "点击放大")
   
   
 
