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.
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.
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/