问题现象
如果你使用自建的 Kubernetes
集群(minikube、kubeadm 等)。在这种情况下,没有集成 LoadBalancer
(与 AWS、Google Cloud、阿里云等云厂商不同)。使用此默认设置,你只能使用 NodePort
或 Ingress Controller
。
这时,如果你部署 LoadBalancer
则会出现 External-IP
一直处于 pending
的问题。
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
$ cat <<EOF | kubectl apply -f -
kind: Service
apiVersion: v1
metadata:
name: nginx-ils-service
spec:
ports:
- name: http
port: 80
nodePort: 30062
selector:
app: nginx
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
selector:
matchLabels:
app: nginx
EOF
1
2
3
4
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11m
nginx-ils-service LoadBalancer 10.98.76.166 <pending> 80:30062/TCP 2m1s
解决方法
minikube
如果你使用的是 minikube,官方提供了如下便捷的解决方法:
1
2
3
4
5
6
7
8
9
10
11
$ minikube tunnel
Status:
machine: minikube
pid: 22554
route: 10.96.0.0/12 -> 192.168.64.3
minikube: Running
services: [nginx-ils-service]
errors:
minikube: no errors
router: no errors
loadbalancer emulator: no errors
执行完命令,External-IP
很快就会出现,详见 https://minikube.sigs.k8s.io/docs/handbook/accessing/#using-minikube-tunnel 。
1
2
3
4
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
nginx-ils-service LoadBalancer 10.98.76.166 10.98.76.166 80:30062/TCP 3m26s
浏览器访问 EXTERNAL-IP
,验证
kubeadm
如果是使用的是 kubeadm,可以参考 使用 kubeadm 和 MetalLB 搭建 Kubernetes & Istio 环境 使用 MetalLB 来解决本问题。