【kubernetes】Kubernetes SVC LoadBalancer出现external-ip pending

Kubernetes SVC LoadBalancer出现external-ip pending

问题概述

部署nginx.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dc
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21.6-alpine
ports:
- containerPort: 80

观察svc,发现EXTERNAL-IP一直处于pending

1
2
3
4
$ kubectl get svc                                                             
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 38m
nginx-svc LoadBalancer 10.106.164.16 <pending> 80:32403/TCP 11s

如果你使用自建的 Kubernetes 集群(minikube、kubeadm 等)。在这种情况下,没有集成 LoadBalancer(与 AWS、Google Cloud、阿里云等云厂商不同)。使用此默认设置,你只能使用 NodePort 或 Ingress Controller。

这时,如果你部署 LoadBalancer 则会出现 External-IP 一直处于 pending 的问题。

问题解决

minikube

https://minikube.sigs.k8s.io/docs/start/#loadbalancer-deployments

1
minikube tunnel

观察SVC

1
2
3
4
$ kubectl get svc                                                               
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39m
nginx-svc LoadBalancer 10.106.164.16 10.106.164.16 80:32403/TCP 74s

访问

1
curl http://10.106.164.16

kubeadm

如果是使用的是 kubeadm,可以参考 使用 kubeadm 和 MetalLB 搭建 Kubernetes & Istio 环境 使用 MetalLB 来解决本问题。

patch手动指定

添加patch

1
kubectl patch svc nginx-svc -n default -p '{"spec": {"type": "LoadBalancer", "externalIPs":["10.106.164.16"]}}'

参考文档

Service Mesh - Kubernetes LoadBalancer Service External IP 一直处于 pending 状态

stack overflow: Kubernetes service external ip pending