来自 k8s ingress 的动态 adding/removing 命名主机

Dynamically adding/removing named hosts from k8s ingress

我正在 GKE 上设置一个 k8s 集群。通配符 DNS *.server.com 将指向 Ingress 控制器。在集群内部,将有网络服务器 pods,每个都公开一个独特的服务。 Ingress 控制器将使用服务器名称路由到各种服务。

几乎每天都会创建和销毁服务器。我想知道是否有一种方法可以在不编辑整个命名服务器列表的情况下从入口控制器添加和删除命名服务器。

您似乎打算在单个负载均衡器(==单个 Ingress 资源)上托管多个域名。如果不是,则此答案不适用。

您可以通过配置 Ingress 一长串域名来完成此操作,例如:

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
  - [...]

如果这是您的意图,如果不编辑整个列表并每次都将其应用于群集,则无法做到这一点。

您可以构建一个工具来构建此清单文件,然后应用更改。 Ingress 控制器足够智能,如果现有域仍在列表中,则不会出现停机。

但是,您从列表中删除的域也将从负载均衡器的 URL 映射中删除,因此停止接受流量。

我通过执行以下补丁找到了向入口添加规则的解决方案:

[
  {
    "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)"

但我找不到删除它的解决方案。我尝试的是以下补丁;

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

但我刚从 kubectl

收到错误 'The "" is invalid'

有什么问题吗? 我遵循了 https://kubernetes.io/docs/reference/kubectl/jsonpath/

中的 jsonPath 语法