Reputation: 3634
I have a Kubernetes cluster running on Google Compute Engine and I would like to assign static IP addresses to my external services (type: LoadBalancer
). I am unsure about whether this is possible at the moment or not. I found the following sources on that topic:
I feel like the usage of static IPs is quite important when setting up web services. Am I missing something here? I'd be very grateful if somebody could enlighten me here!
EDIT: For clarification: I am not using Container Engine, I set up a cluster myself using the official installation instructions for Compute Engine. All IP addresses associated with my k8s services are marked as "ephemeral", which means recreating a kubernetes service may lead to a different external IP address (which is why I need them to be static).
Upvotes: 53
Views: 95286
Reputation: 3205
On my side I confirm that the loadBalancerIP
field allows to specify a static IP address for a GKE LoadBalancer, using Kubernetes 1.18.2:
apiVersion: v1
kind: Service
spec:
...
type: LoadBalancer
loadBalancerIP: 10.136.0.49
In addition, command below returns the load balancer IP for a given project:
gcloud compute forwarding-rules list --project <PROJECT_IS>
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET
aaba14cac607a4413813bebfb7eaaf8a us-central1 10.136.0.49 TCP us-central1/backendServices/aaba14cac607a4413813bebfb7eaaf8a
And that command proves it works fine:
kubectl get service <svc-name>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
<svc-name> LoadBalancer 10.136.27.201 10.136.0.49 4040:30754/TCP 57s
Upvotes: 3
Reputation: 37600
TL;DR Google Container Engine running Kubernetes v1.1 supports loadBalancerIP
just mark the auto-assigned IP as static first.
Kubernetes v1.1 supports externalIPs:
apiVersion: v1
kind: Service
spec:
type: LoadBalancer
loadBalancerIP: 10.10.10.10
...
So far there isn't a really good consistent documentation on how to use it on GCE. What is sure is that this IP must first be one of your pre-allocated static IPs.
The cross-region load balancing documentation is mostly for Compute Engine and not Kubernetes/Container Engine, but it's still useful especially the part "Configure the load balancing service".
If you just create a Kubernetes LoadBalancer on GCE, it will create a network Compute Engine > Network > Network load balancing > Forwarding Rule pointing to a target pool made of your machines on your cluster (normally only those running the Pods matching the service selector). It looks like deleting a namespace doesn't nicely clean-up the those created rules.
It is actually now supported (even though under documented):
loadBalancerIP
, wait until you've an external IP allocated when you run kubectl get svc
, and look up that IP in the list on that page and change those from Ephemeral to Static.loadBalancerIP=10.10.10.10
as above (adapt to the IP that was given to you by Google).Now if you delete your LoadBalancer or even your namespace, it'll preserve that IP address upon re-reploying on that cluster.
See also Kubernetes article describing how to set up a static IP for single or multiple domains on Kubernetes.
Upvotes: 78
Reputation: 3662
Kubernetes v1.1 will make a few changes.
First, all load-balancers in GCE will get static IPs. This allows us to simulate "update" operations that GCE does not support.
Second, https://github.com/kubernetes/kubernetes/pull/13005 proposes a new field to explicitly set the IP of a load balancer.
Note though that your "ephemeral" IP is yours as long as your Service exists. This is roughly akin to what AWS does with ELB names (randomly assigned, yours until you release it).
publicIPs (or deprecatedPublicIPs in v1) will be replaced with externalIPs with very similar semantics. These are "unmanaged" IPs - kubernetes will not establish a load-balancer using them, but it will accept traffic for them.
clusterIP is an in-cluster address and generally is not available outside of the cluster or "project" or VPC (in GCE or AWS terms)
Upvotes: 16
Reputation: 2135
If you are running on Google Container Engine, and are using type: LoadBalancer
, then Google Cloud Platform should have made a Network Load Balancer for you with a static IP address that will route to this service. You don't need to specify any IP addresses.
To find the network load balancer's IP, run:
gcloud compute forwarding-rules list --project "YOUR-PROJECT-ID"
You should also be able to run:
kubectl get services
Which will return both the cluster and external IP and port for your services.
Upvotes: 2