쿠버네티스 podPidsLimit 최적화: PID 계측 쉘 스크립트 실무

💡 핵심 요약 (Executive Summary)

본 가이드는 bash 쿠버네티스(Kubernetes) measure pids.sh 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents

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

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *