k8s实例线程、内存、存储异常与标准化

一、实例的线程标准化

关于线程爆的问题: 由于k8s用户在使用的时候,通常没有关注到Pod的/proc/pid/cpuinfo,meminfo的实例规格信息默认和宿主机的是一致的,故程序默认使用容器的这个/proc/pid/cpuinfo设置默线程maxP(最大线程值),导致爆线程。平台可以给Pod做类似LXCFS之类的文件系统优化,让容器里面看到真实的cpu数据。当然另一种情况是,用户的程序并发控制确实存在问题(比如java线程池,python并发)

1、登录宿主机后,观察pod状态为running,但是kubectl exec 和docker exec 均无法进入该容器,报错如下
在这里插入图片描述
2、找出线程高于10000的容器

cd /sys/fs/cgroup/pids/kubepods && find -name pids.current |grep pod |xargs -I file sh -c 'echo -e file" \c" && cat file'|awk '$2 > 10000'     找出线程数高于N数值的容器

3、通过docker找到对应的id进入对应容器的pid相关目录,特殊情况的话可以临时放大Limit

4、通过kubelet限制每个Pod的线程上限5000,–feature-gates=SupportPodPidsLimit=true

[root@node01 ~]# ps -ef |grep kubelet
root     18735     1 14 11:19 ?        00:53:28 ./kubelet --v=1 --address=0.0.0.0 --feature-gates=SupportPodPidsLimit=true --pod-max-pids=5000 --allow-privileged=true --root-dir=/home/kubelet --node-status-update-frequency=5s --kubeconfig=/home/xbox/kubelet/conf/kubelet-kubeconfig --fail-swap-on=false --max-pods=254 --runtime-cgroups=/systemd/system.slice/frigga.service --kubelet-cgroups=/systemd/system.slice/frigga.service --make-iptables-util-chains=false

二、Pod内存OOM优化

1、查看申请内存失败次数高的实例,/sys/fs/cgroup/memory/kubepods目录下的文件有k8s对应的dockerid为名的限制文件,如果申请内存失败的次数一直在涨,其一是内存泄漏,其二是内存满了,这种可能导致用户实例异常

cd /sys/fs/cgroup/memory/kubepods && find -name "memory.failcnt"|xargs -I file sh -c 'echo -e file" \c" && cat file'|awk '$2 > "0"'

2、到/sys/fs/cgroup/memory/kubepods目录里面找到对应容器的下面两个文件
memory.limit_in_bytes
memory.uss
特殊情况的话可以临时放大Limit

3、Pod遇到OOM的时候,有的时候Pod的会关闭,有的时候不会,具体要看两点,先查/var/log/kern里面OOMkill的日志,要看pid/oom_score_adj的值,这个值越大越优先被Kill,如果没有Kill到主服务进程,Pod仍然会运行不退出,那主服务进程的优先级应该怎么设置呢?是由k8s调度的Qos定,(k8s源码指定当limit等于request的时候,容器进程为优先保障,pod的qos是最高级别, Guaranteed ,进程优先-998)容器的进程就受到保障,甚至在kubelet被系统级内存不足触发的OOMkill的时候Pod还在使用
在这里插入图片描述

三、实例底层存储(docker默认存储配置)

在用docker做Pod运行时通常是用户首选,因为体量大通用性强,不过在使用docker的时候,也是需要使用宿主机本身host存储,
通常我们标准化可以给每个运行时限制使用的存储,具体配置到 /etc/docker/daemon.json

...
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true",
    "overlay2.size=50G"
  ],
...

四、实例的文件描述符

同样配置到/etc/daemom.json

...
  "data-root": "/var/lib/docker",
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 2000000,
      "Soft": 2000000
    },
...  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值