Skip to content

Instantly share code, notes, and snippets.

@ryotarai
Last active November 28, 2018 04:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryotarai/2117d44ebb042f51d2990d876b52992a to your computer and use it in GitHub Desktop.
Save ryotarai/2117d44ebb042f51d2990d876b52992a to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'json'
require 'terminal-table'
def cpu_to_milli(cpu)
if cpu =~ /\A(\d+)m\z/
return $1.to_i
end
return cpu.to_i * 1000
end
def memory_to_mib(s)
if s =~ /\A(\d+)Mi\z/
return $1.to_i
elsif s =~ /\A(\d+)Gi\z/
return $1.to_i * 1024
elsif s =~ /\A(\d+)Ki\z/
return $1.to_i / 1024
end
raise "Invalid memory: #{s}"
end
nodes = {}
JSON.parse(`kubectl get nodes -ojson`)['items'].each do |n|
nodes[n['metadata']['name']] = n
end
pods = JSON.parse(`kubectl get pod --all-namespaces -ojson`)['items']
pods.group_by do |pod|
pod['spec']['nodeName']
end.each do |nodename, pods|
puts ">>> #{nodename}"
rows = []
rows << ['namespace', 'name', 'phase', 'milli cpu', 'memory (MiB)']
rows << :separator
total_cpu = 0
total_memory = 0
pods.each do |pod|
namespace = pod['metadata']['namespace']
name = pod['metadata']['name']
phase = pod['status']['phase']
pod['spec']['containers'].each do |container|
if container['resources'] && container['resources']['requests']
requests = container['resources']['requests']
if requests['cpu']
cpu = cpu_to_milli(requests['cpu'])
total_cpu += cpu
end
if requests['memory']
memory = memory_to_mib(requests['memory'])
total_memory += memory
end
end
rows << [namespace, name, phase, cpu, memory]
end
end
rows << :separator
rows << ['total', '', '', total_cpu, total_memory]
allocatable = nodes[nodename]['status']['allocatable']
allocatable_cpu = cpu_to_milli(allocatable['cpu'])
allocatable_memory = memory_to_mib(allocatable['memory'])
rows << ['allocatable', '', '', allocatable_cpu, allocatable_memory]
rows << ['remain', '', '', allocatable_cpu - total_cpu, allocatable_memory - total_memory]
puts Terminal::Table.new(rows: rows)
puts
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment