Назад | Перейти на главную страницу

Ошибка при создании балансировщика нагрузки GCE: запрошенный IP-адрес не является статическим и не назначен LB

У меня есть ситуация, когда Kubernetes, по-видимому, больше не может назначать внешний IP-адрес службе после kubectl create -f Deployment.yaml. kubectl describe service <my-service> сообщает следующее ошибка:

CreatingLoadBalancerFailed    
Error creating load balancer (will retry): Failed to create load balancer 
for service default/<my-service>: requested ip <my-address> is 
neither static nor assigned to LB <id>(default/<my-service>): <nil>

Но gcloud compute addresses list указывает на то, что my-address статический IP-адрес:

NAME          REGION        ADDRESS       STATUS
<my-address>  europe-west1  <ip-address>  RESERVED

И Deployment.yaml содержит спецификацию для <my-service> что назначает <my-address> к балансировщику нагрузки:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: my-app
ports:
  - protocol: UDP
    port: <my-port>
type: LoadBalancer
loadBalancerIP: <my-address>

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

ОБНОВИТЬ Я зарезервировал новый статический (на этот раз также глобальный) IP-адрес с gcloud compute addresses create test-address --global и соответственно изменил назначение на LB: loadBalancerIP: test-address. Но та же ошибка остается.

ОБНОВИТЬ Если я не укажу loadBalancerIP в Deployment.yaml, развертывание проходит без ошибок, новый внешний IP-адрес назначается my-service. По этому адресу можно пинговать службу извне.

ОБНОВИТЬ Если я удалю свой прежний адрес с gcloud compute addresses delete my-address --region europe-west1, продвигайте новый внешний адрес с помощью gcloud compute addresses create --addresses <ip-address> --region europe-west1, а затем повторно развернуть с исходной строкой loadBalancerIP: my-address восстановлен в Deployment.yaml, снова появляется та же ошибка.

У меня была похожая проблема. Оказывается, если IP-адрес зарезервирован как глобальный, он не сработает. Я удалил свое бронирование и изменил его на тот же регион, что и мой кластер кубернетов. --global Мне пришлось использовать --region europe-west2 - тот же регион, что и мой кластер k8s.

до: неудача gcloud compute addresses create my-secure-sftp --global

после: успех gcloud compute addresses create my-secure-sftp --region europe-west2

@видеть https://github.com/kubernetes/kubernetes/issues/22721 Больше подробностей

Проблема была в Deployment.yaml где я имел в виду адрес под loadBalancerIp по символическому имени, а не по числовому IP-адресу (NAME и ADDRESS как показано gcloud compute addresses list соответственно). Если вместо этого я использую числовой IP-адрес, появляется подсистема балансировки нагрузки, к которой можно получить доступ извне по этому адресу (через балансировщик нагрузки). (это предыдущий ответ привел меня на правильный путь. У меня, возможно, сложилось неправильное впечатление, что использование символического имени раньше работало.)

Задний план С тех пор как я был переключение к собственному экземпляру виртуальной машины (вместо оболочки Google Cloud) для разработки образов контейнеров, я получаю "Insufficient Permission" ошибки из gcloud compute addressess list на этом экземпляре виртуальной машины. Я понимаю, что могу улучшить это, воссоздание экземпляра виртуальной машины с областью действия https://www.googleapis.com/auth/compute.readonly. В любом случае это ограничение явно не имело отношения к рассматриваемой проблеме.

Вы должны создать региональный адрес:

Вычислительные адреса gcloud создают my-secure-sftp --region europe-west2

Он выделяет глобальный IP-адрес для входящего контроллера (статус IN_USE), это именно то, что вам нужно.

Global static и Internal static не будут работать в вашем случае.

Вы должны создать региональный адрес в том же область, зона и проект на GCP

У меня проблема, потому что я создаю IP для другого проекта, в котором настраиваю LoadBalancer.