mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-24 11:28:40 +08:00
146 lines
4.4 KiB
Go
146 lines
4.4 KiB
Go
package cluster
|
|
|
|
import (
|
|
"context"
|
|
"github.com/prometheus/common/expfmt"
|
|
"go.uber.org/zap"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes"
|
|
"pandax/apps/devops/entity/k8s"
|
|
"pandax/base/global"
|
|
"pandax/base/utils"
|
|
"strings"
|
|
)
|
|
|
|
func GetClusterVersion(c *kubernetes.Clientset) (string, error) {
|
|
/*
|
|
获取k8s 集群版本
|
|
*/
|
|
version, err := c.ServerVersion()
|
|
|
|
if err != nil {
|
|
global.Log.Error("get version from cluster failed", zap.Any("err: ", err))
|
|
return "", err
|
|
}
|
|
|
|
return version.String(), nil
|
|
}
|
|
|
|
func GetClusterNodesNumber(c *kubernetes.Clientset) (int, error) {
|
|
/*
|
|
获取k8s node节点数量
|
|
*/
|
|
nodes, err := c.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return len(nodes.Items), nil
|
|
}
|
|
|
|
func GetClusterNodesRunningStatus(c *kubernetes.Clientset, m *k8s.ClusterNodesStatus) *k8s.ClusterNodesStatus {
|
|
/*
|
|
统计k8s 集群node节点 就绪数量
|
|
*/
|
|
nodes, err := c.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
|
|
if err != nil {
|
|
global.Log.Error("get nodes err", zap.Any("err: ", err))
|
|
}
|
|
|
|
var ready int = 0
|
|
var unready int = 0
|
|
for _, node := range nodes.Items {
|
|
listNode, _ := c.CoreV1().Nodes().Get(context.TODO(), node.ObjectMeta.Name, metav1.GetOptions{})
|
|
|
|
if len(listNode.Status.Conditions) >= 0 {
|
|
if string(listNode.Status.Conditions[len(listNode.Status.Conditions)-1].Status) == "True" {
|
|
ready += 1
|
|
} else {
|
|
unready += 1
|
|
}
|
|
} else {
|
|
global.Log.Error("get nodes ready err")
|
|
return &k8s.ClusterNodesStatus{}
|
|
}
|
|
}
|
|
m.Ready = ready
|
|
m.UnReady = unready
|
|
return m
|
|
}
|
|
|
|
func GetClusterInfo(c *kubernetes.Clientset) *k8s.ClusterNodesStatus {
|
|
/*
|
|
获取集群信息
|
|
*/
|
|
var node k8s.ClusterNodesStatus
|
|
//nodeNumber, _ := GetClusterNodesNumber(c)
|
|
//node.Total = nodeNumber
|
|
|
|
// eg: node节点不健康
|
|
_ = GetClusterNodesRunningStatus(c, &node)
|
|
|
|
//namespace, deployment, pod := GetNodeResource(c)
|
|
//node.Namespace = namespace
|
|
//node.Deployment = deployment
|
|
//node.Pod = pod
|
|
|
|
data, _ := c.RESTClient().Get().AbsPath("/api/v1/namespaces/kube-system/services/tke-kube-state-metrics:http-metrics/proxy/metrics").DoRaw(context.TODO())
|
|
|
|
var parser expfmt.TextParser
|
|
mf, err := parser.TextToMetricFamilies(strings.NewReader(string(data)))
|
|
if err != nil {
|
|
global.Log.Error("解析metrics错误", zap.Any("err:", err))
|
|
return nil
|
|
}
|
|
|
|
var (
|
|
// cpuUsage
|
|
kubePodContainerResourceRequestsCpuCores float64 = 0
|
|
kubeNodeStatusCapacityCpuCores float64 = 0
|
|
// memoryUsage
|
|
kubePodContainerResourceRequestsMemoryBytes float64 = 0
|
|
kubeNodeStatusAllocatableMemoryBytes float64 = 0
|
|
)
|
|
|
|
for metricIndex, metricValue := range mf {
|
|
// sum(kube_pod_container_resource_requests_cpu_cores{node!~"master-.*"})/sum(kube_node_status_capacity_cpu_cores{node!~"master-.*"})*100
|
|
if metricIndex == "kube_pod_container_resource_requests_cpu_cores" {
|
|
for _, metric := range metricValue.GetMetric() {
|
|
kubePodContainerResourceRequestsCpuCores += *metric.Gauge.Value
|
|
}
|
|
}
|
|
if metricIndex == "kube_node_status_capacity_cpu_cores" {
|
|
for _, metric := range metricValue.GetMetric() {
|
|
kubeNodeStatusCapacityCpuCores += *metric.Gauge.Value
|
|
}
|
|
}
|
|
// sum(kube_pod_container_resource_requests_memory_bytes{node!~"master-.*"})/sum(kube_node_status_allocatable_memory_bytes{node!~"master-.*"})*100
|
|
if metricIndex == "kube_pod_container_resource_requests_memory_bytes" {
|
|
for _, metric := range metricValue.GetMetric() {
|
|
kubePodContainerResourceRequestsMemoryBytes += *metric.Gauge.Value
|
|
}
|
|
}
|
|
if metricIndex == "kube_node_status_allocatable_memory_bytes" {
|
|
for _, metric := range metricValue.GetMetric() {
|
|
kubeNodeStatusAllocatableMemoryBytes += *metric.Gauge.Value
|
|
}
|
|
}
|
|
|
|
// 计算Node节点数量
|
|
if metricIndex == "kube_node_info" {
|
|
node.NodeCount = len(metricValue.Metric)
|
|
}
|
|
|
|
}
|
|
|
|
node.CpuCore = utils.ParseFloat2F(kubePodContainerResourceRequestsCpuCores)
|
|
node.CpuUsage = utils.ParseFloat2F(kubePodContainerResourceRequestsCpuCores / kubeNodeStatusCapacityCpuCores * 100)
|
|
node.CpuCapacityCore = utils.ParseFloat2F(kubeNodeStatusCapacityCpuCores)
|
|
|
|
node.MemoryUsed = utils.ParseFloat2F(kubePodContainerResourceRequestsMemoryBytes / 1024 / 1024 / 1024)
|
|
node.MemoryUsage = utils.ParseFloat2F(kubePodContainerResourceRequestsMemoryBytes / kubeNodeStatusAllocatableMemoryBytes * 100)
|
|
node.MemoryTotal = utils.ParseFloat2F(kubeNodeStatusAllocatableMemoryBytes / 1024 / 1024 / 1024)
|
|
|
|
return &node
|
|
|
|
}
|