K8s 端口暴露:集群统一暴露 vs 单 Pod 暴露

K8s 端口暴露:集群统一暴露 vs 单 Pod 暴露


先说本质区别

Pod 是 K8s 里最小的运行单元,IP 是临时的------Pod 重启、扩缩容,IP 就变了。直接暴露 Pod 端口,调用方每次都要重新找地址,完全不可靠。

Service 解决的就是这个问题:它是一个稳定的虚拟入口,始终指向后面一组健康的 Pod,不管 Pod 怎么变。


单个 Pod 暴露端口

适合本地调试,不适合生产。

port-forward(最常用)

bash 复制代码
kubectl port-forward pod/mypod 8080:80

原理是 kubectl 在本机和 Pod 之间建了一条临时隧道,只有你本地能访问,Pod 重启就断。

hostPort(直接绑宿主机端口)

yaml 复制代码
containers:
- name: myapp
  ports:
  - containerPort: 80
    hostPort: 8080   # 绑到节点的 8080

Pod 跑在哪个节点,就只能通过那个节点的 IP:8080 访问。Pod 漂移到其他节点,地址就变了。

问题总结

  • Pod IP 不固定,重启即变
  • 没有负载均衡
  • 没有健康检查
  • 只适合临时调试,绝对不能用于生产

集群统一暴露端口

通过 Service 统一管理,这才是正确姿势。

ClusterIP(集群内部访问)

bash 复制代码
kubectl expose deployment myapp --port=80 --target-port=8080 --type=ClusterIP

分配一个虚拟 IP,只在集群内部可达。微服务之间互相调用用这个,外部访问不到。

复制代码
外部  ✗
集群内部 → ClusterIP:80 → Pod1:8080
                        → Pod2:8080
                        → Pod3:8080

NodePort(对外暴露,裸机常用)

bash 复制代码
kubectl expose deployment myapp --port=80 --target-port=8080 --type=NodePort

在每个节点上开一个随机端口(默认 30000-32767),外部通过节点IP:NodePort访问。

复制代码
外部 → 任意节点IP:32001 → ClusterIP:80 → Pod

缺点是端口丑、端口范围受限、节点 IP 变了又要重新配。

LoadBalancer(云上推荐)

bash 复制代码
kubectl expose deployment myapp --port=80 --type=LoadBalancer

云厂商(AWS/阿里云/GCP)自动分配一个外网 IP,帮你做四层负载均衡。最简单,但要花钱------每个 Service 都会创建一个独立的负载均衡器。

复制代码
外部 → 云LB外网IP:80 → NodePort → Pod

Ingress(生产首选)

上面三种都是四层(TCP),Ingress 是七层(HTTP/HTTPS),支持域名路由、路径路由、SSL 终止。

多个服务只需要一个 LoadBalancer,统一走 80/443,按域名或路径分发。

复制代码
外部 → LB:80/443
         → api.example.com     → api-svc     → Pod
         → web.example.com     → web-svc     → Pod
         → web.example.com/v2  → web-v2-svc  → Pod
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-svc
            port:
              number: 80
  - host: web.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-svc
            port:
              number: 80

四种方式横向对比

方式 访问范围 负载均衡 适用场景
port-forward 仅本机 本地调试
NodePort 外部可达 基础 裸机测试环境
LoadBalancer 外部可达 云厂商LB 云上单服务生产
Ingress 外部可达 七层路由 云上多服务生产

一句话选型

  • 调试port-forward
  • 裸机/自建集群NodePort
  • 云上单服务LoadBalancer
  • 云上多服务统一入口Ingress + 一个 LoadBalancer
相关推荐
张忠琳9 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
阿里云云原生10 小时前
让 AI Agent 看见正在发生的业务,阿里云 EventHouse 正式商业化
云原生
Elastic 中国社区官方博客10 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
AOwhisky11 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
风曦Kisaki13 小时前
#企业级docker私有仓库构建:harbor仓库与阿里云镜像仓库
阿里云·docker·容器
期待着201313 小时前
docker 安装 ,在centos7.9
运维·docker·容器
微三云 - 廖会灵 (私域系统开发)14 小时前
电商系统从单体到微服务拆分实践:拆什么、怎么拆、拆完后怎么办
微服务·云原生·架构
骑上单车去旅行15 小时前
Docker Compose 命令完全指南:从构建到运维
docker·容器·eureka
前端Baymax17 小时前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc17 小时前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s