k8s-golang获取健康状态ip

测试

go 复制代码
package k8s

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestGetServicePods(t *testing.T) {
	agent, err := NewK8sAgent("./config")
	require.NoError(t, err)
	require.NotEmpty(t, agent)
	data, err := agent.GetServicePods("sit-xchat", "xchat-controller-go-sit")
	require.NoError(t, err)
	require.NotEmpty(t, data)
}

func TestRunningIPList(t *testing.T) {
	agent, err := NewK8sAgent("./config")
	require.NoError(t, err)
	require.NotEmpty(t, agent)
	data, err := agent.GetRunningIP("uat-xchat", "triton-ensemble-dssm-uat-lb")
	for _, item := range data {
		fmt.Printf("item:%v\n", item)
	}
	require.NoError(t, err)
	require.NotEmpty(t, data)
}

k8s访问

go 复制代码
package k8s

import (
	"context"
	"fmt"

	"logger"

	coreV1 "k8s.io/api/core/v1"
	metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

type K8sAgent struct {
	k8sClientset *kubernetes.Clientset
}

func NewK8sAgent(kubeconfig string) (*K8sAgent, error) {
	k8sAgent := K8sAgent{}
	if err := k8sAgent.init(kubeconfig); err != nil {
		return nil, err
	}

	return &k8sAgent, nil
}

func (agent *K8sAgent) init(kubeconfig string) error {
	var config *rest.Config
	var err error

	logger.Info(fmt.Sprintf("kubeconfig: %s", kubeconfig))
	if kubeconfig == "" {
		config, err = rest.InClusterConfig()
		if err != nil {
			logger.Errorf("rest.InClusterConfig error: %s", err)
			return err
		}
	} else {
		config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
		if err != nil {
			logger.Errorf("clientcmd.BuildConfigFromFlags error: %s", err)
			return err
		}
	}
	agent.k8sClientset, err = kubernetes.NewForConfig(config)
	return err
}

func (agent *K8sAgent) UpdateDeploymentReplicas(ns, deploymentName string, replicas int32) error {
	deployment, err := agent.k8sClientset.AppsV1().Deployments(ns).Get(context.TODO(), deploymentName, metaV1.GetOptions{})
	if err != nil {
		return err
	}

	oldReplicas := deployment.Spec.Replicas
	deployment.Spec.Replicas = &replicas
	if _, err = agent.k8sClientset.AppsV1().Deployments(ns).Update(context.TODO(), deployment, metaV1.UpdateOptions{}); err != nil {
		logger.Errorf("k8s agent update deployment(%s/%s) error: %s", ns, deploymentName, err)
		return err
	}
	logger.Infof("k8s agent update deployment(%s, %s) replicas(%d -> %d)", ns, deploymentName, *oldReplicas, replicas)
	return nil
}

func (agent *K8sAgent) GetDeploymentReplicas(ns, deploymentName string) (int32, int32, error) {
	deployment, err := agent.k8sClientset.AppsV1().Deployments(ns).Get(context.TODO(), deploymentName, metaV1.GetOptions{})
	if err != nil {
		logger.Errorf("k8s agent get deployment(%s/%s) error: %s", ns, deploymentName, err)
		return -1, -1, err
	}

	ready, total := deployment.Status.ReadyReplicas, deployment.Status.Replicas
	return ready, total, nil
}

func (agent *K8sAgent) GetDeploymentPods(namespace string, deploymentName string) ([]coreV1.Pod, error) {
	deployment, err := agent.k8sClientset.AppsV1().Deployments(namespace).Get(context.TODO(), deploymentName, metaV1.GetOptions{})
	if err != nil {
		logger.Errorf("k8s agent get deployment(%s) error: %s", deploymentName, err)
		return nil, err
	}

	selector := deployment.Spec.Selector
	labelSelector := metaV1.FormatLabelSelector(selector)
	podList, err := agent.k8sClientset.CoreV1().Pods(namespace).List(context.TODO(), metaV1.ListOptions{
		LabelSelector: labelSelector,
	})
	if err != nil {
		logger.Errorf("k8s agent get pods(deployment labelselector: %s) error: %s", labelSelector, err)
		return nil, err
	}
	logger.Infof("k8s agent GetDeploymentPods(%s/%s), pods: %d", namespace, deploymentName, len(podList.Items))

	return podList.Items, nil
}

func (agent *K8sAgent) GetServicePods(namespace string, serviceName string) ([]coreV1.Pod, error) {
	service, err := agent.k8sClientset.CoreV1().Services(namespace).Get(context.TODO(), serviceName, metaV1.GetOptions{})
	if err != nil {
		logger.Errorf("k8s agent get service(%s) error: %s", serviceName, err)
		return nil, err
	}

	selector := &metaV1.LabelSelector{
		MatchLabels: service.Spec.Selector,
	}
	labelSelector := metaV1.FormatLabelSelector(selector)
	podList, err := agent.k8sClientset.CoreV1().Pods(namespace).List(context.TODO(), metaV1.ListOptions{
		LabelSelector: labelSelector,
	})
	if err != nil {
		logger.Errorf("k8s agent get pods(service labelselector: %s) error: %s", labelSelector, err)
		return nil, err
	}
	return podList.Items, nil
}

// GetRunningIP 获取service下所有running状态的pod的ip
func (agent *K8sAgent) GetRunningIP(namespace string, serviceName string) ([]string, error) {
	podList, err := agent.GetServicePods(namespace, serviceName)
	if err != nil {
		return nil, err
	}

	runningIP := []string{}
	for _, pod := range podList {
		// 在运行中且未触发删除
		if pod.Status.Phase == coreV1.PodRunning && pod.DeletionTimestamp == nil {
			ready := true
			// 所有状态都初始化完成
			for _, condition := range pod.Status.Conditions {
				if condition.Status != coreV1.ConditionTrue {
					ready = false
					break
				}
			}
			if ready {
				runningIP = append(runningIP, pod.Status.PodIP)
			}
		}
	}

	return runningIP, nil
}

func (agent *K8sAgent) GetK8sClient() kubernetes.Clientset {
	return *agent.k8sClientset
}
相关推荐
@大迁世界4 小时前
告别 Go,拥抱 Rust
开发语言·golang·rust
闲云野鹤在人间6 小时前
Kubernetes Service 与 kube-proxy 详解
云原生·容器·kubernetes
我不会起名字3226 小时前
节点 NotReady:kubelet 与容器运行时的 4 步排查
云原生·kubernetes·kubelet·排查
说实话起个名字真难啊7 小时前
实战docker部署dify及注意点
运维·docker·容器
闲云自留地8 小时前
K8s Service 全解:服务发现、四种类型、会话保持、金丝雀发布一篇通
容器·kubernetes·服务发现
choumin9 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
喵了几个咪9 小时前
GoWind ShortPlay 拆解:不用模型的推荐闭环——埋点回流、三路召回与已看去重
开发语言·后端·微服务·golang·gowind
喵了几个咪10 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind
FungLeo11 小时前
成为全栈·Go 后端篇·用 Go 重写分层架构:领域包、装配根与最小抽象
golang·go·领域驱动设计·gorm·分层架构·成为全栈
北冥you鱼11 小时前
Go 语言 Ticker 定时任务全解析:原理、陷阱与最佳实践
开发语言·数据库·golang