Static IP with "kubectl expose" on Google Container Engine stays in <pending> state forever
I am trying to expose a kubernetes "deployment" via the kubectl expose
command, wih a static IP address, on Google Container Engine.
With an ephemeral IP, everything works fine:
kubectl expose deployment my-application \
--type="LoadBalancer" --port=80 --target-port=8080
I use kubectl get services
and wait a few minutes to see the ephemeral IP having been assigned. I enter the IP in my browser and I see the applicaiton, i.e. everything works.
However, when I do the following:
Create a static IP address using the gcloud web interface (Networking -> External IP addresses -> Reserve Static IP address)
-
Re-create the service with the same command as above but with the extra
--load-balancer-ip
optionkubectl expose deployment my-application \ --type="LoadBalancer" --port=80 --target-port=8080 \ --load-balancer-ip='1.2.3.4' # IP as assigned by web interface above
The command is successful, but the application is not reachable under that IP address, and when I use the following command:
$ kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
endpoints 10.119.247.39 <pending> 80/TCP 23m
kubernetes 10.119.240.1 <none> 443/TCP 1d
I see that the EXTERNAL-IP
is still <pending>
although I've waited 23 minutes so far.
What am I doing wrong?
Solution 1:
The command you provided worked for me. In a first attempt to exposed the service I used a static IP address defined in a different region from where the Load Balancer was being created. As a result the Load Balancer was not created and the service kept in a "Pending" state.
$ kubectl get services | grep node3
hello-node3 10.3.242.65 <pending> 80/TCP 1m
$kubectl get events
48s 2m 5 hello-node3 Service Normal CreatingLoadBalancer {service-controller } Creating load balancer
47s 2m 5 hello-node3 Service Warning CreatingLoadBalancerFailed {service-controller } Error creating load balancer (will retry): Failed to create load balancer for service default/hello-node3: requested ip W.X.Y.Z is neither static nor assigned to LB a059cdb738ef911e6a83642010af001b(default/hello-node3): <nil>
Then I used an IP defined in us-central where my nodes lives.
kubectl expose deployment hello-node3 --type="LoadBalancer" --target-port=8080 --load-balancer-ip='A.B.C.D'
Then:
$ kubectl get services | grep node3
hello-node3 10.3.241.0 A.B.C.D 80/TCP 20m
$ curl A.B.C.D
Hello World!
I would suggest making sure the IP exists in the same region the cluster lives. If that fails, to obtain more information on the state by using kubectl get events
. That might shed some light.