Я работаю над кодом, который требует от меня создания службы Kubernetes с помощью внешнего балансировщика нагрузки с использованием API client-go .Сам сервис создается сразу, но для балансировщика нагрузки назначается IP-адрес в течение нескольких секунд.Как только IP-адрес назначен, он будет записан в массив Status.LoadBalancer.Ingress
структуры службы.
В настоящее время мой код выглядит следующим образом (за исключением некоторых деталей для краткости):
func createService(id string) error {
servicesClient := c.clientset.CoreV1().Services(apiv1.NamespaceDefault)
service := &apiv1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: serviceNamePrefix + id,
},
Spec: apiv1.ServiceSpec{
Type: apiv1.ServiceTypeLoadBalancer,
Selector: map[string]string{"app": id},
},
}
service, err = servicesClient.Create(service)
if err != nil {
return err
}
go func() {
for len(service.Status.LoadBalancer.Ingress) == 0 {
time.Sleep(1 * time.Second)
}
db.UpdateServiceURL(id, service.Status.LoadBalancer.Ingress[0])
}
return nil
}
В идеале, я бы использовал условную переменную, как в этом вопросе.Однако я не думаю, что это было бы возможно в этой ситуации, поскольку я не пишу код, в котором установлено значение.Есть ли какой-нибудь лучший способ подождать, пока массив Ingress не будет заполнен без необходимости постоянного цикла?Или кто-то еще имел эту проблему и нашел более хорошее решение?