Dynamically adding/removing named hosts from k8s ingress

5/9/2018

I'm setting up a k8s cluster on GKE. A wildcard DNS *.server.com will point to a Ingress controller. Internally to the cluster, there will be webserver pods, each exposing a unique service. The Ingress controller will use the server name to route to the various services.

Servers will be created and destroyed on a nearly daily basis. I'd like to know if there's a way to add and remove a named server from the ingress controller without editing the whole list of named servers.

-- Laizer
google-cloud-platform
google-kubernetes-engine
kubernetes
kubernetes-ingress

2 Answers

5/10/2018

It appears like you're planning to host multiple domain names on a single Load Balancer (==single Ingress resource). If not, this answer doesn't apply.

You can do this by configuring Ingress with a long list of domain names like:

spec:
  rules:
  - host: cats.server.com
    http:
      paths:
      - path: /*
        backend:
          serviceName: cats
          servicePort: 8080
  - host: dogs.server.com
    http:
      paths:
      - path: /*
        backend:
          serviceName: dogs
          servicePort: 8080
  - [...]

If that's your intention, there's no way of doing this without editing this whole list and applying it to the cluster every time.

You can build a tool to construct this manifest file, then apply the changes. The Ingress controller is smart enough that existing domains will not see a downtime if they're still on the list.

However the domains you removed from the list will also be removed from the URL Map of the load balancer and hence stop accepting the traffic.

-- AhmetB - Google
Source: StackOverflow

6/27/2019

I found a solution to add a rule to an ingress by executing the following patch:

[
  {
    "op": "add",
    "path": "/spec/rules/-",
    "value": {
      "host": "<HOST>",
      "http": {
        "paths": [
          {
            "path": "/*",
            "backend": {
              "serviceName": "<SERVICE_NAME>",
              "servicePort": <PORT>
            }
          }
        ]
      }
    }
  }
]
kubectl patch ingress ${INGRESS_NAME} --type json -p "$(cat patch.json)"

But I cant find the solution to remove it. What I tried is the follwoing patch;

[
  {
    "op": "remove",
    "path": '{.spec.rules[?(@.host=="<HOST>")]}'
  }
]

But I just get the error 'The "" is invalid' back from kubectl

Whats wrong with it? I followed the jsonPath syntax from https://kubernetes.io/docs/reference/kubectl/jsonpath/

-- David
Source: StackOverflow