我正在编写一些代码,这些代码需要我使用client-go API使用外部负载均衡器创建Kubernetes服务。该服务本身是立即创建的,但是为负载均衡器分配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
}
理想情况下,我会像在this问题中那样使用条件变量。但是,我认为在这种情况下这是不可能的,因为我没有编写设置该值的代码。有没有更好的方法可以等待Ingress数组填充而不必不断循环?还是其他人遇到了这个问题并找到了更好的解决方案?