Kubernetes: ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด๋ ค๋ฉด ๊ฐ„๋‹จํ•œ kubectl ๋ช…๋ น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 11์›” 19์ผ  ยท  88์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: kubernetes/kubernetes

์‚ฌ์šฉ์ž๋Š” ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์ผ์ •์„ ์žก์„ ์ˆ˜ ์—†๋Š” ํฌ๋“œ์— ๊ฑธ๋ ค ๋„˜์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋“œ๊ฐ€ ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ์— ์˜ˆ์•ฝํ•  ๊ณต๊ฐ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋“œ๊ฐ€ ๋ณด๋ฅ˜ ์ค‘์ธ ์‹œ๊ธฐ๋ฅผ ์•Œ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. http://kubernetes.io/v1.1/docs/user-guide/compute-resources.html#monitoring -compute-resource-usage๊ฐ€ ๋„์›€์ด ๋˜์ง€๋งŒ ๊ฒ€์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” 'get'์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋“œ๊ฐ€ ๋จผ์ € ๋ณด๋ฅ˜ ์ค‘์ด๊ณ  ์ž ์‹œ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋ณด๋ฅ˜ ์ค‘ '๊ณ ์ •'์„ ํ™•์ธํ•œ ํ›„์—์•ผ '์„ค๋ช…'์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ๋ฌธ์ œ์ž„์„ ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค).

์ด๊ฒƒ์€ ์‹œ์Šคํ…œ ํฌ๋“œ๊ฐ€ ์ˆจ๊ฒจ์ง„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ํฌ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ '๊ณ„์‚ฐ'ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์ด์ƒ์ ์ผ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

1) "์˜ˆ์•ฝ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์‹คํŒจํ•จ"์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ณด๋ฅ˜ ์ค‘์ด ์•„๋‹Œ ์ƒˆ ํฌ๋“œ ์ƒํƒœ๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

2) kubectl get po ๋˜๋Š” kubectl get po -o=wide ์—ด์„ ํ‘œ์‹œํ•˜์—ฌ ๋ณด๋ฅ˜ ์ค‘์ธ ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ ๋Œ€๊ธฐ ์ค‘์ธ container.state ๋˜๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ event.message).

3) ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ โ€‹โ€‹์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ kubectl ๋ช…๋ น์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋…ธ๋“œ CPU ๋ฐ Mem๋‹น ์ด ํด๋Ÿฌ์Šคํ„ฐ CPU ๋ฐ Mem ๋ฐ ๊ฐ ํฌ๋“œ/์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๋Š” "kubectl ์‚ฌ์šฉ๋Ÿ‰"์„ ์ƒ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์‹œ์Šคํ…œ ํฌ๋“œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํฌ๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๋ณต์žกํ•œ ์Šค์ผ€์ค„๋Ÿฌ์™€ ํ•จ๊ป˜ ์žฅ๊ธฐ์ ์œผ๋กœ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์ง€๋งŒ ๋‹จ์ผ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค('์ถฉ๋ถ„ํžˆ ํฐ ๊ตฌ๋ฉ ์—†์Œ' ๋ฌธ์ œ ์ง„๋‹จ).

kinfeature prioritbacklog sicli

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์žˆ์Šต๋‹ˆ๋‹ค:

$ kubectl top nodes
NAME                    CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   
cluster1-k8s-master-1   312m         15%       1362Mi          68%       
cluster1-k8s-node-1     124m         12%       233Mi           11% 

๋ชจ๋“  88 ๋Œ“๊ธ€

UX ์‚ฌ๋žŒ๋“ค์ด ๋‚˜๋ณด๋‹ค ๋” ์ž˜ ์•Œ๊ฒ ์ง€๋งŒ (2)์˜ ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ญ”๊ฐ€๊ฐ€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

(3) #15743๊ณผ ๋ชจํ˜ธํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ฒฐํ•ฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๊ฐ€๊นŒ์šด์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๊ฒฝ์šฐ ์™ธ์—๋„ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ๋„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

kubectl utilization requests ๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Œ( kubectl util ๋˜๋Š” kubectl usage ์ด ๋” ์ข‹๊ฑฐ๋‚˜ ๋” ์งง์„ ์ˆ˜ ์žˆ์Œ):

cores: 4.455/5 cores (89%)
memory: 20.1/30 GiB (67%)
...

์ด ์˜ˆ์—์„œ ์ง‘๊ณ„ ์ปจํ…Œ์ด๋„ˆ ์š”์ฒญ์€ 4.455๊ฐœ ์ฝ”์–ด ๋ฐ 20.1GiB์ด๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— 5๊ฐœ ์ฝ”์–ด ๋ฐ 30GiB๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์žˆ์Šต๋‹ˆ๋‹ค:

$ kubectl top nodes
NAME                    CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   
cluster1-k8s-master-1   312m         15%       1362Mi          68%       
cluster1-k8s-node-1     124m         12%       233Mi           11% 

๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ๋น ๋ฅด๊ฒŒ ๋ณด๋ ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

kubectl describe nodes

kubectl describe nodes ์˜ ์ถœ๋ ฅ์„ "ํ˜•์‹ํ™”"ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ/์ œํ•œ์„ ์š”์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์Šคํฌ๋ฆฝํŒ…ํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ํ•ดํ‚น์ด ์žˆ์Šต๋‹ˆ๋‹ค kubectl describe nodes | grep -A 2 -e "^\\s*CPU Requests"

@from-nily ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋‚ด๊ฐ€ ์ฐพ๋˜ ๋ฐ”๋กœ ๊ทธ ๊ฒƒ

์˜ˆ, ์ด๊ฒƒ์€ ๋‚ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

$ cat bin/node-resources.sh 
#!/bin/bash
set -euo pipefail

echo -e "Iterating...\n"

nodes=$(kubectl get node --no-headers -o custom-columns=NAME:.metadata.name)

for node in $nodes; do
  echo "Node: $node"
  kubectl describe node "$node" | sed '1,/Non-terminated Pods/d'
  echo
done

@goltermann ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์„œ๋ช… ๋ ˆ์ด๋ธ”์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํ†ตํ•ด ์„œ๋ช… ๋ ˆ์ด๋ธ” ์„
(1) ์‹œ๊ทธ ์–ธ๊ธ‰: @kubernetes/sig-<team-name>-misc
(2) ์ˆ˜๋™์œผ๋กœ ๋ ˆ์ด๋ธ” ์ง€์ •: /sig <label>

_์ฐธ๊ณ : ๋ฐฉ๋ฒ• (1)์€ ํŒ€์— ์•Œ๋ฆผ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์—์„œ ํŒ€ ๋ชฉ๋ก์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค._

@ kubernetes / sig-cli-misc

์•„๋ž˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ CPU ์‚ฌ์šฉ๋ฅ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

alias util='kubectl get nodes | grep node | awk '\''{print $1}'\'' | xargs -I {} sh -c '\''echo   {} ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- ; echo '\'''
Note: 4000m cores is the total cores in one node
alias cpualloc="util | grep % | awk '{print \$1}' | awk '{ sum += \$1 } END { if (NR > 0) { result=(sum**4000); printf result/NR \"%\n\" } }'"

$ cpualloc
3.89358%
Note: 1600MB is the total cores in one node
alias memalloc='util | grep % | awk '\''{print $3}'\'' | awk '\''{ sum += $1 } END { if (NR > 0) { result=(sum*100)/(NR*1600); printf result/NR "%\n" } }'\'''

$ memalloc
24.6832%

@tomfotherby alias util='kubectl get nodes | grep node | awk '\''{print $1}'\'' | xargs -I {} sh -c '\''echo {} ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- ; echo '\'''

@alok87 - ๋ณ„์นญ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” bash ๋ฐ m3.large ์ธ์Šคํ„ด์Šค ์œ ํ˜•(2 cpu , 7.5G ๋ฉ”๋ชจ๋ฆฌ)์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

alias util='kubectl get nodes --no-headers | awk '\''{print $1}'\'' | xargs -I {} sh -c '\''echo {} ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- ; echo '\'''

# Get CPU request total (we x20 because because each m3.large has 2 vcpus (2000m) )
alias cpualloc='util | grep % | awk '\''{print $1}'\'' | awk '\''{ sum += $1 } END { if (NR > 0) { print sum/(NR*20), "%\n" } }'\'''

# Get mem request total (we x75 because because each m3.large has 7.5G ram )
alias memalloc='util | grep % | awk '\''{print $5}'\'' | awk '\''{ sum += $1 } END { if (NR > 0) { print sum/(NR*75), "%\n" } }'\'''
$util
ip-10-56-0-178.ec2.internal
  CPU Requests  CPU Limits  Memory Requests Memory Limits
  960m (48%)    2700m (135%)    630Mi (8%)  2034Mi (27%)

