Docker Desktop Ubuntu环境下K8S LoadBalancer外部IP Pending求助
解决Docker Desktop K8S里MySQL LoadBalancer Service外部IP卡Pending的问题
先搞懂为啥会这样
Docker Desktop自带的K8S集群,本身没有像云厂商那样的负载均衡器支持,之前你部署SQL Server能拿到localhost,大概率是旧版本Docker Desktop的特殊兼容,新版本里没这待遇了,所以LoadBalancer类型的Service就一直卡着等外部IP,自然处于Pending状态。
给你三个解决办法,挑适合的来
办法1:直接换成NodePort类型(最省事)
不用纠结LoadBalancer,改成NodePort后直接用localhost:端口号就能访问。修改你的Service YAML配置:
apiVersion: v1 kind: Service metadata: name: mysql-service spec: type: NodePort # 把LoadBalancer改成NodePort ports: - port: 3306 targetPort: 3306 nodePort: 30306 # 可选,指定30000-32767之间的端口,不指定K8S会自动分配 selector: app: mysql # 要和你的MySQL Pod的label对应
改完后执行kubectl apply -f 你的service.yaml,然后用localhost:30306连接MySQL即可。
办法2:装MetalLB模拟LoadBalancer(非要用LoadBalancer的话)
MetalLB是给本地K8S集群做负载均衡的工具,装了之后就能给LoadBalancer类型的Service分配外部IP:
- 先确保Docker Desktop的K8S处于正常运行状态
- 安装MetalLB:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
- 新建
metallb-config.yaml配置地址池,选Docker Desktop子网里的IP段(默认是192.168.65.0/24,选该段内的IP即可):
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default-pool namespace: metallb-system spec: addresses: - 192.168.65.100-192.168.65.200 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default-advert namespace: metallb-system spec: ipAddressPools: - default-pool
- 应用配置:
kubectl apply -f metallb-config.yaml
- 重新创建你原来的LoadBalancer类型Service,此时
EXTERNAL-IP会从配置的池子里分配,用这个IP就能访问MySQL。
办法3:先确认MySQL Pod是不是正常运行
有时候Pod未就绪会导致Service异常,先检查Pod状态:
kubectl get pods
如果Pod不是Running状态,查看日志排查问题:
kubectl logs <你的MySQL Pod名称>
最后验证
不管用哪个办法,执行kubectl get svc查看Service状态:
- NodePort类型看
PORT(S)列的第二个端口 - LoadBalancer类型看
EXTERNAL-IP列
之后用对应的地址测试MySQL连接即可。
内容的提问来源于stack exchange,提问作者CleanCodeOnline
相关产品推荐
相关产品推荐

