mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-26 10:49:36 +08:00
【修改】k8s 配置
This commit is contained in:
145
apps/devops/services/k8s/cluster/cluster.go
Normal file
145
apps/devops/services/k8s/cluster/cluster.go
Normal file
@@ -0,0 +1,145 @@
|
||||
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
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user