๐ก 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




Leave a Reply