当没有外部 IP 但有 istio-ingressgateway 时,如何为 KNative 配置 DNS?

How to configure DNS for KNative when there isn't an External IP but there is an istio-ingressgateway?

knative docs描述如下:

To configure DNS for Knative, take the External IP or CNAME from setting up networking, and configure it with your DNS provider as follows

  • If the networking layer produced an External IP address, then configure a wildcard A record for the domain:

    # Here knative.example.com is the domain suffix for your cluster

    *.knative.example.com == A 35.233.41.212

  • If the networking layer produced a CNAME, then configure a CNAME record for the domain:

    # Here knative.example.com is the domain suffix for your cluster

    *.knative.example.com == CNAME a317a278525d111e89f272a164fd35fb-1510370581.eu-central-1.elb.amazonaws.com

但是,我的环境没有外部负载平衡器,因此没有外部 IP:

$ kubectl --namespace istio-system get service istio-ingressgateway
NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                      AGE
istio-ingressgateway   NodePort   10.110.132.172   <none>        15021:31278/TCP,80:32725/TCP,443:30557/TCP,15443:32309/TCP   8h

我确实配置了 istio-ingresgateway:

$ kubectl get po -l istio=ingressgateway -n istio-system \
     -o jsonpath='{.items[*].status.hostIP}'
10.1.0.193 10.1.0.132 10.1.0.174

我可以简单地设置 DNS 如下吗?

*.knative.example.com     [some TTL]   IN   A    10.1.0.193
*.knative.example.com     [some TTL]   IN   A    10.1.0.132
*.knative.example.com     [some TTL]   IN   A    10.1.0.174

到目前为止,按如下方式设置 DNS 对我来说没问题:

*.knative.example.com     [some TTL]   IN   A    10.1.0.193
*.knative.example.com     [some TTL]   IN   A    10.1.0.132
*.knative.example.com     [some TTL]   IN   A    10.1.0.174

您似乎在使用 hostPort 网络;如果是这样,那么 Kubernetes 会将主机 IP 地址的端口 80 和 443 映射到 Istio 的 envoy pods。本周只要你的 istio-ingressgateway pods 保持在同一台机器上的调度(例如,如果你使用 daemonset 并且在集群中有 3 个节点,将所有三个节点的 IP 都放在 DNS 中)。这里有几个地方会崩溃,Kubernetes LoadBalancer 服务会更好地工作:

  • 如果其中一台主机出现故障,1/N 个客户端将尝试错误的 IP 地址,并且可能会出错或超时很长,然后重试。您需要将主机从 DNS 中移除才能使其正常工作。
  • 如果你的主机多于 istio-ingressgateway pods,每次 pods 中的一个被重新安排(部署更新、主机内核升级等),你将遇到像这样的中断以上。如果主机少于 5-7 台,使用 DaemonSet 可以避免这种情况,但更大的记录集可能会导致其他问题。
  • 您不能使用 Horizo​​ntalPodAutoscaler (HPA) 来调整 istio-ingressgateway 的数量pods(不匹配的后果见上文)

如果可能,您可以将 MetalLB 视为上述任何您关心的成本低廉的软件负载平衡器。如果以上 none 是主要问题,那么 nodePort 服务比 LoadBalancer 服务要简单一些。