负载均衡器 IP 和入口 IP 状态在 kubernetes 中处于挂起状态

Posted

技术标签:

【中文标题】负载均衡器 IP 和入口 IP 状态在 kubernetes 中处于挂起状态【英文标题】:Loadbalancer IP and Ingress IP status is pending in kubernetes 【发布时间】:2020-05-02 15:36:54 【问题描述】:

我使用两个 Azure Ubuntu VM 创建了 Kubernetes 集群。我能够使用 Nodeport 服务类型部署和访问 pod 和部署。我还检查了 Kube-system 命名空间中的 pod 状态。所有 pod 的状态都显示为 running。但是,每当我向 Loadbalancer 提及服务类型时,它并没有创建 LoadBalancer IP,它的状态始终显示为pending。我还为 nginx 服务创建了一个 Ingress 控制器。仍然,它没有创建入口地址。在初始化 Kubernetes master 时,我使用了以下命令。

kubeadm init

下面是部署、svc 和 Ingress 清单文件。

apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80

apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx

kubectl describe svc nginx

Name: nginx Namespace: default Labels: app=nginx Annotations: kubectl.kubernetes.io/last-applied-configuration: "apiVersion":"v1","kind":"Service","metadata":"annotations":,"labels":"app":"nginx","name":"nginx","namespace":"default","spec":"p... Selector: app=nginx Type: ClusterIP IP: 10.96.107.97 Port: http 80/TCP TargetPort: 80/TCP Endpoints: 10.44.0.4:80,10.44.0.5:80,10.44.0.6:80 Session Affinity: None Events: <none>

apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: test-ingress spec: backend: serviceName: nginx servicePort: 80

kubectl describe ingress nginx

名称:测试入口

命名空间:默认

地址:

默认后端:nginx:80 (10.44.0.4:80,10.44.0.5:80,10.44.0.6:80)

规则:

主机路径后端


**nginx:80 (10.44.0.4:80,10.44.0.5:80,10.44.0.6:80)

注释: kubectl.kubernetes.io/last-applied-configuration: "apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":"annotations":,"name" :"test-ingress","namespace":"default","spec":"backend":"serviceName":"nginx","servicePort":80

事件:&lt;none&gt;

在初始化 kubeadm init 时,我们是否需要提及 VM 的任何 IP 范围(私有或公共)?要么 我们是否需要更改 Azure Ubuntu VM 中的任何网络设置?

【问题讨论】:

您需要提供更多详细信息,例如命令kubectl describe svc 的输出。它会给出服务遇到的错误。 我可以查看您的部署的 yaml 文件吗?你是如何暴露服务端口的?您是否使用externalIPs: 定义了所需的 IP 地址? 您好,Charles Xu 和 Anuradha Fernando。我在 Question? 中添加了命令 kubectl describe svc 和部署和服务 yaml 清单文件的输出? 【参考方案1】:

当您创建自己的 Kubernetes 集群而不是 AWS、Azure 或 GCP 提供的集群时,没有集成负载均衡器。由于这个原因,您的 IP 状态处于待处理状态。

但是使用 Ingress Controller 或者直接通过 NodePort 可以规避这个问题。

但是,我还在您的 nginx service 中观察到您正在使用注释 service.beta.kubernetes.io/aws-load-balancer-type: nlb,并且您说您正在使用 Azure,这些是服务的平台特定注释,并且该注释是 AWS 特定的。

但是,您可以尝试这样的事情,如果您想直接使用公共 IP 进行实验,您可以通过在您的服务中提供 externalIPs 来定义您的服务,前提是您有一个公共 IP 分配给您的节点并允许来自某处的入口流量。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
  externalIPs:
    - 80.11.12.10

但是,如果您打算构建自己的 Kubernetes 集群,则使用ingress controller 是一个很好的方法。

希望这会有所帮助。

【讨论】:

嗨二进制子弹。感谢您的回复。我已经更新了我的问题。你能检查一下吗? 好吧,让我们尝试调试一下,添加入口控制器后现在的实际问题是什么。首先从curl 10.96.107.97:80 开始,看看您的svc 是否能够与pods 交谈。如果它有效,那么下一部分是调试ingresssvc 之间的通信部分。而且我可以看到您的入口没有路径。虽然最好知道入口控制器是否正常工作。我的意思是来自www 的通信到达入口控制器。

以上是关于负载均衡器 IP 和入口 IP 状态在 kubernetes 中处于挂起状态的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 nginx 入口的“无法确保负载均衡器”错误

minikube external-ip 始终处于挂起状态,而无法访问 emissary-ingress 负载均衡器

负载均衡器的 AWS EKS 服务 EXTERNAL-IP 处于待处理状态

服务器负载均衡-文章整理

双WAN口路由器如何设置负载均衡

lvs负载均衡NAT模式