疼點:
繁瑣:每次登錄pod都要執行n條命令,kubectl get pod 獲取pod名字,然后kubectl exec -it 登錄pod
聯系作者:如有疑問可評論區留言, 或加本人微信咨詢q613230000, 請說明CSDN文章
躺著運維:
備注:如通過一鍵腳本工具,解決了哪些問題
1)快速登錄:bash pod.sh -p <pod_name> -e 即可快速登錄pod,用于替代kubectl exec -it
2)常見問題排查:是否有僵尸行程、pod埠是否監聽、到底有多少cpu_limit、node cpu多少
3) 一鍵輸出史上最相信的pod配額, 你無需再各種命令,一次過列印明細給你,躺著運維
目標:
開發一個一鍵腳本, 輸出pod資訊如:
1)配額:cpu_limit, ram_limit,
2)路徑: 對應node上的存盤路徑, pod占用存盤空間資訊,
3)Pod狀態: used cpu, used ram , 以及其他資訊
功能說明:
1) 引數說明
-e 一鍵登錄等效kubectl exec -it <pod_name> -- /bin/bash
-p 輸入pod_name , 無需輸入nameSpace(自動匹配), 且只需輸入pod_name關鍵字如dep2即可(完整pod_name dep2-647d655dfb-6bfvh)
2)命令示例 @一鍵登錄 dep2 (pod_name)
bash pod.sh -p dep2 -e

3)命令示例 @查看pod明細資訊 (cpu/ram) (path/container_id/其他)
bash pod.sh -p dep2

