💡 핵심 요약 (Executive Summary)
본 가이드는 bash 쿠버네티스(Kubernetes) measure pids.sh 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.
Shell
Pod기준 사용량 합산
shell
#!/bin/bash
LOG_FILE="/var/log/pod_pids_usage.log"
KUBECONFIG_PATH="/etc/kubernetes/admin.conf"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
TMP_FILE=$(mktemp)
NODES=$(kubectl --kubeconfig=$KUBECONFIG_PATH get nodes -o jsonpath='{.items[*].metadata.name}')
for NODE in $NODES; do
RAW_METRICS=$(kubectl --kubeconfig=$KUBECONFIG_PATH get --raw "/api/v1/nodes/$NODE/proxy/metrics/cadvisor" 2>/dev/null)
if [ -z "$RAW_METRICS" ]; then continue; fi
echo "$RAW_METRICS" | grep '^container_threads{' | grep -v 'namespace="kube-system"' | awk '{
metric = $1
pids = $2
gsub(/[{,}]/, " ", metric)
ns=""; pod="-"; container=""
n = split(metric, parts, " ")
for(i=1; i<=n; i++) {
split(parts[i], kv, "=")
gsub(/"/, "", kv[2])
if(kv[1] == "namespace") ns=kv[2]
if(kv[1] == "pod") pod=kv[2]
if(kv[1] == "container") container=kv[2]
}
# 노드 토탈 및 container명 없는 노이즈 제외
if(ns == "" || container == "") next
# 네임스페이스와 파드명을 키로 하여 PID 누적 합산
pair = ns " | " pod
sum[pair] += pids
}
END {
# 합산된 결과를 파일에 임시 기록
for (p in sum) {
printf "%s | Total_PIDs: %d\n", p, sum[p]
}
}' >> "$TMP_FILE"
done
echo "--- Measurement at $TIMESTAMP (Pod Total Summed) ---" >> $LOG_FILE
if [ -s "$TMP_FILE" ]; then
# 중복 제거 및 파드 한도 정렬을 편하게 하기 위해 정렬 후 저장
sort -u "$TMP_FILE" >> $LOG_FILE
fi
rm -f "$TMP_FILE"
echo "" >> $LOG_FILE
Container별 pid사용량
shell
#!/bin/bash
# 로그 저장 경로
LOG_FILE="/var/log/pod_pids_usage.log"
KUBECONFIG_PATH="/etc/kubernetes/admin.conf"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
TMP_FILE=$(mktemp)
# 1. 모든 노드 목록 가져오기
NODES=$(kubectl --kubeconfig=$KUBECONFIG_PATH get nodes -o jsonpath='{.items[*].metadata.name}')
for NODE in $NODES; do
# 2. cAdvisor 메트릭 호출
RAW_METRICS=$(kubectl --kubeconfig=$KUBECONFIG_PATH get --raw "/api/v1/nodes/$NODE/proxy/metrics/cadvisor" 2>/dev/null)
if [ -z "$RAW_METRICS" ]; then continue; fi
# 3. 메트릭 파싱
echo "$RAW_METRICS" | grep '^container_threads{' | grep -v 'namespace="kube-system"' | awk '{
metric = $1
pids = $2
# 기호 치환
gsub(/[{,}]/, " ", metric)
ns=""; pod="-"; container=""
# 레이블 분리
n = split(metric, parts, " ")
for(i=1; i<=n; i++) {
split(parts[i], kv, "=")
gsub(/"/, "", kv[2])
if(kv[1] == "namespace") ns=kv[2]
if(kv[1] == "pod") pod=kv[2]
if(kv[1] == "container") container=kv[2]
}
# 네임스페이스가 없거나, 컨테이너 이름이 없는(1짜리 노이즈) 데이터는 완전히 제외
if(ns == "" || container == "") next
printf "%s | %s | %s | PIDs(Tasks): %d\n", ns, pod, container, pids
}' >> "$TMP_FILE"
done
# 4. 로그 기록
echo "--- Measurement at $TIMESTAMP ---" >> $LOG_FILE
if [ -s "$TMP_FILE" ]; then
sort -u "$TMP_FILE" >> $LOG_FILE
fi
rm -f "$TMP_FILE"
echo "" >> $LOG_FILE
Cron
shell
*/5 * * * * KUBECONFIG=/etc/kubernetes/admin.conf /bin/bash /sw/temp/2606-batch/measure_pids.sh >> /var/log/measure_pids_cron.log 2>&1
Max값 추출
- Pod기준 사용량 합산
shell
cat /var/log/pod_pids_usage.log | sort -k 6 -n | tail -n 1
- Container별 pid사용량
shell
cat /var/log/pod_pids_usage.log | sort -k 8 -n | tail -n 1
Leave a Reply