ip-10-56-0-22.ec2.internal
  CPU Requests  CPU Limits  Memory Requests Memory Limits
  920m (46%)    1400m (70%) 560Mi (7%)  550Mi (7%)

ip-10-56-0-56.ec2.internal
  CPU Requests  CPU Limits  Memory Requests Memory Limits
  1160m (57%)   2800m (140%)    972Mi (13%) 3976Mi (53%)

ip-10-56-0-99.ec2.internal
  CPU Requests  CPU Limits  Memory Requests Memory Limits
  804m (40%)    794m (39%)  824Mi (11%) 1300Mi (17%)

cpualloc 
48.05 %

$ memalloc 
9.95333 %

https://github.com/kubernetes/kubernetes/issues/17512#issuecomment -267992922 kubectl top ๋Š” ํ• ๋‹น์ด ์•„๋‹Œ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ• ๋‹น์€ insufficient CPU ๋ฌธ์ œ์˜ ์›์ธ์ž…๋‹ˆ๋‹ค. ์ฐจ์ด์ ์— ๋Œ€ํ•œ ์ด ๋ฌธ์ œ์—๋Š” ๋งŽ์€ ํ˜ผ๋ž€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

AFAICT, ์š”์ฒญ์ด ์‚ฌ์–‘์˜ ์ปจํ…Œ์ด๋„ˆ๋ณ„๋กœ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋“œ๋ณ„ ๋…ธ๋“œ CPU ํ• ๋‹น ๋ณด๊ณ ์„œ๋ฅผ ์–ป๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  .spec.containers[*].requests ์— limits / requests ํ•„๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์—†์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ต์Šต๋‹ˆ๋‹ค(๋‚ด ๊ฒฝํ—˜์ƒ)

/cc @mysterikkit

์ด ์‰˜ ์Šคํฌ๋ฆฝํŒ… ํŒŒํ‹ฐ์— ์ฐธ์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ถ•์†Œ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ CA๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ด์ „ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. AWS ๊ฒฝ๋กœ ์ œํ•œ์— ๋„๋‹ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋žต์ ์ธ ์–‘์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

#!/bin/bash

set -e

KUBECTL="kubectl"
NODES=$($KUBECTL get nodes --no-headers -o custom-columns=NAME:.metadata.name)

function usage() {
    local node_count=0
    local total_percent_cpu=0
    local total_percent_mem=0
    local readonly nodes=$@

    for n in $nodes; do
        local requests=$($KUBECTL describe node $n | grep -A2 -E "^\\s*CPU Requests" | tail -n1)
        local percent_cpu=$(echo $requests | awk -F "[()%]" '{print $2}')
        local percent_mem=$(echo $requests | awk -F "[()%]" '{print $8}')
        echo "$n: ${percent_cpu}% CPU, ${percent_mem}% memory"

        node_count=$((node_count + 1))
        total_percent_cpu=$((total_percent_cpu + percent_cpu))
        total_percent_mem=$((total_percent_mem + percent_mem))
    done

    local readonly avg_percent_cpu=$((total_percent_cpu / node_count))
    local readonly avg_percent_mem=$((total_percent_mem / node_count))

    echo "Average usage: ${avg_percent_cpu}% CPU, ${avg_percent_mem}% memory."
}

usage $NODES

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ip-REDACTED.us-west-2.compute.internal: 38% CPU, 9% memory
...many redacted lines...
ip-REDACTED.us-west-2.compute.internal: 41% CPU, 8% memory
ip-REDACTED.us-west-2.compute.internal: 61% CPU, 7% memory
Average usage: 45% CPU, 15% memory.

top ๋ช…๋ น์—๋Š” pod ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl top pod

ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ํ• ๋‹น์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ kubectl get po --all-namespaces -o=jsonpath="{range .items[*]}{.metadata.namespace}:{.metadata.name}{'\n'}{range .spec.containers[*]}  {.name}:{.resources.requests.cpu}{'\n'}{end}{'\n'}{end}"

๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

kube-system:heapster-v1.5.0-dc8df7cc9-7fqx6
  heapster:88m
  heapster-nanny:50m
kube-system:kube-dns-6cdf767cb8-cjjdr
  kubedns:100m
  dnsmasq:150m
  sidecar:10m
  prometheus-to-sd:
kube-system:kube-dns-6cdf767cb8-pnx2g
  kubedns:100m
  dnsmasq:150m
  sidecar:10m
  prometheus-to-sd:
kube-system:kube-dns-autoscaler-69c5cbdcdd-wwjtg
  autoscaler:20m
kube-system:kube-proxy-gke-cluster1-default-pool-cd7058d6-3tt9
  kube-proxy:100m
kube-system:kube-proxy-gke-cluster1-preempt-pool-57d7ff41-jplf
  kube-proxy:100m
kube-system:kubernetes-dashboard-7b9c4bf75c-f7zrl
  kubernetes-dashboard:50m
kube-system:l7-default-backend-57856c5f55-68s5g
  default-http-backend:10m
kube-system:metrics-server-v0.2.0-86585d9749-kkrzl
  metrics-server:48m
  metrics-server-nanny:5m
kube-system:tiller-deploy-7794bfb756-8kxh5
  tiller:10m

์ด์ƒํ•˜๋‹ค. ํ• ๋‹น ์šฉ๋Ÿ‰์— ๋„๋‹ฌํ–ˆ๊ฑฐ๋‚˜ ๊ฑฐ์˜ ๋„๋‹ฌํ•œ ์‹œ์ ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฝค ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋†’์€ %๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ†ต๊ณ„์ธ์ง€ ํ…์ŠคํŠธ ์˜ค๋ฅ˜์ธ์ง€... ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์••๋‹ˆ๊นŒ? ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์—์„œ ํ•ญ์ƒ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

https://github.com/dpetzold/kube-resource-explorer/ ๋ฅผ ์ฃผ์†Œ #3์œผ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ์ƒ˜ํ”Œ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.

$ ./resource-explorer -namespace kube-system -reverse -sort MemReq
Namespace    Name                                               CpuReq  CpuReq%  CpuLimit  CpuLimit%  MemReq    MemReq%  MemLimit  MemLimit%
---------    ----                                               ------  -------  --------  ---------  ------    -------  --------  ---------
kube-system  event-exporter-v0.1.7-5c4d9556cf-kf4tf             0       0%       0         0%         0         0%       0         0%
kube-system  kube-proxy-gke-project-default-pool-175a4a05-mshh  100m    10%      0         0%         0         0%       0         0%
kube-system  kube-proxy-gke-project-default-pool-175a4a05-bv59  100m    10%      0         0%         0         0%       0         0%
kube-system  kube-proxy-gke-project-default-pool-175a4a05-ntfw  100m    10%      0         0%         0         0%       0         0%
kube-system  kube-dns-autoscaler-244676396-xzgs4                20m     2%       0         0%         10Mi      0%       0         0%
kube-system  l7-default-backend-1044750973-kqh98                10m     1%       10m       1%         20Mi      0%       20Mi      0%
kube-system  kubernetes-dashboard-768854d6dc-jh292              100m    10%      100m      10%        100Mi     3%       300Mi     11%
kube-system  kube-dns-323615064-8nxfl                           260m    27%      0         0%         110Mi     4%       170Mi     6%
kube-system  fluentd-gcp-v2.0.9-4qkwk                           100m    10%      0         0%         200Mi     7%       300Mi     11%
kube-system  fluentd-gcp-v2.0.9-jmtpw                           100m    10%      0         0%         200Mi     7%       300Mi     11%
kube-system  fluentd-gcp-v2.0.9-tw9vk                           100m    10%      0         0%         200Mi     7%       300Mi     11%
kube-system  heapster-v1.4.3-74b5bd94bb-fz8hd                   138m    14%      138m      14%        301856Ki  11%      301856Ki  11%

@shtouff

root<strong i="7">@debian9</strong>:~# kubectl get po -n chenkunning-84 -o=jsonpath="{range .items[*]}{.metadata.namespace}:{.metadata.name}{'\n'}{range .spec.containers[*]}  {.name}:{.resources.requests.cpu}{'\n'}{end}{'\n'}{end}"
error: error parsing jsonpath {range .items[*]}{.metadata.namespace}:{.metadata.name}{'\n'}{range .spec.containers[*]}  {.name}:{.resources.requests.cpu}{'\n'}{end}{'\n'}{end}, unrecognized character in action: U+0027 '''
root<strong i="8">@debian9</strong>:~# kubectl version
Client Version: version.Info{Major:"1", Minor:"6+", GitVersion:"v1.6.7-beta.0+$Format:%h$", GitCommit:"bb053ff0cb25a043e828d62394ed626fda2719a1", GitTreeState:"dirty", BuildDate:"2017-08-26T09:34:19Z", GoVersion:"go1.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"6+", GitVersion:"v1.6.7-beta.0+$Format:84c3ae0384658cd40c1d1e637f5faa98cf6a965c$", GitCommit:"3af2004eebf3cbd8d7f24b0ecd23fe4afb889163", GitTreeState:"clean", BuildDate:"2018-04-04T08:40:48Z", GoVersion:"go1.8.1", Compiler:"gc", Platform:"linux/amd64"}

@harryge00 : U+0027์€ ๋‘ฅ๊ทผ ๋”ฐ์˜ดํ‘œ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@nfirvine ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

kubectl get pods -n my-ns -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].resources.limits.cpu} {"\n"}{end}' |awk '{sum+=$2 ; print $0} END{print "sum=",sum}'

๊ฐ๊ฐ 1๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋งŒ ํฌํ•จํ•˜๋Š” ํŒŸ(Pod)์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@xmik ์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” k8 1.7์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  hepaster๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. $ kubectl top nodes --heapster-namespace=kube-system์„ ์‹คํ–‰ํ•˜๋ฉด "์˜ค๋ฅ˜: ๋ฉ”ํŠธ๋ฆญ์„ ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ"์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@abusheb :

  1. kubectl top ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: --heapster-namespace . ํŽธ์ง‘: ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์˜ณ์•˜์Šต๋‹ˆ๋‹ค: https://github.com/kubernetes/kubernetes/issues/44540#issuecomment -362882035 .
  2. "์˜ค๋ฅ˜: ๋ฉ”ํŠธ๋ฆญ์„ ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ"์ด ํ‘œ์‹œ๋˜๋ฉด ํž™์Šคํ„ฐ ๋ฐฐํฌ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋กœ๊ทธ๋Š” ๋ฌด์—‡์„ ๋งํ•ฉ๋‹ˆ๊นŒ? ํž™์Šคํ„ฐ ์„œ๋น„์Šค๋Š” ๊ดœ์ฐฎ์€๋ฐ ์—”๋“œํฌ์ธํŠธ๋Š” <none> ๊ฐ€ ์•„๋‹ˆ๋‚˜์š”? kubectl -n kube-system describe svc/heapster ์™€ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ํ›„์ž๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@xmik ๋งž์Šต๋‹ˆ๋‹ค . ํž™์Šคํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ GPU ์‚ฌ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์ด ์ตœ์ƒ์œ„ ๋ช…๋ น์€ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ชจ๋ฅธ๋‹ค. :(

@abushoeb "์˜ค๋ฅ˜: ๋ฉ”ํŠธ๋ฆญ์„ ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ณ ์ณค์Šต๋‹ˆ๊นŒ?

@avgKol์€ ๋จผ์ € ํž™์Šคํ„ฐ ๋ฐฐํฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์ œ๋Œ€๋กœ ๋ฐฐํฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ curl -L http://heapster-pod-ip:heapster-service-port/api/v1/model/metrics/ ์™€ ๊ฐ™์€ CURL ๋ช…๋ น์„ ํ†ตํ•ด ๋ฉ”ํŠธ๋ฆญ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ํž™์Šคํ„ฐ ํฌ๋“œ ๋ฐ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. hepster ๋ฉ”ํŠธ๋ฆญ์€ ์ด์™€ ๊ฐ™์ด ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด Kubernetes ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰(๋ฐ ๋น„์šฉ)์— ๋Œ€ํ•œ ์ •์  HTML์„ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/hjacobs/kube-resource-report

@hjacobs ๋‚˜๋Š” ๊ทธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜/์‚ฌ์šฉํ•˜๋Š” ํŒฌ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋„์ปค ์ด๋ฏธ์ง€๋กœ ํŒจํ‚ค์ง•ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@tonglil ํ”„๋กœ์ ํŠธ๋Š” ๊ฝค ์ดˆ๊ธฐ์ด์ง€๋งŒ ๋‚ด ๊ณ„ํš์€ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Docker ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. kubectl apply -f .. ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์›น์„œ๋ฒ„.

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl get nodes -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.status.allocatable.memory}{'\t'}{.status.allocatable.cpu}{'\n'}{end}"

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ip-192-168-101-177.us-west-2.compute.internal   251643680Ki 32
ip-192-168-196-254.us-west-2.compute.internal   251643680Ki 32

@tonglil Docker ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/hjacobs/kube-resource-report

90์ผ ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ถ€์‹คํ•ด์ง‘๋‹ˆ๋‹ค.
/remove-lifecycle stale ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ตœ์‹ ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
๋ถ€์‹ค ๋ฌธ์ œ๋Š” ์ถ”๊ฐ€๋กœ 30์ผ ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ฉ๊ณ  ๊ฒฐ๊ตญ ๋‹ซํž™๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ง€๊ธˆ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋ฉด /close .

sig-testing, kubernetes/test-infra ๋ฐ/๋˜๋Š” fejta์— ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.
/์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ถ€์‹ค

/remove-lifecycle ๋ถ€์‹ค

๋งค๋‹ฌ ์ •๋„, ๋‚ด ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์€ ๋‚˜๋ฅผ ์ด ๋ฌธ์ œ๋กœ ๋‹ค์‹œ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ๊ธด jq ๋ฌธ์ž์—ด ๋˜๋Š” ๋งŽ์€ ๊ณ„์‚ฐ์ด ํฌํ•จ๋œ Grafana ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ํ†ต๊ณ„๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์ด ์žˆ์œผ๋ฉด _๋„ˆ๋ฌด_ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# kubectl utilization cluster
cores: 19.255/24 cores (80%)
memory: 16.4/24 GiB (68%)

# kubectl utilization [node name]
cores: 3.125/4 cores (78%)
memory: 2.1/4 GiB (52%)

( @chrishiesand ๊ฐ€ ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌ).

๋‚˜๋Š” ์ข…์ข… ์ผ์ฃผ์ผ์— ์ˆ˜์‹ญ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ํŒŒ๊ดดํ•˜๋ฉฐ, ์ž๋™ํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ์…ธ ๋ณ„์นญ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ "์ด๋ ‡๊ฒŒ ๋งŽ์€ ์„œ๋ฒ„๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ์ด ์•ฑ์„ ๋ฒ„๋ฆฐ๋‹ค๋ฉด ๊ทธ๋“ค์— ๋Œ€ํ•œ ๋‚˜์˜ ์ „๋ฐ˜์ ์ธ ํ™œ์šฉ๋„/์••๋ ฅ์€ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ?"

ํŠนํžˆ ๋” ์ž‘๊ฑฐ๋‚˜ ๋” ๋‚œํ•ดํ•œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ ๋‹ฌ์— ์ž๋™ ํฌ๊ธฐ ์กฐ์ •์„ ์„ค์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ(์ผ๋ฐ˜์ ์œผ๋กœ ๊ธˆ์ „์  ์ด์œ ), ์‚ฌ์†Œํ•œ ํฌ๋“œ ์ž๋™ ํฌ๊ธฐ ์กฐ์ • ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์š”์ฒญ -- ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ณ„๋กœ ํ•ฉ์‚ฐ๋œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค(์ตœ์†Œํ•œ ๋ฐฐํฌ/๋ ˆ์ด๋ธ”๋ณ„๋„ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@geerlingguy๊ฐ€ ์„ค๋ช…ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ž‘์€ ํ”Œ๋Ÿฌ๊ทธ์ธ kubectl-view-utilization์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค . krew ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•œ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ BASH์—์„œ ๊ตฌํ˜„๋˜๋ฉฐ awk์™€ bc๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
kubectl ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ต์‹ฌ ๋„๊ตฌ์—์„œ ์™„์ „ํžˆ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์ด ๋„์ „์— ์ง๋ฉดํ•ด ์žˆ์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ๊ฐœ์š”๋ฅผ ์–ป๊ณ  ๊ถ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” Kube Eagle(prometheus ๋‚ด๋ณด๋‚ด๊ธฐ)์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/google-cloud-tools/kube-eagle

Kubernetes Resource monitoring dashboard

์ด๊ฒƒ์€ ํ…Œ์ด๋ธ” ํ˜•์‹์œผ๋กœ ์‹ค์ œ ๋…ธ๋“œ ์‚ฌ์šฉ๋ฅ ์„ ๊ฐ€์ ธ์˜ค๋Š” python ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.
https://github.com/amelbakry/kube-node-utilization

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋…ธ๋“œ ํ™œ์šฉ...........
+------------------------------------------------+ ------+--------+
| ๋…ธ๋“œ ์ด๋ฆ„ | CPU | ๋ฉ”๋ชจ๋ฆฌ |
+------------------------------------------------+ ------+--------+
| ip-176-35-32-139.eu-central-1.compute.internal | 13.49% | 60.87% |
| ip-176-35-26-21.eu-central-1.compute.internal | 5.89% | 15.10% |
| ip-176-35-9-122.eu-central-1.compute.internal | 8.08% | 65.51% |
| ip-176-35-22-243.eu-central-1.compute.internal | 6.29% | 19.28% |
+------------------------------------------------+ ------+--------+

์ ์–ด๋„ @amelbakry ์—๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ํ™œ์šฉ์ž…๋‹ˆ๋‹ค. "๋จธ์‹ ์„ ๋” ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋‚˜์š”?" / "์ผ๋ถ€ ๊ธฐ๊ณ„๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋‚˜์š”?" / "ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ณง ํ™•์žฅ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?" ..

์ž„์‹œ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ๋Ÿ‰์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ํฌ๋“œ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์œ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด ํžŒํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl get pods -o json -n kube-system | jq -r '.items[] | .metadata.name + " \n Req. RAM: " + .spec.containers[].resources.requests.memory + " \n Lim. RAM: " + .spec.containers[].resources.limits.memory + " \n Req. CPU: " + .spec.containers[].resources.requests.cpu + " \n Lim. CPU: " + .spec.containers[].resources.limits.cpu + " \n Req. Eph. DISK: " + .spec.containers[].resources.requests["ephemeral-storage"] + " \n Lim. Eph. DISK: " + .spec.containers[].resources.limits["ephemeral-storage"] + "\n"'
...
kube-proxy-xlmjt
 Req. RAM: 32Mi
 Lim. RAM: 256Mi
 Req. CPU: 100m
 Lim. CPU:
 Req. Eph. DISK: 100Mi
 Lim. Eph. DISK: 512Mi
...
echo "\nRAM Requests TOTAL:" && kubectl describe namespace kube-system | grep 'requests.memory' && echo "\nRAM Requests:\n" && kubectl get pods -o json -n kube-system | jq -r '.items[] | .spec.containers[].resources.requests.memory + " | " + .metadata.name'

echo "\nRAM Limits TOTAL:" && kubectl describe namespace kube-system | grep 'limits.memory' &&  echo "\nRAM Limits:\n" && kubectl get pods -o json -n kube-system | jq -r '.items[] | .spec.containers[].resources.limits.memory + " | " + .metadata.name'

echo "\nCPU Requests TOTAL:" && kubectl describe namespace kube-system | grep 'requests.cpu' &&  echo "\nCPU Requests:\n" && kubectl get pods -o json -n kube-system | jq -r '.items[] | .spec.containers[].resources.requests.cpu + " | " + .metadata.name'

echo "\nCPU Limits TOTAL:" && kubectl describe namespace kube-system | grep 'limits.cpu' &&  echo "\nCPU Limits:\n" && kubectl get pods -o json -n kube-system | jq -r '.items[] | .spec.containers[].resources.limits.cpu + " | " + .metadata.name'

echo "\nEph. DISK Requests TOTAL:" && kubectl describe namespace kube-system | grep 'requests.ephemeral-storage' && echo "\nEph. DISK Requests:\n" && kubectl get pods -o json -n kube-system | jq -r '.items[] | .spec.containers[].resources.requests["ephemeral-storage"] + " | " + .metadata.name'

echo "\nEph. DISK Limits TOTAL:" && kubectl describe namespace kube-system | grep 'limits.ephemeral-storage' && echo "\nEph. DISK Limits:\n" && kubectl get pods -o json -n kube-system | jq -r '.items[] | .spec.containers[].resources.limits["ephemeral-storage"] + " | " + .metadata.name'

RAM Requests TOTAL:
 requests.memory               3504Mi   16Gi

RAM Requests:

64Mi | aws-alb-ingress-controller-6b569b448c-jzj6f
...

@kivagant-ba ์ด ์กฐ๊ฐ์„ ์‹œ๋„ํ•˜์—ฌ ๋…ธ๋“œ๋‹น ํฌ๋“œ ๋ฉ”ํŠธ๋ฆญ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/amelbakry/kube-node-utilization

def get_pod_metrics_per_node(๋…ธ๋“œ):
pod_metrics = "/api/v1/pods?fieldSelector=spec.nodeName%3D" + ๋…ธ๋“œ
์‘๋‹ต = api_client.call_api(pod_metrics,
'GET', auth_settings=['BearerToken'],
response_type='json', _preload_content=False)

์‘๋‹ต = json.loads(์‘๋‹ต[0].data.decode('utf-8'))

์‘๋‹ต์„ ๋ฐ˜ํ™˜

@kierenj ๋‚ด ์ƒ๊ฐ์—๋Š” ์–ด๋–ค ํด๋ผ์šฐ๋“œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํฌ๊ธฐ ์กฐ์ • ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์šฉ๋Ÿ‰์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

90์ผ ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ถ€์‹คํ•ด์ง‘๋‹ˆ๋‹ค.
/remove-lifecycle stale ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ตœ์‹ ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
๋ถ€์‹ค ๋ฌธ์ œ๋Š” ์ถ”๊ฐ€๋กœ 30์ผ ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ฉ๊ณ  ๊ฒฐ๊ตญ ๋‹ซํž™๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ง€๊ธˆ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋ฉด /close .

sig-testing, kubernetes/test-infra ๋ฐ/๋˜๋Š” fejta์— ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.
/์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ถ€์‹ค

/remove-lifecycle ๋ถ€์‹ค

๋‚˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CLI(์˜ˆ: AWS ASG)๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•ดํ‚น์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ช‡ ๋…„ ๋™์•ˆ ๊ณ„์† ์—ฌ๊ธฐ๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.

@etopeter ๋ฉ‹์ง„ CLI ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹จ์ˆœํ•จ์„ ์‚ฌ๋ž‘ํ•˜์‹ญ์‹œ์˜ค. ์ˆซ์ž์™€ ์ •ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์กฐ์–ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ˆ„๊ตฌ๋“ ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํฌ๋“œ์˜ ํ˜„์žฌ ์ œํ•œ์„ ๋คํ”„ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl get pods --all-namespaces -o=jsonpath="{range .items[*]}{.metadata.namespace}:{.metadata.name}{'\n'}\ {'.spec.nodeName -'} {.spec.nodeName}{'\n'}\ {range .spec.containers[*]}\ {'requests.cpu -'} {.resources.requests.cpu}{'\n'}\ {'limits.cpu -'} {.resources.limits.cpu}{'\n'}\ {'requests.memory -'} {.resources.requests.memory}{'\n'}\ {'limits.memory -'} {.resources.limits.memory}{'\n'}\ {'\n'}{end}\ {'\n'}{end}"

์ถœ๋ ฅ ์˜ˆ์‹œ
...
kube -system:addon-http-application-routing-nginx-ingress-controller-6bq49l7
.spec.nodeName - aks-agentpool-84550961-0
์š”์ฒญ.cpu -
limits.cpu -
์š”์ฒญ.๋ฉ”๋ชจ๋ฆฌ -
limits.memory -

kube- ์‹œ์Šคํ…œ: coredns-696c4d987c-pjht8
.spec.nodeName - aks-agentpool-84550961-0
์š”์ฒญ.cpu - 100m
limits.cpu -
์š”์ฒญ.๋ฉ”๋ชจ๋ฆฌ - 70Mi
limits.memory - 170Mi

kube ์‹œ์Šคํ…œ: coredns-696c4d987c-rtkl6
.spec.nodeName - aks-agentpool-84550961-2
์š”์ฒญ.cpu - 100m
limits.cpu -
์š”์ฒญ.๋ฉ”๋ชจ๋ฆฌ - 70Mi
limits.memory - 170Mi

kube ์‹œ์Šคํ…œ: coredns-696c4d987c-zgcbp
.spec.nodeName - aks-agentpool-84550961-1
์š”์ฒญ.cpu - 100m
limits.cpu -
์š”์ฒญ.๋ฉ”๋ชจ๋ฆฌ - 70Mi
limits.memory - 170Mi

kube ์‹œ์Šคํ…œ: coredns-autoscaler-657d77ffbf-7t72x
.spec.nodeName - aks-agentpool-84550961-2
์š”์ฒญ.cpu - 20m
limits.cpu -
์š”์ฒญ.๋ฉ”๋ชจ๋ฆฌ - 10Mi
limits.memory -

kube- ์‹œ์Šคํ…œ: coredns-autoscaler-657d77ffbf-zrp6m
.spec.nodeName - aks-agentpool-84550961-0
์š”์ฒญ.cpu - 20m
limits.cpu -
์š”์ฒญ.๋ฉ”๋ชจ๋ฆฌ - 10Mi
limits.memory -

kube ์‹œ์Šคํ…œ:kube-proxy-57nw5
.spec.nodeName - aks-agentpool-84550961-1
์š”์ฒญ.cpu - 100m
limits.cpu -
์š”์ฒญ.๋ฉ”๋ชจ๋ฆฌ -
limits.memory -
...

@Spaceman1861 ์•„์›ƒ์•„์›ƒ์˜ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@eduncan911 ์™„๋ฃŒ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ด๋ธ” ํ˜•์‹์˜ ์ถœ๋ ฅ์„ ์ฝ๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ์ œํ•œ ๋Œ€์‹  ์š”์ฒญ์„ ํ‘œ์‹œํ•จ).

kubectl get pods -o custom-columns=NAME:.metadata.name,"CPU(cores)":.spec.containers[*].resources.requests.cpu,"MEMORY(bytes)":.spec.containers[*].resources.requests.memory --all-namespaces

์ƒ˜ํ”Œ ์ถœ๋ ฅ:

NAME                                CPU(cores)      MEMORY(bytes)
pod1                                100m            128Mi
pod2                                100m            128Mi,128Mi

@lentzi90 ์ฐธ๊ณ : Kubernetes Web View ("kubectl for web"), ๋ฐ๋ชจ: https://kube-web-view.demo.j-serv.de/clusters/local/namespaces/ ์—์„œ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์—ด์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ].resources.requests.cpu)%3BMemory+Requests=join(%27,%20% 27,%20spec.containers[ ].resources.requests.memory)

์‚ฌ์šฉ์ž ์ •์˜ ์—ด ๋ฌธ์„œ: https://kube-web-view.readthedocs.io/en/latest/features.html#listing -resources

์˜ค์˜ค ๋ฐ˜์ง๋ฐ˜์ง

์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๊ตฌ์„ฑ๋œ ์ œํ•œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ์—์„œ ํฌ๋“œ์˜ ์‚ฌ์šฉ๋ฅ ์„ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํฌ๋ฆฝํŠธ(deployment-health.sh)์ž…๋‹ˆ๋‹ค.
https://github.com/amelbakry/kubernetes-scripts

Screenshot from 2019-09-02 15-11-42

@lentzi90 ๋ฐ @ylogx ์˜ ๋‹ต๋ณ€์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์‹ค์ œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰( kubectl top pods )๊ณผ ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ฐ ์ œํ•œ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž์ฒด ํฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

join -a1 -a2 -o 0,1.2,1.3,2.2,2.3,2.4,2.5, -e '<none>' <(kubectl top pods) <(kubectl get pods -o custom-columns=NAME:.metadata.name,"CPU_REQ(cores)":.spec.containers[*].resources.requests.cpu,"MEMORY_REQ(bytes)":.spec.containers[*].resources.requests.memory,"CPU_LIM(cores)":.spec.containers[*].resources.limits.cpu,"MEMORY_LIM(bytes)":.spec.containers[*].resources.limits.memory) | column -t -s' ' 

์ถœ๋ ฅ ์˜ˆ:

NAME                                                             CPU(cores)  MEMORY(bytes)  CPU_REQ(cores)  MEMORY_REQ(bytes)  CPU_LIM(cores)  MEMORY_LIM(bytes)
xxxxx-847dbbc4c-c6twt                                            20m         110Mi          50m             150Mi              150m            250Mi
xxx-service-7b6b9558fc-9cq5b                                     19m         1304Mi         1               <none>             1               <none>
xxxxxxxxxxxxxxx-hook-5d585b449b-zfxmh                            0m          46Mi           200m            155M               200m            155M

๋‹ค์Œ์€ ํ„ฐ๋ฏธ๋„์—์„œ kstats ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.

alias kstats='join -a1 -a2 -o 0,1.2,1.3,2.2,2.3,2.4,2.5, -e '"'"'<none>'"'"' <(kubectl top pods) <(kubectl get pods -o custom-columns=NAME:.metadata.name,"CPU_REQ(cores)":.spec.containers[*].resources.requests.cpu,"MEMORY_REQ(bytes)":.spec.containers[*].resources.requests.memory,"CPU_LIM(cores)":.spec.containers[*].resources.limits.cpu,"MEMORY_LIM(bytes)":.spec.containers[*].resources.limits.memory) | column -t -s'"'"' '"'" 

์ถ”์‹ : ์ €๋Š” Mac์—์„œ๋งŒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. Linux ๋ฐ Windows์˜ ๊ฒฝ์šฐ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๊ตฌ์„ฑ๋œ ์ œํ•œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ์—์„œ ํฌ๋“œ์˜ ์‚ฌ์šฉ๋ฅ ์„ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํฌ๋ฆฝํŠธ(deployment-health.sh)์ž…๋‹ˆ๋‹ค.
https://github.com/amelbakry/kubernetes-scripts

@amelbakry Mac์—์„œ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Failed to execute process './deployment-health.sh'. Reason:
exec: Exec format error
The file './deployment-health.sh' is marked as an executable but could not be run by the operating system.

์ด๋Ÿฐ,
"#!" ๋งจ ์ฒ˜์Œ ์ค„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  "bash
./deployment-health.sh"๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”.

/์ฐฐ์Šค
์ถ”์‹ . ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR์ด ์—ด๋ ธ์Šต๋‹ˆ๋‹ค.

2019๋…„ 9์›” 25์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 10:19 Dmitri Moore [email protected]
์ผ๋‹ค:

ํฌ๋“œ ํ™œ์šฉ๋„๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ(deployment-health.sh)์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๊ตฌ์„ฑ๋œ ์ œํ•œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ
https://github.com/amelbakry/kubernetes-scripts

@amelbakry https://github.com/amelbakry ๋‚˜๋Š” ๋‹ค์Œ์„ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
Mac์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜:

'./deployment-health.sh' ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ :
exec: ์‹คํ–‰ ํ˜•์‹ ์˜ค๋ฅ˜
'./deployment-health.sh' ํŒŒ์ผ์€ ์‹คํ–‰ ํŒŒ์ผ๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ์šด์˜ ์ฒด์ œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/kubernetes/kubernetes/issues/17512?email_source=notifications&email_token=AACA3TODQEUPWK3V3UY3SF3QLOMSFA5CNFSM4BUXCUG2YY3PNVWWK3TUL52HS4DFVEXG43VMV
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AACA3TOPOBIWXFX2DAOT6JDQLOMSFANCNFSM4BUXCUGQ
.

@cgthayer ํ•ด๋‹น PR ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ „์—ญ์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ MacOs Mojave์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” EU ํŠน์ • ์˜์—ญ ์ด๋ฆ„์„ ํฌํ•จํ•˜์—ฌ ๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ํŠน์ • ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์กฐ์ธ ex์˜ ์ˆ˜์ •๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์—ด์˜ ํ•ฉ๊ณ„๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

oc_ns_pod_usage () {
    # show pod usage for cpu/mem
    ns="$1"
    usage_chk3 "$ns" || return 1
    printf "$ns\n"
    separator=$(printf '=%.0s' {1..50})
    printf "$separator\n"
    output=$(join -a1 -a2 -o 0,1.2,1.3,2.2,2.3,2.4,2.5, -e '<none>' \
        <(kubectl top pods -n $ns) \
        <(kubectl get -n $ns pods -o custom-columns=NAME:.metadata.name,"CPU_REQ(cores)":.spec.containers[*].resources.requests.cpu,"MEMORY_REQ(bytes)":.spec.containers[*].resources.requests.memory,"CPU_LIM(cores)":.spec.containers[*].resources.limits.cpu,"MEMORY_LIM(bytes)":.spec.containers[*].resources.limits.memory))
    totals=$(printf "%s" "$output" | awk '{s+=$2; t+=$3; u+=$4; v+=$5; w+=$6; x+=$7} END {print s" "t" "u" "v" "w" "x}')
    printf "%s\n%s\nTotals: %s\n" "$output" "$separator" "$totals" | column -t -s' '
    printf "$separator\n"
}

์˜ˆ์‹œ

$ oc_ns_pod_usage ls-indexer
ls-indexer
==================================================
NAME                                                CPU(cores)  MEMORY(bytes)  CPU_REQ(cores)  MEMORY_REQ(bytes)  CPU_LIM(cores)  MEMORY_LIM(bytes)
ls-indexer-f5-7cd5859997-qsfrp                      15m         741Mi          1               1000Mi             2               2000Mi
ls-indexer-f5-7cd5859997-sclvg                      15m         735Mi          1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-4b7j2                 92m         1103Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-5xj5l                 88m         1124Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-6vvl2                 92m         1132Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-85f66                 85m         1151Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-924jz                 96m         1124Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-g6gx8                 119m        1119Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-hkhnt                 52m         819Mi          1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-hrsrs                 51m         1122Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-j4qxm                 53m         885Mi          1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-lxlrb                 83m         1215Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-mw6rt                 86m         1131Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-pbdf8                 95m         1115Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-qk9bm                 91m         1141Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-sdv9r                 54m         1194Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-t67v6                 75m         1234Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-tkxs2                 88m         1364Mi         1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-v6jl2                 53m         747Mi          1               1000Mi             2               2000Mi
ls-indexer-filebeat-7858f56c9-wkqr7                 53m         838Mi          1               1000Mi             2               2000Mi
ls-indexer-metricbeat-74d89d7d85-jp8qc              190m        1191Mi         1               1000Mi             2               2000Mi
ls-indexer-metricbeat-74d89d7d85-jv4bv              192m        1162Mi         1               1000Mi             2               2000Mi
ls-indexer-metricbeat-74d89d7d85-k4dcd              194m        1144Mi         1               1000Mi             2               2000Mi
ls-indexer-metricbeat-74d89d7d85-n46tz              192m        1155Mi         1               1000Mi             2               2000Mi
ls-indexer-packetbeat-db98f6fdf-8x446               35m         1198Mi         1               1000Mi             2               2000Mi
ls-indexer-packetbeat-db98f6fdf-gmxxd               22m         1203Mi         1               1000Mi             2               2000Mi
ls-indexer-syslog-5466bc4d4f-gzxw8                  27m         1125Mi         1               1000Mi             2               2000Mi
ls-indexer-syslog-5466bc4d4f-zh7st                  29m         1153Mi         1               1000Mi             2               2000Mi
==================================================
Totals:                                             2317        30365          28              28000              56              56000
==================================================

๊ทธ๋ฆฌ๊ณ  usage_chk3๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด ๋„๊ตฌ๋„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ;-) kubectl-view-allocations: ํ• ๋‹น(cpu, memory, gpu,... X ์š”์ฒญ, ์ œํ•œ, ํ• ๋‹น ๊ฐ€๋Šฅ,...)์„ ๋‚˜์—ดํ•˜๋Š” kubectl ํ”Œ๋Ÿฌ๊ทธ์ธ. , ์š”์ฒญ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด (๋‚ด๋ถ€) ์‚ฌ์šฉ์ž์—๊ฒŒ "๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ํ• ๋‹นํ•˜๋Š”์ง€"๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ๋‹ค์Œ ์ƒ˜ํ”Œ์—์„œ๋Š” ์ด๋ฆ„์— "gpu"๊ฐ€ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

> kubectl-view-allocations -r gpu

 Resource                                   Requested  %Requested  Limit  %Limit  Allocatable  Free
  nvidia.com/gpu                                    7         58%      7     58%           12     5
  โ”œโ”€ node-gpu1                                      1         50%      1     50%            2     1
  โ”‚  โ””โ”€ xxxx-784dd998f4-zt9dh                       1                  1
  โ”œโ”€ node-gpu2                                      0          0%      0      0%            2     2
  โ”œโ”€ node-gpu3                                      0          0%      0      0%            2     2
  โ”œโ”€ node-gpu4                                      1         50%      1     50%            2     1
  โ”‚  โ””โ”€ aaaa-1571819245-5ql82                       1                  1
  โ”œโ”€ node-gpu5                                      2        100%      2    100%            2     0
  โ”‚  โ”œโ”€ bbbb-1571738839-dfkhn                       1                  1
  โ”‚  โ””โ”€ bbbb-1571738888-52c4w                       1                  1
  โ””โ”€ node-gpu6                                      2        100%      2    100%            2     0
     โ”œโ”€ bbbb-1571738688-vlxng                       1                  1
     โ””โ”€ cccc-1571745684-7k6bn                       1                  1

ํ–ฅํ›„ ๋ฒ„์ „:

  • (๋…ธ๋“œ, ํŒŒ๋“œ) ๋ ˆ๋ฒจ์„ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๊ทธ๋ฃนํ™” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ฆฌ์†Œ์Šค๋งŒ ์žˆ๋Š” ๊ฐœ์š” ์ œ๊ณต)
  • curl, krew, brew, ...๋ฅผ ํ†ตํ•œ ์„ค์น˜ (ํ˜„์žฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” github์˜ ๋ฆด๋ฆฌ์Šค ์„น์…˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

์˜๊ฐ์„ ์ค€ kubectl-view-utilization ๋•๋ถ„์— ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜๊ฑฐ๋‚˜ bash(์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ)์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ํ•ดํ‚น์ด ์žˆ์Šต๋‹ˆ๋‹ค kubectl describe nodes | grep -A 2 -e "^\\s*CPU Requests"

์ด๊ฒƒ์€ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :(

kubectl describe node | grep -A5 "Allocated" ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

์ด๊ฒƒ์€ ํ˜„์žฌ ์ตœ๊ณ ๋กœ ๋งŽ์€ ์š”์ฒญ์„ ๋ฐ›์€ 4๋ฒˆ์งธ ๋ฌธ์ œ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ priority/backlog ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ๋‚ดํ•ด ์ฃผ๊ฑฐ๋‚˜ ์ œ์•ˆ์„ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์ด ์ผ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. @davidB ๋„๊ตฌ ์˜ UX๋Š” kubectl ์†ํ•ฉ๋‹ˆ๋‹ค.

kubectl top nodes & kubectl describe node ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๊ด€๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ ๋ฒˆ์งธ CPU(์ฝ”์–ด)๋Š” 1064m์ด์ง€๋งŒ ์ด ๊ฒฐ๊ณผ๋Š” ๋‘ ๋ฒˆ์งธ CPU(1480m)๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

kubectl top nodes
NAME                                                CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
abcd-p174e23ea5qa4g279446c803f82-abc-node-0         1064m        53%    6783Mi          88%
kubectl describe node abcd-p174e23ea5qa4g279446c803f82-abc-node-0
...
  Resource  Requests          Limits
  --------  --------          ------
  cpu       1480m (74%)       1300m (65%)
  memory    2981486848 (37%)  1588314624 (19%)

kubectl top nodes ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  CPU(์ฝ”์–ด)๋ฅผ ์–ป๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ๋„๊ตฌ๋„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ;-) kubectl-view-allocations: ํ• ๋‹น(cpu, memory, gpu,... X ์š”์ฒญ, ์ œํ•œ, ํ• ๋‹น ๊ฐ€๋Šฅ,...)์„ ๋‚˜์—ดํ•˜๋Š” kubectl ํ”Œ๋Ÿฌ๊ทธ์ธ. , ์š”์ฒญ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด (๋‚ด๋ถ€) ์‚ฌ์šฉ์ž์—๊ฒŒ "๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ํ• ๋‹นํ•˜๋Š”์ง€"๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ๋‹ค์Œ ์ƒ˜ํ”Œ์—์„œ๋Š” ์ด๋ฆ„์— "gpu"๊ฐ€ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

> kubectl-view-allocations -r gpu

 Resource                                   Requested  %Requested  Limit  %Limit  Allocatable  Free
  nvidia.com/gpu                                    7         58%      7     58%           12     5
  โ”œโ”€ node-gpu1                                      1         50%      1     50%            2     1
  โ”‚  โ””โ”€ xxxx-784dd998f4-zt9dh                       1                  1
  โ”œโ”€ node-gpu2                                      0          0%      0      0%            2     2
  โ”œโ”€ node-gpu3                                      0          0%      0      0%            2     2
  โ”œโ”€ node-gpu4                                      1         50%      1     50%            2     1
  โ”‚  โ””โ”€ aaaa-1571819245-5ql82                       1                  1
  โ”œโ”€ node-gpu5                                      2        100%      2    100%            2     0
  โ”‚  โ”œโ”€ bbbb-1571738839-dfkhn                       1                  1
  โ”‚  โ””โ”€ bbbb-1571738888-52c4w                       1                  1
  โ””โ”€ node-gpu6                                      2        100%      2    100%            2     0
     โ”œโ”€ bbbb-1571738688-vlxng                       1                  1
     โ””โ”€ cccc-1571745684-7k6bn                       1                  1

ํ–ฅํ›„ ๋ฒ„์ „:

* will allow to hide (node, pod) level or to choose how to group, (eg to provide an overview with only resources)

* installation via curl, krew, brew, ... (currently binary are available under the releases section of github)

์˜๊ฐ์„ ์ค€ kubectl-view-utilization ๋•๋ถ„์— ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜๊ฑฐ๋‚˜ bash(์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ)์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” David ์ƒˆ ๋ฐฐํฌํŒ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ถ„ํˆฌ 16.04์—์„œ ์šฐ๋ฆฌ๋Š”

kubectl-view-allocations: /lib/x86_64-linux-gnu/libc.so.6: ๋ฒ„์ „ `GLIBC_2.25'๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ(kubectl-view-allocations์—์„œ ํ•„์š”)

dpkg -l |grep glib

ii libglib2.0-0:amd64 2.48.2-0ubuntu4.4

@omerfsen ์ƒˆ ๋ฒ„์ „ kubectl-view-allocations๋ฅผ ์‹œ๋„ํ•˜๊ณ  ํ‹ฐ์ผ“ ๋ฒ„์ „ `GLIBC_2.25' not found #14์— ๋Œ“๊ธ€์„ ๋‹ฌ

ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ํ• ๋‹น์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ kubectl get po --all-namespaces -o=jsonpath="{range .items[*]}{.metadata.namespace}:{.metadata.name}{'\n'}{range .spec.containers[*]}  {.name}:{.resources.requests.cpu}{'\n'}{end}{'\n'}{end}"

๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

kube-system:heapster-v1.5.0-dc8df7cc9-7fqx6
  heapster:88m
  heapster-nanny:50m
kube-system:kube-dns-6cdf767cb8-cjjdr
  kubedns:100m
  dnsmasq:150m
  sidecar:10m
  prometheus-to-sd:
kube-system:kube-dns-6cdf767cb8-pnx2g
  kubedns:100m
  dnsmasq:150m
  sidecar:10m
  prometheus-to-sd:
kube-system:kube-dns-autoscaler-69c5cbdcdd-wwjtg
  autoscaler:20m
kube-system:kube-proxy-gke-cluster1-default-pool-cd7058d6-3tt9
  kube-proxy:100m
kube-system:kube-proxy-gke-cluster1-preempt-pool-57d7ff41-jplf
  kube-proxy:100m
kube-system:kubernetes-dashboard-7b9c4bf75c-f7zrl
  kubernetes-dashboard:50m
kube-system:l7-default-backend-57856c5f55-68s5g
  default-http-backend:10m
kube-system:metrics-server-v0.2.0-86585d9749-kkrzl
  metrics-server:48m
  metrics-server-nanny:5m
kube-system:tiller-deploy-7794bfb756-8kxh5
  tiller:10m

์—ฌ๊ธฐ๊นŒ์ง€ ๊ฐ€์žฅ ์ข‹์€ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์‚ฌ์šฉ๋Ÿ‰, ์š”์ฒญ ๋ฐ ์ œํ•œ์„ ๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

join -1 2 -2 2 -a 1 -a 2 -o "2.1 0 1.3 2.3 2.5 1.4 2.4 2.6" -e '<wait>' \
  <( kubectl top pods --all-namespaces | sort --key 2 -b ) \
  <( kubectl get pods --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,"CPU_REQ(cores)":.spec.containers[*].resources.requests.cpu,"MEMORY_REQ(bytes)":.spec.containers[*].resources.requests.memory,"CPU_LIM(cores)":.spec.containers[*].resources.limits.cpu,"MEMORY_LIM(bytes)":.spec.containers[*].resources.limits.memory | sort --key 2 -b ) \
  | column -t -s' '

join ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ ฌ๋œ ๋ชฉ๋ก์„ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์— ์ œ๊ณต๋œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ƒ์œ„ ๋ฐ ๋ฐฐํฌ ์š”์ฒญ ๋ฐ (์—ฌ๊ธฐ) ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์ œํ•œ์—์„œ ํ˜„์žฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NAMESPACE                 NAME                                                        CPU(cores)  CPU_REQ(cores)  CPU_LIM(cores)  MEMORY(bytes)  MEMORY_REQ(bytes)   MEMORY_LIM(bytes)
kube-system               aws-node-2jzxr                                              18m         10m             <none>          41Mi           <none>              <none>
kube-system               aws-node-5zn6w                                              <wait>      10m             <none>          <wait>         <none>              <none>
kube-system               aws-node-h8cc5                                              20m         10m             <none>          42Mi           <none>              <none>
kube-system               aws-node-h9n4f                                              0m          10m             <none>          0Mi            <none>              <none>
kube-system               aws-node-lz5fn                                              17m         10m             <none>          41Mi           <none>              <none>
kube-system               aws-node-tpmxr                                              20m         10m             <none>          39Mi           <none>              <none>
kube-system               aws-node-zbkkh                                              23m         10m             <none>          47Mi           <none>              <none>
cluster-autoscaler        cluster-autoscaler-aws-cluster-autoscaler-5db55fbcf8-mdzkd  1m          100m            500m            9Mi            300Mi               500Mi
cluster-autoscaler        cluster-autoscaler-aws-cluster-autoscaler-5db55fbcf8-q9xs8  39m         100m            500m            75Mi           300Mi               500Mi
kube-system               coredns-56b56b56cd-bb26t                                    6m          100m            <none>          11Mi           70Mi                170Mi
kube-system               coredns-56b56b56cd-nhp58                                    6m          100m            <none>          11Mi           70Mi                170Mi
kube-system               coredns-56b56b56cd-wrmxv                                    7m          100m            <none>          12Mi           70Mi                170Mi
gitlab-runner-l           gitlab-runner-l-gitlab-runner-6b8b85f87f-9knnx              3m          100m            200m            10Mi           128Mi               256Mi
gitlab-runner-m           gitlab-runner-m-gitlab-runner-6bfd5d6c84-t5nrd              7m          100m            200m            13Mi           128Mi               256Mi
gitlab-runner-mda         gitlab-runner-mda-gitlab-runner-59bb66c8dd-bd9xw            4m          100m            200m            17Mi           128Mi               256Mi
gitlab-runner-ops         gitlab-runner-ops-gitlab-runner-7c5b85dc97-zkb4c            3m          100m            200m            12Mi           128Mi               256Mi
gitlab-runner-pst         gitlab-runner-pst-gitlab-runner-6b8f9bf56b-sszlr            6m          100m            200m            20Mi           128Mi               256Mi
gitlab-runner-s           gitlab-runner-s-gitlab-runner-6bbccb9b7b-dmwgl              50m         100m            200m            27Mi           128Mi               512Mi
gitlab-runner-shared      gitlab-runner-shared-gitlab-runner-688d57477f-qgs2z         3m          <none>          <none>          15Mi           <none>              <none>
kube-system               kube-proxy-5b65t                                            15m         100m            <none>          19Mi           <none>              <none>
kube-system               kube-proxy-7qsgh                                            12m         100m            <none>          24Mi           <none>              <none>
kube-system               kube-proxy-gn2qg                                            13m         100m            <none>          23Mi           <none>              <none>
kube-system               kube-proxy-pz7fp                                            15m         100m            <none>          18Mi           <none>              <none>
kube-system               kube-proxy-vdjqt                                            15m         100m            <none>          23Mi           <none>              <none>
kube-system               kube-proxy-x4xtp                                            19m         100m            <none>          15Mi           <none>              <none>
kube-system               kube-proxy-xlpn7                                            0m          100m            <none>          0Mi            <none>              <none>
metrics-server            metrics-server-5875c7d795-bj7cq                             5m          200m            500m            29Mi           200Mi               500Mi
metrics-server            metrics-server-5875c7d795-jpjjn                             7m          200m            500m            29Mi           200Mi               500Mi
gitlab-runner-s           runner-heq8ujaj-project-10386-concurrent-06t94f             <wait>      200m,100m       200m,200m       <wait>         200Mi,128Mi         500Mi,500Mi
gitlab-runner-s           runner-heq8ujaj-project-10386-concurrent-10lpn9j            1m          200m,100m       200m,200m       12Mi           200Mi,128Mi         500Mi,500Mi
gitlab-runner-s           runner-heq8ujaj-project-10386-concurrent-11jrxfh            <wait>      200m,100m       200m,200m       <wait>         200Mi,128Mi         500Mi,500Mi
gitlab-runner-s           runner-heq8ujaj-project-10386-concurrent-129hpvl            1m          200m,100m       200m,200m       12Mi           200Mi,128Mi         500Mi,500Mi
gitlab-runner-s           runner-heq8ujaj-project-10386-concurrent-13kswg8            1m          200m,100m       200m,200m       12Mi           200Mi,128Mi         500Mi,500Mi
gitlab-runner-s           runner-heq8ujaj-project-10386-concurrent-15qhp5w            <wait>      200m,100m       200m,200m       <wait>         200Mi,128Mi         500Mi,500Mi

์ฃผ๋ชฉํ• ๋งŒํ•œ ์‚ฌํ•ญ: ๋‹ค์Œ๊ณผ ๊ฐ™์ด CPU ์†Œ๋น„๋Ÿ‰์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

| awk 'NR<2{print $0;next}{print $0| "sort --key 3 --numeric -b --reverse"}

์ด๊ฒƒ์€ Mac์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Linux์—์„œ๋„ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์กฐ์ธ, ์ •๋ ฌ ๋“ฑ์œผ๋กœ ์ธํ•ด...).

kubectl์ด ์ด์— ๋Œ€ํ•ด ์ข‹์€ ๊ฒฌํ•ด๋ฅผ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

kube-capacity์— ๋Œ€ํ•œ ์ข‹์€ ๊ฒฝํ—˜์ด

์˜ˆ์‹œ:

kube-capacity --util

NODE              CPU REQUESTS    CPU LIMITS    CPU UTIL    MEMORY REQUESTS    MEMORY LIMITS   MEMORY UTIL
*                 560m (28%)      130m (7%)     40m (2%)    572Mi (9%)         770Mi (13%)     470Mi (8%)
example-node-1    220m (22%)      10m (1%)      10m (1%)    192Mi (6%)         360Mi (12%)     210Mi (7%)
example-node-2    340m (34%)      120m (12%)    30m (3%)    380Mi (13%)        410Mi (14%)     260Mi (9%)

์ด ๋„๊ตฌ๊ฐ€ ์ง„์ •์œผ๋กœ ์œ ์šฉํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ๋œ ๋ชจ๋“  kubernetes ์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CPU/Mem์€ ํ™•์‹คํžˆ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GPU, TPU(๋จธ์‹  ๋Ÿฌ๋‹์šฉ), Intel QAT ๋“ฑ์ด ์žˆ๊ณ  ์•„๋งˆ๋„ ์ œ๊ฐ€ ๋ชจ๋ฅด๋Š” ๋” ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šคํ† ๋ฆฌ์ง€๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์š”์ฒญ๋œ ๋‚ด์šฉ๊ณผ ์‚ฌ์šฉ๋œ ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด์ƒ์ ์œผ๋กœ๋Š” iops ์ธก๋ฉด์—์„œ๋„).

@boniek83 , ๋‚ด๊ฐ€ kubectl-view-allocations ๋ฅผ ๋งŒ๋“  ์ด์œ ๋Š” GPU๋ฅผ ๋‚˜์—ดํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. github ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. TPU๋ฅผ ๊ฐ์ง€ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค๋กœ ๋‚˜์—ด๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ง€ํ•ด์•ผ ํ•จ)

@boniek83 , ๋‚ด๊ฐ€ kubectl-view-allocations ๋ฅผ ๋งŒ๋“  ์ด์œ ๋Š” GPU๋ฅผ ๋‚˜์—ดํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. github ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. TPU๋ฅผ ๊ฐ์ง€ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๋…ธ๋“œ์˜ ๋ฆฌ์†Œ์Šค๋กœ ๋‚˜์—ด๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ง€ํ•ด์•ผ ํ•จ)

๋‚˜๋Š” ๋‹น์‹ ์˜ ๋„๊ตฌ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ๋‚ด ๋ชฉ์ ์„ ์œ„ํ•ด ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ ์ค‘ ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค. ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋‚˜๋Š” ๋ถ€ํ™œ์ ˆ ์ดํ›„์— TPU๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ˆ์œ ๊ทธ๋ž˜ํ”„์™€ ํ•จ๊ป˜ ์›น ์•ฑ ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋˜์–ด ๋ฐ์ดํ„ฐ ๊ณผํ•™์ž์—๊ฒŒ kubernetes์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ˆ„๊ฐ€ ์ž์›์„ ๋จน๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. :)

์œ„์˜ ๋„๊ตฌ์™€ ์Šคํฌ๋ฆฝํŠธ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋‚ด ํ•„์š”์— ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—(์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.( ), ์ €๋Š” ์ œ ๋ณ€ํ˜•์„ ํ•ดํ‚นํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/eht16/kube-cargo-load

ํด๋Ÿฌ์Šคํ„ฐ์˜ POD์— ๋Œ€ํ•œ ๋น ๋ฅธ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๊ตฌ์„ฑ๋œ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ๋ฐ ์ œํ•œ๊ณผ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๊ตฌ์„ฑ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ๊ณผ ์‹ค์ œ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ„์˜ ๋น„์œจ์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํฌ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„ ๋กœ๊ทธ๋ฅผ ์–ด๋–ป๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
ํฌ๋“œ๊ฐ€ ์ž์ฃผ ๊ฑธ๋ ค์š”.

  • kubectl describe nodes OR kubectl top nodes , ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋ฅ ์„ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ์–ด๋Š ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ๋˜ํ•œ ์ด 2๊ฐœ์˜ ๊ฒฐ๊ณผ ์‚ฌ์ด์— ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ์ด์œ .
    ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ์  ์„ค๋ช…์ด ์•„์ง ์žˆ์Šต๋‹ˆ๊นŒ?

/์ข…๋ฅ˜ ๊ธฐ๋Šฅ

๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋Œ“๊ธ€๊ณผ ํ•ดํ‚น์€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋…ธ๋“œ ํ’€๋‹น ๋ฆฌ์†Œ์Šค ํ•ฉ๊ณ„๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋†’์€ ๋ณด๊ธฐ๋ฅผ ์œ„ํ•œ ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š”,
์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ 5๋ถ„๋งˆ๋‹ค ํฌ๋“œ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Excel์—์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์–ด๋–ค ์•„์ด๋””์–ด? ๊ฐ์‚ฌ ํ•ด์š”

์•ˆ๋…•ํ•˜์„ธ์š”,
Google์ด ์šฐ๋ฆฌ ๋ชจ๋‘์—๊ฒŒ ์ด ๋ฌธ์ œ๋ฅผ ์ง€์ ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค :-) (๊ฑฐ์˜ 5๋…„์ด ์ง€๋‚œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ๋‹ค๋Š” ์ ์— ์•ฝ๊ฐ„ ์‹ค๋งํ•ฉ๋‹ˆ๋‹ค.) ๋ชจ๋“  ์…ธ ์กฐ๊ฐ ๋ฐ ๊ธฐํƒ€ ๋„๊ตฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅธ ํ•ดํ‚น:

$ kubectl describe nodes | grep 'Name:\|  cpu\|  memory'

Name:               XXX-2-wke2
  cpu                                               1552m (77%)   2402m (120%)
  memory                                            2185Mi (70%)  3854Mi (123%)
Name:               XXX-2-wkep
  cpu                                               1102m (55%)   1452m (72%)
  memory                                            1601Mi (51%)  2148Mi (69%)
Name:               XXX-2-wkwz
  cpu                                               852m (42%)    1352m (67%)
  memory                                            1125Mi (36%)  3624Mi (116%)

๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅธ ํ•ดํ‚น:

$ kubectl describe nodes | grep 'Name:\|  cpu\|  memory'

Name:               XXX-2-wke2
  cpu                                               1552m (77%)   2402m (120%)
  memory                                            2185Mi (70%)  3854Mi (123%)
Name:               XXX-2-wkep
  cpu                                               1102m (55%)   1452m (72%)
  memory                                            1601Mi (51%)  2148Mi (69%)
Name:               XXX-2-wkwz
  cpu                                               852m (42%)    1352m (67%)
  memory                                            1125Mi (36%)  3624Mi (116%)

์žฅ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๋ž˜์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์žฅ์น˜๋Š” ์ž์›์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋ณด์„ธ์š”!

์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Sensedia/open-tools/blob/master/scripts/listK8sHardwareResources.sh

์ด ์Šคํฌ๋ฆฝํŠธ์—๋Š” ์—ฌ๊ธฐ์—์„œ ๊ณต์œ ํ•œ ์•„์ด๋””์–ด ์ค‘ ์ผ๋ถ€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ฉ”ํŠธ๋ฆญ์„ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ๊ณผ ๋ช…๋ น์„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ”์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ CPU/RAM ์ œํ•œ/์˜ˆ์•ฝ์„ ๋‚˜์—ดํ•˜๋Š” ๊ฐ„๋‹จํ•œ kubectl ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ํฌ๋“œ CPU/RAM ์†Œ๋น„(์˜ˆ kubectl top pods )๋ฅผ ํ™•์ธํ•˜์ง€๋งŒ CPU๋ณ„๋กœ ์ถœ๋ ฅ์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ฌด์—‡๋ณด๋‹ค ํŽธ๋ฆฌํ•œ ๊ฒƒ์ด์ง€๋งŒ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋„ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/laurybueno/kubectl-hoggers

์™€์šฐ, ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ์ „์ฒด CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์ ์ ˆํ•˜๊ฒŒ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ kubernetes ํŒ€์˜ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ด ์•„์ง ์—†๋Š” ๊ฑฐ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๊นŒ?

minikube์—์„œ ์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋จผ์ € metric ์„œ๋ฒ„ ์• ๋“œ์˜จ์„ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค.
minikube addons enable metrics-server
๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.
kubectl top nodes

ํฌ๋ฃจ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

kubectl krew install resource-capacity
kubectl resource-capacity
NODE                                          CPU REQUESTS   CPU LIMITS     MEMORY REQUESTS   MEMORY LIMITS
*                                             16960m (35%)   18600m (39%)   26366Mi (14%)     3100Mi (1%)
ip-10-0-138-176.eu-north-1.compute.internal   2460m (31%)    4200m (53%)    567Mi (1%)        784Mi (2%)
ip-10-0-155-49.eu-north-1.compute.internal    2160m (27%)    2200m (27%)    4303Mi (14%)      414Mi (1%)
ip-10-0-162-84.eu-north-1.compute.internal    3860m (48%)    3900m (49%)    8399Mi (27%)      414Mi (1%)
ip-10-0-200-101.eu-north-1.compute.internal   2160m (27%)    2200m (27%)    4303Mi (14%)      414Mi (1%)
ip-10-0-231-146.eu-north-1.compute.internal   2160m (27%)    2200m (27%)    4303Mi (14%)      414Mi (1%)
ip-10-0-251-167.eu-north-1.compute.internal   4160m (52%)    3900m (49%)    4491Mi (14%)      660Mi (2%)
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