Kubernetes 分布式集群部署微服务

集群部署

如果你要把一个微服务部署在 Kubernetes(K8s)上,并且实现集群部署(也就是多个副本同时运行),那么:

📦 这个微服务就会被部署在 Kubernetes 上的多个 Pod 中

🔧 更具体点:

你通常会通过创建一个 Deployment(或 StatefulSet)来部署这个微服务:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-microservice
spec:
  replicas: 3              # 👈 集群部署,部署3个Pod副本
  selector:
    matchLabels:
      app: my-microservice
  template:
    metadata:
      labels:
        app: my-microservice
    spec:
      containers:
      - name: my-microservice-container
        image: my-microservice:latest
        ports:
        - containerPort: 8080

这就意味着:

内容含义
replicas: 3会启动 3 个 Pod,每个 Pod 是你这个微服务的一个独立副本
每个 Pod会被调度到不同节点(Node)上,K8s 自动调度
服务访问你可以通过 Service 将这些 Pod 统一暴露出去,实现负载均衡 + 服务发现

🧠 举个通俗比喻:

你这个微服务就像是一家奶茶店的“配方”
K8s 就像是建店的系统
你设置了 3 个副本,就像开了 3 家分店(Pod)
外部顾客(客户端)通过 Service(门店招牌)找到你,并自动分流到任意一家分店排队买单(负载均衡)

🔁 总结:

✅ 如果你要用 K8s 部署微服务,并做集群部署,那你这个微服务就会运行在 多个 Pod 中,每个 Pod 是同一个服务的一个副本,用于实现高可用、负载均衡和弹性扩容。

对外暴露 ip 地址和端口号

在同一个 Kubernetes 集群中,这些微服务副本(Pod)通过一个统一的 Service 对外暴露,IP 和端口是一样的。

📦 更详细地说:

对象IP/端口说明
每个 Pod(微服务副本)有自己的 IP,端口通常一样是临时的、会变化
Service(服务入口)有一个稳定的虚拟 IP 和端口是客户端访问的唯一入口
外部访问方式(如 NodePort、Ingress、LoadBalancer)视你用哪种方式而定最终对外暴露的 IP/端口统一

📌 举个例子:

你部署了一个名为 user-service 的微服务,配置如下:

apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
    - port: 80           # Service 对外暴露端口
      targetPort: 8080   # Pod 里容器的端口
  type: ClusterIP
  • 即使你后面部署了 5 个 Pod 副本
  • 它们各自的 IP 是不同的,例如:
    pod-1: 10.0.0.1
    pod-2: 10.0.0.2
    ...
    
  • 但你通过 Service 访问时,始终用同一个 IP+端口
    http://user-service:80
    

K8s 的 Service 会做负载均衡,把请求随机或轮询地分发给这些 Pod。

✅ 总结一句话:

在 Kubernetes 中,即使你有多个微服务实例(Pod),它们对外通过 Service 暴露的是统一的 IP 和端口,由 K8s 自动进行负载均衡和服务发现。

NodePort、LoadBalancer、Ingress 这三种方式做外网访问的区别?

这是 K8s 中对外暴露服务最常见的 3 种方式,理解它们的区别能让你在部署时做出更合适的选择。

🔍 NodePort vs LoadBalancer vs Ingress 对比表

