์ฌ์ฉ์๋ ๋ฆฌ์์ค ๋ถ์กฑ์ผ๋ก ์ธํด ์ผ์ ์ ์ก์ ์ ์๋ ํฌ๋์ ๊ฑธ๋ ค ๋์ด์ง๊ณ ์์ต๋๋ค. ํฌ๋๊ฐ ์์ง ์์๋์ง ์์๊ฑฐ๋ ํด๋ฌ์คํฐ์ ์์ฝํ ๊ณต๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ํฌ๋๊ฐ ๋ณด๋ฅ ์ค์ธ ์๊ธฐ๋ฅผ ์๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. 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 ์ฌ์ฉ๋"์ ์์ํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์์คํ ํฌ๋๋ฅผ ํฌํจํ ๋ชจ๋ ํฌ๋๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ ๋ณต์กํ ์ค์ผ์ค๋ฌ์ ํจ๊ป ์ฅ๊ธฐ์ ์ผ๋ก ๋๋ ํด๋ฌ์คํฐ์ ์ถฉ๋ถํ ๋ฆฌ์์ค๊ฐ ์์ง๋ง ๋จ์ผ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค('์ถฉ๋ถํ ํฐ ๊ตฌ๋ฉ ์์' ๋ฌธ์ ์ง๋จ).
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
@ylogx https://github.com/kubernetes/kubernetes/issues/17512#issuecomment -326089708
ํด๋ฌ์คํฐ ์ ์ฒด์์ ํ ๋น์ ์ป๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$ 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 :
kubectl top
์ด ํ๋๊ทธ๋ฅผ ์ง์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค: --heapster-namespace
.<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 ๋ด๋ณด๋ด๊ธฐ)์ ๋ง๋ค์์ต๋๋ค.
์ด๊ฒ์ ํ
์ด๋ธ ํ์์ผ๋ก ์ค์ ๋
ธ๋ ์ฌ์ฉ๋ฅ ์ ๊ฐ์ ธ์ค๋ 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
@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
ํฅํ ๋ฒ์ :
์๊ฐ์ ์ค 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
, ํด๋ฌ์คํฐ ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ ์ ๊ณ์ฐํ๋ ค๋ฉด ์ด๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๊น?/์ข ๋ฅ ๊ธฐ๋ฅ
๋ ธ๋์ ๋ํ ๋ชจ๋ ๋๊ธ๊ณผ ํดํน์ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. ๋ํ ๋ ธ๋ ํ๋น ๋ฆฌ์์ค ํฉ๊ณ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ ๋์ ๋ณด๊ธฐ๋ฅผ ์ํ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํฉ๋๋ค!
์๋
ํ์ธ์,
์ผ์ ๊ธฐ๊ฐ ๋์ 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๋ณ๋ก ์ถ๋ ฅ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
๊ทธ ๋ฌด์๋ณด๋ค ํธ๋ฆฌํ ๊ฒ์ด์ง๋ง ๋ค๋ฅธ ๋๊ตฐ๊ฐ์๊ฒ๋ ์ ์ฉํ ๊ฒ์ ๋๋ค.
์์ฐ, ์ ์ฒด ํด๋ฌ์คํฐ์ ํ์ฌ ์ ์ฒด 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%)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์์ต๋๋ค: