Istio入口网关的外部IP保持待定状态

6
我在k8s上部署了一个istio,一开始它工作得很好,但是过了一天后,我无法通过入口网关访问应用程序。然后检查了istio svc状态。它显示istio入口网关的外部IP处于待定状态。
我检查了服务的日志和事件,但没有发现任何问题。最可能引起这个问题的原因是什么?
外部IP保持待定状态:

1
这可能是由于您的Ingress无法连接到LoadBalancer引起的,这取决于您的K8s集群运行的位置。如果您在GCP或AWS上运行,则应验证是否确实有负载均衡器正在运行并且它正在接受流量。如果您在本地运行,则集群将无法自动配置负载均衡器,您需要提供一个负载均衡器。 - davidmontoyago
@davidmontoyago,我完全同意。看起来我几乎与您同时发布了您的评论。 - Piotr Malec
它正在Linux服务器上运行,但不在任何公共云平台上。它可以首先获取外部IP,但稍后外部IP会变为挂起状态。 - zzg
3个回答

3
这很可能是使用不提供外部负载均衡器的平台导致的istio入口网关问题。
根据istio文档:
如果设置了EXTERNAL-IP值,则您的环境具有可用于入口网关的外部负载均衡器。如果EXTERNAL-IP值为<none>(或永久为<pending>),则您的环境不为入口网关提供外部负载均衡器。在这种情况下,您可以使用服务的节点端口访问网关。
如果您确定您的环境有一个外部负载均衡器,请按照以下说明操作。
设置入口IP和端口:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')

在某些环境下,负载均衡器可能使用主机名而非 IP 地址进行公开。此时,入口网关的 EXTERNAL-IP 值将不是 IP 地址,而是主机名,上述命令将无法设置 INGRESS_HOST 环境变量。请使用以下命令来更正 INGRESS_HOST 的值:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

它部署在Linux服务器上,可以首先获取外部IP,但后来外部IP会变为待定状态。 - zzg

2

移除 traefik 服务解决了我在本地 k3d(开发环境)上的问题。

kubectl get svc -n kube-system

kubectl -n kube-sytem delete svc traefik 

我不是专家!这可能会产生一些副作用或引起其他问题。


1
这是可行的,因为Traefik在主机上使用相同的端口443,并防止Istio将其用于网关。我在k3s安装中遇到了同样的问题。 - suleyman

0
如果您正在使用KIND,则需要首先在其上安装{{link1:MetalLB}}。然后,如果istio-ingressgatewayLoadBalancer类型,则会分配外部IP。希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接