对比项NodePortLoadBalancerIngress
✅ 是否能暴露到集群外部✅ 是✅ 是✅ 是(依赖 Service + 控制器)
🌐 访问方式<NodeIP>:<高端口>云提供商分配的公网 IP域名 + 路由路径(如 /api
📦 依赖 Service 类型NodePortLoadBalancer(封装了 NodePort)通常配合 ClusterIP 使用
🎯 主要用途简单测试、小规模部署云上生产级暴露服务多服务统一入口、域名/路由转发
🌍 外部访问 IP集群中每个节点的 IP云负载均衡器的公网 IP通常通过 Nginx/Traefik 暴露
📊 支持域名/HTTPS❌ 不支持❌ 依赖手动配置✅ 支持域名、HTTPS、证书等
⚙️ 易用性非常简单云厂商环境下简单(需要 cloud-provider)配置稍复杂,但功能强大
💰 成本无额外成本云厂商按流量/实例计费Ingress 控制器资源占用较小
🔄 路由能力✅ 强,可以做路径、域名级转发
🚪 占用端口会占用节点端口(30000~32767)同上通常 80/443,标准 Web 端口

🧪 举个例子更直观:

场景推荐方式举例
内部调试、快速访问服务NodePorthttp://<NodeIP>:30080
云环境中需要公网 IP 直连服务LoadBalancerhttp://123.45.67.89:80(阿里云/腾讯云分配的 IP)
多个微服务统一通过一个域名暴露Ingresshttps://api.myapp.com/user-service/order 路由到不同后端

🔧 小贴士:

  • 如果你部署在 本地 K8s(如 minikube),推荐从 NodePort 开始,简单好用。
  • 如果在 云平台(如 AWS、阿里云、腾讯云),可以直接用 LoadBalancer,自动申请公网负载均衡器。
  • 如果你需要对多个服务进行 统一入口管理、做路由分发、支持 HTTPS、证书配置 —— 那 Ingress 是首选,搭配 Nginx Ingress Controller 是主流方案。

✅ 总结一句话:

NodePort 简单粗暴,LoadBalancer 适合云上直通公网,Ingress 是功能最强大的入口网关,适合微服务架构下的生产环境。

微服务架构部署

Kubernetes 上部署一个微服务,且有多个副本(Pod)做集群部署,要对外提供访问

该选择哪种暴露方式,结合具体需求分析一下:

✅ 场景关键词:

  • 微服务架构(多个服务)
  • 每个服务有多个副本(Pod)
  • 部署在 Kubernetes 中
  • 需要对外暴露访问(客户端/浏览器/第三方系统访问)
  • 有一定的长期运维/高可用需求

🎯 推荐方案:Ingress + ClusterIP(默认)

理由说明
✅ 多副本支持Ingress 自动对接 Kubernetes 的 Service,Service 再通过 label 自动负载均衡多个 Pod 副本
✅ 统一入口你可以用一个域名统一管理多个微服务(如 /user/order/product),非常适合微服务架构
✅ 支持 HTTPS/域名可配置 TLS、Let’s Encrypt、Nginx rewrite 等,适合对接前端或外部调用
✅ 易于扩展和管理不需要每个服务都分配端口或公网 IP,维护简单,运维成本低
✅ 云/本地都适用无论你在云平台(阿里云、腾讯云、AWS)还是裸机集群,Ingress 都能很好支持

🔍 实际结构大致是这样:

用户请求
   ↓
[ Ingress Controller ] ← Nginx / Traefik / etc.
   ↓       (根据域名或路径转发)
[ Service (ClusterIP) ]
   ↓       (负载均衡)
[ 多个 Pod 副本 ]

❗ 不推荐单独用 NodePort 或 LoadBalancer 的原因:

  • NodePort:每个服务都要占用一个高位端口(如 30080),不易管理和扩展
  • LoadBalancer:每个服务都要申请一个公网 IP,云厂商可能收费、资源浪费,适合单服务或 Demo 级应用

✅ 最佳实践部署方式:

  1. 每个微服务都用一个 Deployment + ClusterIP 类型的 Service
  2. 统一使用一个 Ingress Controller(如 Nginx Ingress)
  3. 编写一个 Ingress 资源,根据不同的 path 或域名转发到对应服务

NodePort 和 LoadBalancer 能不能做到?

NodePort 和 LoadBalancer 本身确实可以实现统一的 IP 和端口对外暴露,支持多个 Pod 的副本访问,但它们各有局限,并不是最优解。

🔍 拆解一下核心需求:

“我有一个微服务,有多个实例副本部署在多个 Pod 中,我需要一个统一的 IP 和端口号对外暴露这个服务。”

这是一个标准的微服务外部暴露 + 负载均衡访问场景

📦 那 NodePort 和 LoadBalancer 到底能不能做到这个?

NodePort

  • 是可以暴露这个服务给集群外部访问的。
  • 它会把一个集群内的 Service 绑定到 每个节点的某个高位端口(如 30080)
  • 客户端访问 http://NodeIP:30080,K8s 会把请求转发到 Service,再由 Service 负载均衡到多个 Pod 副本上。
  • ⚠️ 但问题是
    • 端口是“高位随机”,不是标准的 80/443,用户体验不友好;
    • 如果节点多,你必须知道是哪台 Node 的 IP;
    • 不支持域名路由、TLS 等更高级功能。

详解

🧠 原话回顾:

“如果节点多,你必须知道是哪台 Node 的 IP”

📦 背后的意思是:
当使用 NodePort 暴露服务时,Kubernetes 会在集群中每一台 Node(节点)的指定高位端口上打开监听
也就是说:

  • 每一台 Node 都可以通过 NodeIP:NodePort 访问到你的这个服务
  • 但是,从集群外部访问的时候,你必须选择一台 Node 的 IP 来访问
  • 如果你不知道哪些 Node 有 IP、哪个 Node 在线,就没法访问服务

🔥 举个实际例子:
假设你的集群有 3 台 Node:

节点IP 地址
node110.0.0.1
node210.0.0.2
node310.0.0.3

你部署了一个微服务,并且用 NodePort 暴露,端口是 30080。

那么外部访问时:

  • 你可以访问:http://10.0.0.1:30080
  • 或者:http://10.0.0.2:30080
  • 或者:http://10.0.0.3:30080

现在说的是使用 NodePort 类型对外暴露服务,同时微服务是 多副本 Pod 部署 —— 这种情况下,确实具备如下特性:

  1. 你可以通过任意一个 Node 的 IP + NodePort 端口来访问服务

    只要这个节点在运行、网络可达,就能访问

  2. 即使你的服务有多个 Pod 副本(比如 3 个),Kubernetes 会自动进行负载均衡分发

    NodePort 实际是访问 Service,Service 通过 label selector 把请求轮询分发给多个 Pod(后端副本)

  3. 你不用关心 Pod 的实际 IP 和数量,K8s 的 Service 会处理路由和负载

    即使某个 Pod 被重建,Service 会自动感知更新后端地址池

🎯 小图说明:

用户访问:
http://<Node1-IP>:30080
http://<Node2-IP>:30080
http://<Node3-IP>:30080
       ↓
[ NodePort Service ] ——> Pod 副本 A(10.1.1.2:8080)
                       → Pod 副本 B(10.1.1.3:8080)
                       → Pod 副本 C(10.1.1.4:8080)
        (自动负载均衡)

✅ 所以可以放心地说:

“我只要访问任何一个可用 Node 的 IP + 暴露端口,就能访问我的服务,Kubernetes 会自动把请求负载均衡到后端的多个副本上。”

这就是 NodePort 模式在小规模或测试环境中简单且有效的地方。

当然,如果你后面想做更高级的统一入口(如 HTTPS、域名转发、多服务路由等),Ingress 会是更好的下一步。

👉 每台 Node 的 IP 都可以访问到这个服务。
但是问题来了:

  • 如果你不知道 node1、node2、node3 的 IP 地址,你就不知道去哪访问
  • 如果 node1 挂了,而你一直访问 10.0.0.1:30080,那你的服务就访问不到了 ❌。
  • 如果未来节点扩容、IP变化,还得手动更新,麻烦且易出错。

🚩 小结一下:

场景结果
节点少(单节点/双节点测试)还能凑合,IP容易找
节点多(生产环境10+台以上)很麻烦,不知道选哪个 IP,也不方便切换

这就是为什么在生产环境一般不用 NodePort 单独暴露服务,特别是节点多的时候。

✅ 归根到底:

**NodePort 虽然能暴露服务,但它只是把端口打开了,**没有真正解决"统一入口"的问题。
最好的方式是搭配一个统一的入口,比如 LoadBalancer(分配公网IP)或者 Ingress(统一域名+路径转发)。

LoadBalancer

  • 在云平台上可以通过云服务商分配一个公网 IP,绑定到你的 Service。
  • 类似 NodePort,但更优雅,自动提供一个外部统一入口(IP+端口)
  • 也可以转发流量到你的多个 Pod 实例。
  • ⚠️ 问题是
    • 只能暴露一个服务;如果有多个微服务,每个都要单独申请一个 LoadBalancer IP,成本高;
    • 不支持基于路径或域名路由(如 /api/user);
    • 不是跨云平台通用解决方案(依赖 cloud provider)

详解

📜 这句话说的是:
如果你用 LoadBalancer 类型的 Service去暴露服务的话:

  • 每个 Kubernetes Service(对应你的一个微服务)
  • 都会申请一个单独的公网 IP 地址(通过云厂商,比如阿里云、AWS、腾讯云分配)
  • 每个公网 IP 通常是按量计费的(IP 本身可能收钱,流量也收钱)
  • 所以:如果你的微服务多(比如 5 个、10 个、20 个微服务)
  • 那就要为每一个微服务单独买一个 LoadBalancer 和公网 IP
  • 成本会非常高!!💰

即使你的微服务是多副本部署(多个 Pod),只需要一个 LoadBalancer 类型的 Service,就足够了。

🔍 更详细一点解释:

  • 你的 Service 是用来统一管理多个 Pod 的副本的。
  • 在 Kubernetes 中,一个 Service(无论 NodePort、ClusterIP 还是 LoadBalancer)默认就会自动负载均衡到所有匹配的 Pod 副本
  • 所以,即便你有 3 个、5 个、10 个 Pod,只需要 1 个 LoadBalancer
  • 外部访问时,只要访问这个 LoadBalancer 分配的公网 IP,Kubernetes 和云负载均衡器(比如阿里云 SLB、AWS ELB)就会自动帮你把流量轮询到不同的 Pod 副本上。

🎯 你的结构大致长这样:

用户访问 LoadBalancer 的公网 IP
             ↓
        [ LoadBalancer Service ]
             ↓(负载均衡)
  [ Pod 副本 A ] [ Pod 副本 B ] [ Pod 副本 C ]
  • 用户完全感知不到后端有几个 Pod。
  • Kubernetes 会保证请求均匀分发到不同 Pod,提高性能和可用性。

✅ 所以结论:

场景你的情况
微服务数量1 个
副本数量(Pod)多个(比如 3 个)
需要的 LoadBalancer只要 1 个就够了

🚀 额外补充:
如果未来你的微服务数量增加到多个(比如 5 个微服务),这时候你可以考虑:

  • 要么每个新微服务再单独配一个 LoadBalancer(如果量不大,影响不大)
  • 要么切换到部署一个统一的 Ingress Controller,然后统一管理入口,避免 IP、端口炸裂

🧠 举个直白的例子:
假设你有 5 个微服务:

微服务描述
user-service用户服务
order-service订单服务
payment-service支付服务
product-service商品服务
inventory-service库存服务

如果你用 LoadBalancer,每个服务就要配:

  • 一个 LoadBalancer 类型的 Service
  • 云厂商分配一个公网 IP
  • 相当于买了 5 个公网 IP + 5 个负载均衡资源

💥 问题是:

  • 每个公网 IP 云厂商一般会收钱(月租 or 按小时计费)
  • 负载均衡器流量也按流量计费
  • 大量浪费资源,费用飙升

而且,维护 5 套公网访问地址,对开发、测试、运维都非常麻烦。

✅ 所以结论是:

方案适用场景缺点
单独用 LoadBalancer 暴露每个微服务少量服务(1-2个)多了就贵又难管理
用 Ingress Controller 统一暴露微服务体系(N个服务)配置稍复杂,但一劳永逸

Ingress Controller(比如 Nginx Ingress) 只需要:

  • 一个 LoadBalancer IP(给 Ingress Controller用)
  • 所有的微服务都走这个统一入口,通过路径或域名转发
  • 大大节省公网 IP 和负载均衡资源的费用!

✨ 总结一句话:

LoadBalancer 是给单个服务快速暴露公网访问的方案;如果微服务多,每个都用 LoadBalancer,公网 IP 和资源成本会爆炸式增长,不推荐这么搞。

真正合理的做法是:

用一个 LoadBalancer IP + 一个 Ingress Controller,统一接入所有微服务。

✅ 所以:能做到,但有明显局限。最推荐的还是用 Ingress。

特性NodePortLoadBalancerIngress(推荐)
多 Pod 负载均衡✅ 支持✅ 支持✅ 支持
统一访问入口❌ 不直观✅ 有公网 IP✅ 有域名 + 路由
多服务统一接入❌ 不方便❌ 成本高✅ 最强
HTTPS 支持❌ 不支持❌ 需自己配置✅ 支持 TLS、自动证书
用户体验❌ 端口奇怪✅ 但受限✅ 生产级方案
适合生产环境❌ 不推荐✅ 云上可用✅ 首选

✅ 总结一句话:

NodePort 和 LoadBalancer 确实可以实现统一入口访问多副本 Pod,但它们功能有限、扩展性差。在生产中,更推荐通过 Ingress 实现统一 IP/域名 + 负载均衡访问你的多实例微服务。

这样部署算不算多活架构?

很多人对“多实例部署”和“多活架构”这两个概念会混淆。

这种在 Kubernetes 上用多个 Pod 部署同一个微服务副本的方式,属于“单区域内的多实例部署”,但不完全等同于“多活架构”。**

🔍 那什么才叫“多活架构”?

✅ 多活架构(Active-Active Architecture)指的是:

在多个地理位置/数据中心/可用区同时部署多个活跃实例,它们可以共同对外提供服务,具有以下特征:

特征多活架构要求
✅ 多地部署实例分布在不同机房、城市、甚至国家
✅ 同时对外服务所有节点都处于活跃状态,而不是主备
✅ 流量智能调度基于地域、负载、延迟等将流量就近路由
✅ 容灾能力强任一地区故障,不影响整体对外服务能力

📌 所以现在这种部署属于:

部署类型是否多活
在 K8s 中部署多个 Pod(副本),都在同一个集群❌ 不是多活架构,但是“高可用部署”
在多个集群 / 不同地区各部署一套,并做 DNS/GSLB 流量分发✅ 属于标准多活架构

🧠 可以这样理解:

多 Pod ≠ 多活
多副本 ≠ 多活
多活是一个跨区域、高可用、高一致性、流量调度的系统架构设计目标。

✅ 总结一句话:

现在在一个 K8s 集群内用多个 Pod 部署微服务,属于高可用部署,而不是多活架构
如果将这个服务部署在多个集群/地区/可用区,并支持智能流量切换和灾备容错,那才是完整的多活架构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值