当没有外部 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 可以避免这种情况,但更大的记录集可能会导致其他问题。
- 您不能使用 HorizontalPodAutoscaler (HPA) 来调整 istio-ingressgateway 的数量pods(不匹配的后果见上文)
如果可能,您可以将 MetalLB 视为上述任何您关心的成本低廉的软件负载平衡器。如果以上 none 是主要问题,那么 nodePort 服务比 LoadBalancer 服务要简单一些。
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 可以避免这种情况,但更大的记录集可能会导致其他问题。
- 您不能使用 HorizontalPodAutoscaler (HPA) 来调整 istio-ingressgateway 的数量pods(不匹配的后果见上文)
如果可能,您可以将 MetalLB 视为上述任何您关心的成本低廉的软件负载平衡器。如果以上 none 是主要问题,那么 nodePort 服务比 LoadBalancer 服务要简单一些。