为什么需要 Kubernetes

概述

学会了用 Docker 部署微服务,一个容器跑一个服务,简单又清爽。

但当有 10 个、50 个、甚至 100 个微服务 要管理时,问题就来了:

  • 某个容器挂了,得手动重启?
  • 流量暴增,怎么快速扩容?
  • 新版本上线,如何平滑替换旧容器?
  • 容器分布在不同服务器,怎么统一调度?

这时候,光靠 docker run 就不够用了。

你需要一个 "容器操作系统" ------ 它就是:Kubernetes (常简写为 K8s)

使用 Kubernetes 管理

Docker 解决了 "应用打包" 的问题:

"在我机器上能跑!" → "在任何地方都能跑!"

如果 Docker 是**"集装箱"**,那么 Kubernetes 就是 "智能港口 + 自动吊车 + 调度中心"。

能力 Docker Kubernetes
打包应用 ✅ ✅(基于 Docker)
自动重启 ❌ ✅
水平扩容 ❌(需手动) ✅(一键或自动)
服务发现 ❌ ✅(内置 DNS)
滚动更新 ❌ ✅(零停机升级)
跨服务器调度 ❌ ✅

Kubernetes 不是替代 Docker,而是管理 Docker(或其他容器)的平台。

没有 K8s 时的场景

假设你有一个电商系统,包含 5 个微服务:

复制代码
用户服务 ×2 实例  
订单服务 ×3 实例  
支付服务 ×2 实例  
商品服务 ×4 实例  
网关服务 ×2 实例

总共 13 个容器,部署在 3 台服务器上

你会面对以下事情:

  1. 手动 SSH 到每台服务器,运行 docker run ...
  2. 记住每个服务跑在哪台机器、用什么端口
  3. 某个容器崩溃?半夜被叫醒去重启
  4. 大促前要扩容?加班写脚本批量启动新容器
  5. 上线新版本?先停旧容器,再启新容器------用户会看到 502 错误!

Kubernetes 怎么解决问题?

Kubernetes 的核心思想是:你只告诉它"想要什么状态",它负责实现并维持这个状态。

比如你说:

"我要 3 个订单服务实例,永远保持运行。"

K8s 就会:

  • 启动 3 个容器
  • 如果某个挂了,自动重建
  • 如果服务器宕机,把容器迁移到其他机器
  • 所有实例通过一个固定名字(如 order-service)被访问

这叫做 声明式 API(Declarative API) ------ 你描述目标,系统负责达成。

Kubernetes 的五大核心能力

1、自动化部署

  • 容器崩溃?自动重启
  • 节点故障?自动迁移 Pod 到健康节点
  • 健康检查失败?自动剔除流量

2、水平扩缩容

bash 复制代码
# 手动扩容到 5 个实例
kubectl scale deployment/order-service --replicas=5

或配置 HPA(Horizontal Pod Autoscaler),根据 CPU/内存自动扩缩,应对流量高峰,节省资源成本。

3、服务发现与负载均衡

在 K8s 中,你只需创建一个 Service:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: order-service
spec:
  selector:
    app: order
  ports:
    - port: 80
      targetPort: 3000

其他服务就可以通过 http://order-service 直接调用,无需知道 IP 或端口

4、滚动更新与回滚

更新镜像版本?K8s 会:

  • 逐个替换旧 Pod
  • 确保始终有可用实例
  • 如果新版本出错,可一键回滚
bash 复制代码
# 更新镜像
kubectl set image deployment/order-service order=order:v2

# 回滚
kubectl rollout undo deployment/order-service

5、配置与密钥管理

敏感信息(如数据库密码)和配置文件,不再硬编码在镜像中,而是通过 K8s 对象注入。

适用场景

场景 是否推荐
个人项目 / 学习 ⚠️ 可学,但可能"杀鸡用牛刀"
初创公司 MVP ⚠️ 先用 Docker Compose,等规模大了再迁
中大型微服务系统 ✅ 强烈推荐
高可用、高并发业务 ✅ 必备
多云 / 混合云部署 ✅ K8s 是事实标准

最佳实践

  1. 本地体验:

    • 安装 Minikube(单机 K8s)
    • 或使用 Kind(用 Docker 跑 K8s)
  2. 核心概念:

    • Pod(最小调度单元)
    • Deployment(管理 Pod 副本)
    • Service(暴露服务)
    • Namespace(资源隔离)
  3. 动手实践:

    • 把之前的 user-service 部署到 K8s
    • 尝试扩容、更新、查看日志
bash 复制代码
# 示例:部署 user-service
kubectl create deployment user-svc --image=user-service:latest
kubectl expose deployment user-svc --port=80 --target-port=3000
kubectl get services

总结

Docker 让应用可移植,Kubernetes 让应用可运维。

当你只有几个容器时,Docker 足够;

但当你的系统变成由 成百上千个微服务 组成的复杂生态时,
Kubernetes 就不再是"可选项",而是"必需品"。

它解决了微服务架构中最头疼的问题:

  • 可靠性(自愈)
  • 弹性(扩缩容)
  • 协作(服务发现)
  • 交付效率(滚动更新)
相关推荐
喵了几个咪25 分钟前
RushWind Admin — 契约驱动:203 条路由零手写的工程化拆解
微服务·rust·开源·admin
ysu_03141 小时前
Docker-Desktop-WSL2实战指南-Windows从安装配置到项目容器化
windows·python·docker·容器·composer·dockerfile·wsl2
陈陈CHENCHEN2 小时前
【Kubernetes】纯 IPv6 K8s 集群访问外部 IPv4 服务
云原生·容器·kubernetes
明王明王2 小时前
从零搭建一个 AI Infra 实验室⑫:Docker 为什么默认看不到 GPU
人工智能·docker·容器
天衍四九-2 小时前
Docker Compose企业实战系列(四):Redis生产级部署|密码加固、持久化、内存优化完整方案
redis·docker·容器
troy1282 小时前
如何在谷歌云(Google Cloud)上部署 Kubernetes 集群
云原生·容器·kubernetes
xiaoligangting3 小时前
太原岗亭款式齐全
云原生
guo_wen_qiang3 小时前
docker安装常见软件集合
运维·docker·容器
喵了几个咪4 小时前
Go 写业务,Rust 扛底盘:一套可落地的混合架构
微服务·架构·golang·rust·多租户·gowind·rushwind
阿俊-全栈开发10 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户