下面是一个完整的 Kubernetes Ingress + NodePort 案例,适合你当前这种:
📌 无域名、📌 离线内网环境、📌 使用 nginx-ingress controller 的场景。
✅ 目标
- 部署一个 nginx 应用
- 使用 Ingress 进行访问控制
- 通过 NodePort 暴露 Ingress Controller
- 使用 IP+端口访问,不依赖域名
✅ 一、部署 nginx 应用(Deployment + Service)
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: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: ClusterIP selector: app: nginx ports: - port: 80 targetPort: 80
|
✅ 二、部署 Ingress 资源(不指定 host)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80
|
✅ 三、部署 nginx-ingress controller(NodePort 暴露)
以下是精简版的 nginx-ingress controller 的部署 YAML,使用 NodePort 暴露 30080 端口:
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 35 36 37 38 39 40 41 42 43
| apiVersion: apps/v1 kind: Deployment metadata: name: ingress-nginx-controller namespace: ingress-nginx spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: ingress-nginx template: metadata: labels: app.kubernetes.io/name: ingress-nginx spec: containers: - name: controller image: registry.k8s.io/ingress-nginx/controller:v1.10.0 args: - /nginx-ingress-controller - --election-id=ingress-controller-leader - --ingress-class=nginx ports: - name: http containerPort: 80 - name: https containerPort: 443 --- apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx spec: type: NodePort selector: app.kubernetes.io/name: ingress-nginx ports: - name: http port: 80 nodePort: 30080 targetPort: 80
|
🔧 如果你是离线部署,需要提前拉好镜像:
1
| docker pull registry.k8s.io/ingress-nginx/controller:v1.10.0
|
✅ 四、访问测试
部署完后,你就可以通过任意一台 Node 的 IP + NodePort 来访问你的 nginx 应用了:
1
| curl http://<任意NodeIP>:30080/
|
例如:
1
| curl http://192.168.1.10:30080/
|
你应该会看到 nginx 默认页面内容。
✅ 五、部署顺序建议:
1 2 3 4 5 6 7 8 9 10 11
| kubectl create namespace ingress-nginx
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-ingress-controller.yaml
kubectl apply -f nginx-ingress.yaml
|
✅ 六、扩展说明(可选)
| 场景 |
说明 |
| 多服务接入 |
可以给不同服务设置不同的 path,比如 /api、/web |
| 模拟域名 |
也可以给 Ingress 添加 host,用 curl 的 -H 或改 /etc/hosts 测试 |
| 支持 HTTPS |
可通过创建 TLS Secret 实现 HTTPS 访问 |