You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过机构分配的公网IP将Kubernetes Ingress Controller暴露至互联网?

公网IP暴露Minikube中Ingress-Nginx的配置方案

Got it, let's break this down step by step—since you're working with a physical server (not cloud) and Minikube, most cloud-focused guides won't cover your exact scenario, but this setup is totally doable. Here's what you need to do:

1. 调整Minikube网络模式,让Ingress Controller直接绑定物理机端口

Minikube默认会创建一个独立的虚拟网络,导致它的IP和物理机公网IP不互通。解决这个的核心是让Minikube共享物理机的网络栈,这样Ingress-Nginx的服务端口(80/443)会直接监听在物理机的网卡上。

先清理旧的Minikube集群(如果有的话),再用host网络模式启动:

minikube delete
minikube start --driver=docker --network=host

注:如果你的物理机用的是其他驱动(比如VirtualBox),--network=host的配置会略有不同,但Docker驱动的host网络是最直接适配物理机公网IP的方案。

2. 启用并确认Ingress-Nginx Controller状态

启用Minikube的Ingress插件,然后检查组件是否正常运行:

minikube addons enable ingress
# 验证Ingress Controller Pod状态
kubectl get pods -n ingress-nginx

确保所有ingress-nginx-controller开头的Pod都是Running状态——这说明控制器已经在物理机上监听80和443端口了。

3. 配置Ingress资源,映射公网IP到后端服务

先部署一个测试用的后端服务(比如Nginx),再配置Ingress规则把公网IP的请求转发到这个服务。

第一步:部署测试服务

创建test-deployment.yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-test-svc
spec:
  selector:
    app: nginx-test
  ports:
  - port: 80
    targetPort: 80

应用这个配置:

kubectl apply -f test-deployment.yaml

第二步:配置Ingress规则

创建test-ingress.yaml文件,直接把公网IP作为访问规则的host:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: "119.92.169.227" # 替换成你的公网IP
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-test-svc
            port:
              number: 80

注:如果想让所有访问物理机80端口的请求都被Ingress处理,也可以去掉host字段,这样规则会匹配任意host的请求。

应用Ingress配置:

kubectl apply -f test-ingress.yaml

4. 开放物理机防火墙端口

因为你的物理机直接连公网,必须确保防火墙允许外部流量访问80和443端口:

  • 如果你用Ubuntu/Debian(ufw):
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw reload
    
  • 如果你用CentOS/RHEL(firewalld):
    sudo firewall-cmd --add-port=80/tcp --permanent
    sudo firewall-cmd --add-port=443/tcp --permanent
    sudo firewall-cmd --reload
    

额外检查:联系你的ISP确认他们没有封禁80/443端口(部分运营商默认会封这些端口,需要手动申请开通)。

5. 验证公网访问

从外部网络(比如用手机流量,不要用物理机所在的内网)访问http://119.92.169.227/,如果看到Nginx的默认欢迎页面,就说明配置成功了。

如果访问失败,可以排查以下几点:

  • 检查Ingress规则是否生效:kubectl describe ingress test-ingress
  • 确认物理机80端口被监听:sudo netstat -tulpn | grep :80(应该能看到nginx-ingress-controller进程)
  • 查看Ingress Controller日志:kubectl logs -n ingress-nginx <ingress-controller-pod-name>

内容的提问来源于stack exchange,提问作者John Keneth Paluca

火山引擎 最新活动