Dynamically adding/removing named hosts from k8s ingress

丶灬走出姿态 提交于 2019-12-02 05:12:09

问题


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.


回答1:


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.




回答2:


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/



来源:https://stackoverflow.com/questions/50261504/dynamically-adding-removing-named-hosts-from-k8s-ingress

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!