Извлечение ClusterIP сервиса с помощью go в kubernetes

#go #kubernetes

#Вперед #kubernetes

Вопрос:

Предположим, что в кластере kubernetes существует служба с именем «SVC», работающая в пространстве имен NS. Мне нужно извлечь его IP (т. е. ClusterIP)

Я мог бы написать некоторый код (ниже), который работает, но я думаю, что этот подход не следует использовать. Поскольку этот код будет вызываться часто, загрузка конфигурации каждый раз является пустой тратой времени. Как мне лучше это сделать:

 namespace := "NS"
serviceName := "SVC"
clusterIP := ""

kubeconfig := filepath.Join(
     os.Getenv("HOME"), ".kube", "config",
)

config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
    fmt.Println("BuildConfigFromFlags Failed")
    return string(""), err
}

clientset, err := kubernetes.NewForConfig(config)
if err != nil {
    fmt.Println("NewForConfig Failed")
    return string(""), err
}

svcList, err :=  clientset.CoreV1().Services(namespace).List(metav1.ListOptions{
    FieldSelector: "metadata.name="   serviceName,
    })

//fmt.Printf("kubecofig: %sn",kubeconfig)
//fmt.Printf("config: %#v", config)
//fmt.Printf("nameSpaceList: %#v", svcList)
for _, svc := range svcList.Items {
    clusterIP = svc.Spec.ClusterIP
    break
}

fmt.Printf("Service IP: %s", clusterIP)
  

Есть ли способ, которым я могу написать подобный сжатый код и получить желаемый результат. Если есть способ использовать «amp;corev1.service», кто-нибудь, пожалуйста, может сказать мне, как это сделать?

Комментарии:

1. Не уверен, о чем вы спрашиваете, ваш код, похоже, работает просто отлично. Если вы хотите получить конкретный сервис, вы могли бы использовать metav1.ListOptions для добавления некоторых критериев выбора.

2. Разве это нельзя сделать без BuildConfigFromFlags() и NewForConfig(). AFAIK, это будет связано с конфигурацией, которая будет загружена, проанализирована (не уверен, что я прав). Если есть более эффективный способ, пожалуйста, дайте мне знать. Моя задача заключалась в этом.

3. Нет, именно так работает API. Вы загружаете конфигурацию своего кластера из конфигурации kube, инициализируете клиент с помощью конфигурации, а затем вызываете методы API для получения необходимой информации. Это похоже и на другие языки, это не просто Go

4. Это именно то, что kubectl делает каждый раз, когда вы его запускаете. Он считывает вашу конфигурацию, аутентифицируется в кластере и затем выполняет API

5. Если вы собираетесь вызывать API-интерфейсы много раз в одной и той же программе, да, вы должны инициализировать клиент один раз, а затем передавать ссылку на него всякий раз, когда вам нужно что-то вызвать.