Kubelet podPidsLimit Tuning: Container PID

๐Ÿ’ก Kubelet podPidsLimit Tuning: Container PID โ€” Executive Summary

Technical architectural analysis, practical configuration manifests, and deployment instructions for Kubelet podPidsLimit Tuning: Container PID.

Shell

Summary of usage based on 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
PID usage by container
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
Extract Max value
  • Aggregation of usage based on Pod
shell
cat /var/log/pod_pids_usage.log | sort -k 6 -n | tail -n 1
  • PID usage by container
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 *