腳本代碼
前言:ok上干貨,效果圖請看上文, 腳本原始碼如下
使用:將以下原始碼copy到本地,明明為pod.sh/k8s_pod.sh都可以,bash pod.sh -p <你的pod名字>即可運行
備注: 原創不易,兄弟路過可點個贊, 如有新需求可留言,下個版本迭代
#!/bin/bash
# how to use: this shell script is to lookup container merge dir via pod_name
# usage: sh k8s_pod.sh -p <pod_name>
#. /tmp/import_function.sh
script_name=$0
while getopts "p:i:e" INPUT_OPT; do
case $INPUT_OPT in
p)INPUT_POD_NAME=$OPTARG;;
i)IS_LOOKUP_DOCKER_INSPECT=enable;;
e)IS_LOGIN_CONTAINER_VIA_KUBECTL_EXEC=enable;;
esac
done
format_1="%-25s%-55s\n"
format_2="%-25s%-55.1f\n"
format_3="%-25s%-10s%-25s\n"
print_color_blue() {
input_1="$*"; red=31; green=32; yellow=33; blue=34; white=37
color=$blue
printf "\033[4;${color}m${input_1}\033[0m\n"
}
sum_help=1
print_function_name() {
input_1=$1
input_2=$2
split_line="==================================="
print_color_blue "\n""["${sum_help}"]"$input_1""
sum_help=$((${sum_help}+1))
}
print_release_note() {
print_function_name $FUNCNAME
echo release_note: ::'6/12 v1.2 release for pod cpu/ram percentage lookup' | awk -F:: '{printf("'"$format_1"'",$1,$2)}'
}
print_usage() {
print_function_name $FUNCNAME
echo "
e.g: bash $script_name -p pod01 # pod short name, via cmd 'docker ps -a | grep <pod_short_name>'
e.g: bash $script_name -p pod01-xxx-yyy # pod full namae
" | sed "1d"
}
container_id_dir_cpuquota_ramquota_lookup() {
# lookup id/path/cpu/ram via podname and docker inspect
print_function_name $FUNCNAME
pod_name=`kubectl get pod -A |grep $INPUT_POD_NAME |awk '{print $2}'`
[ -z $pod_name ] && echo "error: pod name not exist , pls check: kubectl get pod -o wide |grep $INPUT_POD_NAME" && exit 88
pod_namespace=`kubectl get pod -A |grep $INPUT_POD_NAME |awk '{print $1}'`
container_id=`docker ps -a |grep $INPUT_POD_NAME |grep -v '/pause' |grep -v 'Exited' |awk '{print $1}'`
container_dir_merge=`docker inspect $container_id |grep merge |sed "s/ //g"`
container_dir_merge_only_value=`docker inspect $container_id |grep merge |sed "s/ //g"|awk -F: '{print $2}' |sed "s/\"//g; s/,//g"`
container_inspect_info=`docker inspect $container_id`
container_cpu_limit=`echo "$container_inspect_info" | cat -n |grep CpuQuota | awk -F: '{print $2}' |sed "s/,//g; s/ //g"`
container_ram_limit=`echo "$container_inspect_info" | cat -n |grep '"Memory"' | awk -F: '{print $2}' |sed "s/,//g; s/ //g"`
node_cpu_quota=`echo "$container_inspect_info" | cat -n |grep CpuPeriod | awk -F: '{print $2}' |sed "s/,//g; s/ //g"`
# output like: cpu/ram/node_cpu 50000=500m 1073741824=1Gi cpu=100000=1core
echo pod_name: $pod_name | awk '{printf("'"$format_1"'",$1,$2)}'
echo container_id: $container_id | awk '{printf("'"$format_1"'",$1,$2)}'
echo container_disk_path: $container_dir_merge_only_value | awk '{printf("'"$format_1"'",$1,$2)}'
# use awk -F:: as sperator
echo container_cpu_limit: ::${container_cpu_limit} ::'(e.g: 500 = 0.5 cpu_core)' | awk -F'::' '{printf("'"$format_3"'",$1,$2/100,$3)}' # cpu 50000=500m=0.5c
echo container_ram_limit'(MB)': $container_ram_limit | awk '{printf("'"$format_1"'",$1,$2/1024/1024)}' # ram 1073741824=1024MB
echo node_cpu_quota: ::${node_cpu_quota} ::'(e.g: 4000 = 4 cpu_core)' | awk -F'::' '{printf("'"$format_3"'",$1,$2/100,$3)}' # cpu 50000=500m=0.5c
}
container_cpu_mem_resource_lookup_via_id() {
print_function_name $FUNCNAME
container_pid=`ps aux |grep $container_id |grep -v grep |awk '{printf $2}'`
container_cpu_pct=`ps aux |grep $container_id |grep -v grep |grep -v Exited |awk '{printf $3}'`
container_mem_pct=`ps aux |grep $container_id |grep -v grep |grep -v Exited |awk '{printf $4}'`
container_mem_vsz=`ps aux |grep $container_id |grep -v grep |awk '{printf $5}'`
container_mem_rsz=`ps aux |grep $container_id |grep -v grep |awk '{printf $6}'`
echo container_pid: $container_pid | awk '{printf("'"$format_1"'",$1,$2)}'
echo container_cpu%: $container_cpu_pct | awk '{printf("'"$format_1"'",$1,$2)}'
echo container_mem%: $container_mem_pct | awk '{printf("'"$format_1"'",$1,$2)}'
echo container_mem_vsz'(MB)': $container_mem_vsz | awk '{printf("'"$format_2"'",$1,$2/1024)}'
echo container_mem_rsz'(MB)': $container_mem_rsz | awk '{printf("'"$format_2"'",$1,$2/1024)}'
}
node_cpu_mem_resource_lookup_via_shell() {
print_function_name $FUNCNAME
cpu_core=`lscpu |egrep '^CPU.s.:' |awk '{print $2}'`
cpu_load=`uptime |awk '{print $(NF-2),$(NF-1),$NF}'|sed "s/ /\//g"|sed "s/,//g"`
process_status=`ps aux --no-header |awk '{a[$8]++} END{for(i in a) print i,a[i]}'|sort -k2n|sed "s/ /_/g"|tr "\n" "/"`
tcp_socket_count=`ss -tn |grep -v State |cat -n|wc -l`
ram_total=`free -m|grep Mem:|awk '{print $2}'`
ram_free=`free -m|grep Mem:|awk '{print $4}'`
ram_free_available=`free -m|grep Mem:|awk '{print $NF}'`
ram_free_available_total=`echo $ram_free $ram_free_available $ram_total | sed "s/ /\//g"` # sed combine free/available/total
echo cpu_core: $cpu_core | awk '{printf("'"$format_1"'",$1,$2)}'
echo cpu_load: $cpu_load | awk '{printf("'"$format_1"'",$1,$2)}'
echo process_status: $process_status | awk '{printf("'"$format_1"'",$1,$2)}'
echo tcp_socket_count: $tcp_socket_count | awk '{printf("'"$format_1"'",$1,$2)}'
echo ram_total'(MB)': $ram_total | awk '{printf("'"$format_1"'",$1,$2)}'
echo ram_free'(MB)': $ram_free | awk '{printf("'"$format_1"'",$1,$2)}'
echo ram_free_available'(MB)': $ram_free_available | awk '{printf("'"$format_1"'",$1,$2)}'
echo ram_free_avail_total: $ram_free_available_total | awk '{printf("'"$format_1"'",$1,$2)}'
}
container_inside_process_and_socket_info() {
print_function_name $FUNCNAME
echo -e "--------------------ps aux--------------------"
kubectl -n $pod_namespace exec -it $pod_name -- ps aux
echo -e "--------------------netstat -tunlp--------------------"
kubectl -n $pod_namespace exec -it $pod_name -- netstat -tunlp
}
login_container_via_kubectl_exec() {
# need pod_name arg from function container_id_dir_lookup_via_podname
print_function_name $FUNCNAME
echo -e "login container successfully: $pod_name \n"
echo -e "please type exit if you want to exit container \n\n"
kubectl -n $pod_namespace exec -it $pod_name -- /bin/bash || kubectl -n $pod_namespace exec -it $pod_name -- /bin/sh
}
lookup_docker_inspect_info() {
print_function_name $FUNCNAME
docker inspect $container_id
}
#print_release_note
print_usage
container_id_dir_cpuquota_ramquota_lookup
container_cpu_mem_resource_lookup_via_id
node_cpu_mem_resource_lookup_via_shell
container_inside_process_and_socket_info
[ "$IS_LOOKUP_DOCKER_INSPECT" == "enable" ] && lookup_docker_inspect_info
[ "$IS_LOGIN_CONTAINER_VIA_KUBECTL_EXEC" == "enable" ] && login_container_via_kubectl_exec
echo -e "\n\n"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287257.html
標籤:其他
下一篇:linux下CMake的簡單介紹
