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 卡住現象