裸金属Kubernetes集群部署NGINX Ingress控制器遇External-IP获取问题
解决Nutanix裸金属Kubernetes集群NGINX Ingress控制器无External-IP问题
1. 先清理冲突部署
你同时应用了cloud和baremetal两种环境的Ingress配置,会导致资源冲突,先清理现有Ingress相关资源:
kubectl delete namespace ingress-nginx
若有残留RBAC资源,额外执行:
kubectl delete clusterrole ingress-nginx kubectl delete clusterrolebinding ingress-nginx
2. 裸金属集群的可行解决方案
裸金属K8s集群没有云厂商提供的负载均衡器,默认LoadBalancer类型Service无法自动获取External-IP,以下是三种实用方案:
方案一:部署MetalLB模拟负载均衡器(推荐)
MetalLB可为裸金属集群的LoadBalancer类型Service分配指定网段的External-IP:
- 创建MetalLB命名空间:
kubectl create namespace metallb-system - 部署MetalLB控制器(确保镜像版本与你的K8s版本兼容,如v0.13.x适配K8s 1.21+)
- 配置IP地址池与L2广告:
创建metallb-config.yaml(替换为Nutanix集群中未被占用、可外部访问的IP段):
执行部署:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default namespace: metallb-system spec: addresses: - 192.168.1.100-192.168.1.200 # 替换为你的可用IP段 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default namespace: metallb-system spec: ipAddressPools: - defaultkubectl apply -f metallb-config.yaml - 重新部署裸金属版NGINX Ingress控制器(Service类型为LoadBalancer),此时Ingress Service会自动从MetalLB获取External-IP。
方案二:改用NodePort类型暴露Ingress控制器
无需负载均衡时,可通过节点IP+端口访问:
- 部署Ingress控制器后,修改Service类型:
kubectl patch service ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"NodePort"}}' - 查看分配的NodePort:
之后用任意集群节点IP+NodePort访问Ingress规则对应的服务。kubectl get service ingress-nginx-controller -n ingress-nginx
方案三:使用HostNetwork模式运行Ingress控制器
让Ingress直接使用节点的80/443端口:
- 编辑Ingress控制器的Deployment:
在kubectl edit deployment ingress-nginx-controller -n ingress-nginxspec.template.spec下添加:hostNetwork: true dnsPolicy: ClusterFirstWithHostNet - 保存退出后,控制器重启,直接用运行Ingress的节点IP访问80/443端口即可。
3. 验证部署结果
执行命令查看Ingress Service状态:
kubectl get service ingress-nginx-controller -n ingress-nginx
- MetalLB方案:
EXTERNAL-IP字段会显示分配的IP - NodePort方案:
PORT(S)字段会显示80:xxxx/TCP格式的端口 - HostNetwork方案:直接用节点IP访问80/443端口测试
内容的提问来源于stack exchange,提问作者Bailey Dunn
相关产品推荐
相关产品推荐

