k8s-修改線程數


1.背景:

(1)胖容器ssh登錄報錯:handshake error

(2)登錄宿主機后,觀察pod狀態為running,但是kubectl exec 和docker exec 均無法進入該容器,報錯如下

 

2.原因:

這種情況可能是容器內的業務進程發生線程泄露,通常是java程序引起

 

3.處理方式:

(1)登錄實例的宿主機上

(2)先檢查下有沒有登錄錯機器,執行 kubectl get namespaces | grep 那台實例的ns,有記錄就是沒錯。例如:kubectl get namespaces | grep lc-test

(3)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'     找出線程數高的容器

(4)進入對應容器的pid相關目錄,記住,是進入搜索得到的目錄。搜索到的是兩個目錄,需要到第二個記錄操作,就是pod的目錄下。而不是沒有cd直接就echo,此操作有風險,須知!!!

  若不確定自己容器的pids.max在哪個目錄下,可查找poduid定位

 

 

(5)echo 16000 >pids.max    修改線程數限制,記得分清楚目錄,如果搞成修改宿主機的線程數,可能會導致該宿主機上的實例全部掛了,有風險。

(6)如果可以停止或者重啟,可以登錄實例手動處理一下。命令:kubectl exec -it -n podns podname /bin/bash  eg:kubectl exec -it -n poseidon-monitor poseidon-monitor /bin/bash

備注:確認容器哪個進程的線程數較多:ps -ef |grep -v PID |awk '{print $2}' |xargs -I file sh -c 'echo -e file" \c" && cat /proc/file/status 2>/dev/null|grep Threads'|sort -unr -t : -k 2

           然后直接kill -9

 

(7)echo 15000 >pids.max   待修正后恢復該容器的最大線程限制為15000     

 

總結:這種案例的表現通常為,pod狀態running, kubectl,docker exec都無法進入容器,或者存在docker ps 卡住現象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM