nodes.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package nodes
  2. import (
  3. "context"
  4. "fmt"
  5. "sync"
  6. v1 "k8s.io/api/core/v1"
  7. "k8s.io/client-go/kubernetes"
  8. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  9. )
  10. type NodeUsage struct {
  11. fractionCpuReqs float64
  12. fractionCpuLimits float64
  13. fractionMemoryReqs float64
  14. fractionMemoryLimits float64
  15. fractionEphemeralStorageReqs float64
  16. fractionEphemeralStorageLimits float64
  17. }
  18. type NodeWithUsageData struct {
  19. Name string `json:"name"`
  20. FractionCpuReqs float64 `json:"cpu_reqs"`
  21. FractionCpuLimits float64 `json:"cpu_limits"`
  22. FractionMemoryReqs float64 `json:"memory_reqs"`
  23. FractionMemoryLimits float64 `json:"memory_limits"`
  24. FractionEphemeralStorageReqs float64 `json:"ephemeral_storage_reqs"`
  25. FractionEphemeralStorageLimits float64 `json:"ephemeral_storage_limits"`
  26. Condition []v1.NodeCondition `json:"node_conditions"`
  27. }
  28. func (nu *NodeUsage) Externalize(node v1.Node) *NodeWithUsageData {
  29. return &NodeWithUsageData{
  30. Name: node.Name,
  31. FractionCpuReqs: nu.fractionCpuReqs,
  32. FractionCpuLimits: nu.fractionCpuLimits,
  33. FractionMemoryReqs: nu.fractionMemoryReqs,
  34. FractionMemoryLimits: nu.fractionMemoryLimits,
  35. FractionEphemeralStorageReqs: nu.fractionEphemeralStorageReqs,
  36. FractionEphemeralStorageLimits: nu.fractionEphemeralStorageLimits,
  37. Condition: node.Status.Conditions,
  38. }
  39. }
  40. func GetNodesUsage(clientset kubernetes.Interface) []*NodeWithUsageData {
  41. nodeList, _ := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
  42. extNodeList := make([]*NodeWithUsageData, len(nodeList.Items))
  43. var wg sync.WaitGroup
  44. for i := range nodeList.Items {
  45. index := i
  46. currentNode := &nodeList.Items[index]
  47. wg.Add(1)
  48. go func() {
  49. defer wg.Done()
  50. podList := getPodsForNode(clientset, currentNode.Name)
  51. nodeUsage := DescribeNodeResource(podList, currentNode)
  52. extNodeList[index] = nodeUsage.Externalize(*currentNode)
  53. }()
  54. }
  55. wg.Wait()
  56. return extNodeList
  57. }
  58. func getPodsForNode(clientset kubernetes.Interface, nodeName string) *v1.PodList {
  59. fmt.Printf("%s", nodeName)
  60. podList, _ := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{
  61. FieldSelector: "spec.nodeName=" + nodeName + ",status.phase=Running",
  62. })
  63. return podList
  64. }