У меня есть ситуация, когда 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.