Kubernetes服务外部IP挂起。

312

我正在尝试在 Kubernetes 上部署 nginx,Kubernetes 版本为 v1.5.2,我已经使用 3 个副本部署了 nginx,YAML 文件如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  revisionHistoryLimit: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

现在我想将其端口80暴露在节点的端口30062上,为此我创建了以下服务:

kind: Service
apiVersion: v1
metadata:
  name: nginx-ils-service
spec:
  ports:
    - name: http
      port: 80
      nodePort: 30062
  selector:
    app: nginx
  type: LoadBalancer

该服务的表现良好,但在Kubernetes仪表板和终端上仍显示为挂起状态。 终端输出仪表板状态

32个回答

1
相同问题:

os>kubectl get svc right-sabertooth-wordpress

名称 类型 集群IP 外部IP 端口(S)
right-sabertooth-wordpress 负载均衡器 10.97.130.7 "pending" 80:30454/TCP,443:30427/TCP

os>minikube service list

|-------------|----------------------------|--------------------------------|

| 命名空间 | 名称 | URL |

|-------------|----------------------------|--------------------------------|

| default | kubernetes | 没有节点端口 |

| default | right-sabertooth-mariadb | 没有节点端口 |

| default | right-sabertooth-wordpress | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| kube-system | kube-dns | 没有节点端口 |

| kube-system | tiller-deploy | 没有节点端口 |

|-------------|----------------------------|--------------------------------|

然而,可以通过http://192.168.99.100:30454访问它。


2
这不是对所提出问题的答案。 - vhs

1

有三种方式可以暴露您的服务:

  • NodePort
  • ClusterIP
  • LoadBalancer

当我们使用负载均衡器时,基本上是要求云服务提供商为我们提供一个可在线访问的 DNS,而不是域名。

因此,在我们的本地 minikube 环境中,负载均衡器类型无法使用。


0
如果你没有使用支持的云平台(如AWS,Azure,GCloud等),就无法使用LoadBalancer而不安装MetalLB https://metallb.universe.tf/。但是它目前还处于测试阶段...

请提供代码示例来说明您的答案。 - vhs

0

检查 kube-controller 日志。我通过将 clusterID 标签设置为我部署集群的 ec2 实例来解决了这个问题。


0
删除现有服务并创建一个相同的新服务解决了我的问题。我的问题是我定义的负载均衡IP被使用,因此外部端点处于挂起状态。当我更改为新的负载均衡IP时,它仍然无法工作。
最终,删除现有服务并创建一个新的服务解决了我的问题。

1
采用冲击维护并不能帮助 OP 理解正在发生的实际问题。 - vhs

0

删除所有旧服务并创建新的服务解决了我的问题。IP绑定在旧服务上。只需要尝试"$kubectl get svc",然后逐个删除所有的服务"$kubectl delete svc 'svc name' "


0

对于您的使用情况,最好的选择是使用NordPort服务,而不是负载均衡器类型,因为负载均衡器不可用。


0

我在Docker桌面上遇到了这个错误。我只是退出并重新启动(Docker桌面)。几秒钟后,它就正常工作了。


0
随着时间的推移,我们依赖云供应商在Kubernetes中进行网络连接。然而,在裸机上运行Kubernetes时,集成LoadBalancer等服务可能更具挑战性。
就像其他人一样,我也遇到了使用Docker容器“节点”kind安装本地Kubernetes集群时出现相同的问题,其中我的服务EXTERNAL-IP处于Pending状态。
我的建议:
  1. 使用类似Istio的入口来安装您的集群,以代理请求(在Istio中,它部署了一个入口控制器,可以作为传入流量的负载均衡器)。
  2. 使用NodePort / LoadBalancer服务的基本即席解决方案,并使用kubectl proxy(请记住,如果在不安全的环境或未经授权的使用中使用,它可能会潜在地将您的Kubernetes集群暴露给安全风险)
  3. 您还可以通过以下方式访问您的pod

kubectl port-forward pod-name local-port:pod-port

  1. 对于这种情况(On Premise 集群),另一个解决方案是使用 metallb,这是一个使用标准路由协议在 Kubernetes 上实现网络负载均衡器的工具。

当在 kind 中使用 metallb 时,我们需要将其部署在 l2 模式下。这意味着我们需要能够连接到节点子网的 IP 地址。如果您使用 Linux 来托管 kind 集群,则不需要执行此操作,因为 kind 节点 IP 地址是直接附加的。

Duffie Cooley 的一篇优秀的 文章详细解释了该过程。


-1

可能您部署服务的子网没有足够的IP地址。


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