负载均衡器 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
事件:
<none>
在初始化 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
交谈。如果它有效,那么下一部分是调试ingress
和svc
之间的通信部分。而且我可以看到您的入口没有路径。虽然最好知道入口控制器是否正常工作。我的意思是来自www
的通信到达入口控制器。以上是关于负载均衡器 IP 和入口 IP 状态在 kubernetes 中处于挂起状态的主要内容,如果未能解决你的问题,请参考以下文章
minikube external-ip 始终处于挂起状态,而无法访问 emissary-ingress 负载均衡器