简体   繁体   中英

GKE - how to attach static ip to internal load balancer

I want to connect service from one GKE cluster to another one. I created service as a internal load balancer and I would like to attach a static ip to it. I created my service.yml

apiVersion: v1
kind: Service
metadata:
  name: ilb-service
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
    kubernetes.io/ingress.global-static-ip-name: es-test
  labels:
    app: hello
spec:
  type: LoadBalancer
  selector:
    app: hello
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP

However after apply -f when I check the service the load balancer ingress looks like this:

status:
  loadBalancer:
    ingress:
    - ip: 10.156.0.60

And I cannot connect using the static ip. How to solve it?

EDIT:

After suggestion I changed the yml file to:
apiVersion: v1
kind: Service
metadata:
  name: ilb-service
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  labels:
    app: hello
spec:
  type: LoadBalancer
  selector:
    app: hello
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  loadBalancerIP: "xx.xxx.xxx.xxx" -- here my static ip

Service now looks like it:

spec:
  clusterIP: 11.11.1.111
  externalTrafficPolicy: Cluster
  loadBalancerIP: xx.xxx.xxx.xxx
  ports:
  - nodePort: 31894
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: hello
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer: {}

And I still cannot connect

You won't use the annotation for the internal IP. Instead, just specify the IP address you want to use (not by name) in the spec.loadBalancerIP field allows you to specify a numeric IP address to assign to the loadBalancer. Make sure the IP is not in use anywhere else and is within the same subnet as your cluster.

EDIT

To clarify the last statement: If you have the internal IP reserved as a static IP, that IP is no longer available, it is considered "in use" by the static reservation. To assign the IP to an internal LoadBalancer, the IP must not be reserved nor can it be in use.

This is not made clear, but it is because of how the GCP controller created internal loadbalancers that it is unable to use an already reserved IP address.

November 2021 Update

It is possible to create a static internal IP and assign it to a LoadBalancer k8s service type.

  1. Go to the VPC networks -> Select your VPC -> Static Internal IP Addresses
  2. Click Reserve Static Address , then select a name for your IP and click Reserve . You can choose IP address manually here as well.
  3. In your Service YAML add the following annotation. Also make sure type is LoadBalancer and then assign the IP address.
...
annotations: 
  networking.gke.io/load-balancer-type: "Internal"
...
type: LoadBalancer
loadBalancerIP: <your_static_internal_IP>

This will spin up an internal LB and assign your static IP to it. You can also check in Static Internal IP Addresses screen that new IP is now in use by freshly created load balancer. You can assign a Cloud DNS record to it, if needed. Also, you can choose IP address "shared" during the reservation process so it can be used by up to 50 internal load balancers.

Assigning Static IP to Internal LB

Enabling Shared IP

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM