class Reschedule::Reschedulers::MemoryThreshold

Attributes

heapster_api[R]
kubernetes_api[R]

Public Class Methods

new(options={}) click to toggle source
Calls superclass method Reschedule::Reschedulers::Base::new
# File lib/reschedule/reschedulers/memory_threshold.rb, line 11
def initialize(options={})
  super
  @heapster_api = Reschedule::Heapster::Api.new
  @kubernetes_api = Reschedule::Kubernetes::Api.new
end

Public Instance Methods

run() click to toggle source
Calls superclass method Reschedule::Reschedulers::Base#run
# File lib/reschedule/reschedulers/memory_threshold.rb, line 17
def run
  super
  node_names = rescheduleable_node_names
  Reschedule.logger.debug "Found #{node_names.length} rescheduleable nodes"
  return if node_names.blank?

  pods = get_pods
  Reschedule.logger.debug "Found #{pods.length} total pods"
  replication_controller_names = pods_and_node_names_to_replication_controller_names(pods, node_names)
  replication_controller_names.each do |replication_controller_name|
    reschedule_replication_controller(replication_controller_name)
  end
end

Private Instance Methods

get_pods() click to toggle source
# File lib/reschedule/reschedulers/memory_threshold.rb, line 33
def get_pods
  pods = kubernetes_api.get_pods
  pods.select { |pod| pod.metadata.namespace == options['namespace'] }
end
nodes_to_rescheduleable_node_names(nodes) click to toggle source
# File lib/reschedule/reschedulers/memory_threshold.rb, line 64
def nodes_to_rescheduleable_node_names(nodes)
  rescheduleable_node_names = []
  nodes.each do |node|
    node_name = node['name']
    node_stats = heapster_api.get_node_stats(node_name)
    if node_stats.code != 200
      Reschedule.logger.debug "Node stats not found: #{node_stats}"
      next
    end
    memory_limit = node_stats['stats']['memory-limit']['hour']['average']
    memory_usage = node_stats['stats']['memory-usage']['hour']['average']
    if memory_usage.to_f / memory_limit > options['memory_threshold']
      rescheduleable_node_names << node_name
    end
  end
  rescheduleable_node_names
end
pods_and_node_names_to_replication_controller_names(pods, node_names) click to toggle source
# File lib/reschedule/reschedulers/memory_threshold.rb, line 38
def pods_and_node_names_to_replication_controller_names(pods, node_names)
  node_pods = pods.select do |pod|
    node_names.include?(pod.spec.nodeName)
  end
  pods_to_replication_controller_names(node_pods)
end
pods_to_replication_controller_names(pods) click to toggle source
# File lib/reschedule/reschedulers/memory_threshold.rb, line 45
def pods_to_replication_controller_names(pods)
  replication_controller_names = pods.map do |pod|
    created_by = pod.metadata.annotations['kubernetes.io/created-by']
    created_by = JSON.parse(created_by)
    created_by['reference']['name']
  end
  replication_controller_names.uniq
end
rescheduleable_node_names() click to toggle source
# File lib/reschedule/reschedulers/memory_threshold.rb, line 54
def rescheduleable_node_names
  nodes = heapster_api.get_nodes
  if nodes.code != 200
    Reschedule.logger.debug "Unable to get nodes in Heapster: #{nodes}"
    return
  end
  Reschedule.logger.debug "Found #{nodes.length} nodes in Heapster"
  nodes_to_rescheduleable_node_names(nodes)
end