Kubernetes Pod中的内核参数调整

背景

使用uwsgi部署了一个django的应用,并且使用Kubernetes来运行,但是运行以后老是报如下的错误,后来在网上查询了,是一个系统内核参数(net.core.somaxconn)太小了,默认是128.所以需要将它调整大一些。

uwsgi_proto_uwsgi_parser(): Resource temporarily unavailable [proto/uwsgi.c line 40]

简介

容器的系统内存参数不是通过echo 一个值到指定的文件,然后sysctl -p 就生效了。在docker 中可以使用 如下的命令来调整

docker run --sysctl net.core.somaxconn=1000 nginx

但是这K8S中,步骤稍微要复杂一点,主要是还需要修改kubelet的启动参数。

步骤

1. 修改kubelet的service文件

vi /etc/systemd/system/kubelet.service ,在启动命令中添加 --allowed-unsafe-sysctls=net.*

[root@ai-test-k8s07 ~]# cat /etc/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup'
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice/kubelet.service
ExecStart=/opt/kube/bin/kubelet \
  --config=/var/lib/kubelet/config.yaml \
  --cni-bin-dir=/opt/kube/bin \
  --cni-conf-dir=/etc/cni/net.d \
  --hostname-override=10.215.0.24 \
  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
  --network-plugin=cni \
  --pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.1 \
  --root-dir=/var/lib/kubelet \
  --v=2 \
  --allowed-unsafe-sysctls=net.*
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

2. 重新启动kubelet 

systemctl daemon-reload && systemctl restart kubelet

3. 在Pod中添加内存参数,我是直接在Deployment里面改,securityContext 这个里面定义需要修改的内核参数,如果有多个,就在sysctls下面添加就可以。

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels: 
    app: nginx

spec: 
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      securityContext:
        sysctls:
        - name: net.core.somaxconn
          value: "1000"
        - name: net.ipv4.tcp_keepalive_time
          value: "1200"
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 80

4. 运行这个Deployment

kubectl apply -f nginx.yaml

5. 进入容器查看内核参数

[root@master ~]# kubectl exec -it nginx-57b5f658d-44nq4 bash
root@nginx-57b5f658d-44nq4:/# cat /proc/sys/net/core/somaxconn
1000

 

你可能感兴趣的:(K8S)