第一章:Kubernetes基础入门

1.1 从物理机到容器:Kubernetes 为什么诞生?

说实话,我入行那会儿,部署应用还是件挺「原始」的事。

一台物理机,装好操作系统,手动配好环境,然后把 jar 包扔进去。要是机器挂了,运维就得半夜爬起来重新部署。后来有了虚拟机,隔离性好了不少,但每台虚拟机都自带一个完整的操作系统,资源浪费严重。

再后来,Docker 出现了。容器技术让应用和它的依赖打包在一起,轻量、快速、可移植。但问题也随之而来——容器多了,你怎么管理?

举个例子,我在一个项目中同时跑了 50 个容器,它们分布在 3 台机器上。某台机器宕机了,上面的容器怎么办?流量怎么切?谁来重新调度?

这就是 Kubernetes 要解决的核心问题:容器的自动化部署、扩缩容、以及运维管理

一句话总结:Kubernetes 不是容器本身,而是容器的「管家」。

1.2 发展史:从 Borg 到 Kubernetes

Kubernetes 的源头,其实是 Google 内部用了十几年的集群管理系统——Borg。

Google 的工程师们每天要调度数十亿个容器,他们积累了大量的经验。2014 年,Google 把这些经验开源出来,就是 Kubernetes。名字来自希腊语,意为「舵手」或「领航员」。

我印象很深,Kubernetes 1.0 发布时,社区还很小。但到了 1.6 版本左右,它已经成了容器编排的事实标准。为什么?

  • 2015 年:Kubernetes 1.0 发布,Google 联合 Linux 基金会成立 CNCF。
  • 2017 年:Docker 宣布支持 Kubernetes,容器编排大战基本结束。
  • 2018 年:Kubernetes 成为 CNCF 首个毕业项目。
  • 现在:几乎所有云厂商都提供托管的 Kubernetes 服务,比如 AKS、EKS、GKE。

我个人习惯把 Kubernetes 的发展分为三个阶段:

  1. 探索期(2014-2016):大家都在试,文档少,踩坑多。
  2. 成熟期(2017-2019):API 稳定,生态丰富,生产环境开始大规模使用。
  3. 普及期(2020 至今):Kubernetes 成了云原生的「操作系统」。

我的建议:如果你刚开始学,直接从 1.20 以上版本入手。太老的版本 API 差异大,容易学歪。

1.3 核心概念:Pod、Service、Deployment

这三个概念,是 Kubernetes 的基石。你搞懂了它们,Kubernetes 就算入门了。

1.3.1 Pod:最小的调度单元

Pod 是 Kubernetes 中你可以创建和管理的最小计算单元。一个 Pod 可以包含一个或多个容器。

你可能会问:为什么不用单个容器,非要包一层 Pod?

嗯,这里要注意。Pod 里的容器共享网络和存储。比如,一个容器写日志,另一个容器收集日志,它们放在同一个 Pod 里就非常方便。我在项目中经常用这种模式——主业务容器 + 日志 sidecar 容器。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.21
  - name: log-collector
    image: fluentd:latest

避坑指南:我曾经把两个需要独立扩缩容的服务放在同一个 Pod 里,结果发现一个服务压力大,另一个也跟着被扩容。记住:Pod 是原子单位,要么一起扩,要么一起缩。

1.3.2 Service:稳定的网络入口

Pod 是动态的。它可能因为故障被销毁,也可能因为扩缩容被重建。每次重建,Pod 的 IP 都会变。

那问题来了:客户端怎么访问它?

Service 就是来解决这个问题的。它提供了一组 Pod 的稳定访问入口,不管 Pod 怎么变,Service 的 IP 和端口不变。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

说白了,Service 就是一个「负载均衡器」,把流量分发到后端的 Pod 上。我建议你记住三种常见的 Service 类型:

类型 说明 使用场景
ClusterIP 集群内部可访问 内部服务调用
NodePort 通过节点 IP + 端口访问 开发测试环境
LoadBalancer 云厂商提供公网入口 生产环境对外暴露

1.3.3 Deployment:声明式的应用管理

Deployment 是 Kubernetes 最常用的工作负载控制器。你告诉它「我要跑 3 个 nginx 副本」,它就会帮你维持这个状态。

我记得有一次,线上某个 Pod 挂了,Deployment 自动创建了一个新的。整个过程我完全没干预。这就是声明式的好处——你只管描述「想要什么」,Kubernetes 负责「怎么实现」。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

Deployment 还支持滚动更新。你更新镜像版本,它会逐步替换旧 Pod,保证服务不中断。我曾经用这个功能在白天直接升级了线上服务,用户完全无感知。

核心要点:Pod 是「工人」,Deployment 是「工头」,Service 是「前台」。工头管工人,前台接待客户。

1.4 架构组件详解

Kubernetes 集群分为两部分:控制平面(Control Plane)和工作节点(Worker Node)。

1.4.1 控制平面组件

  • kube-apiserver:所有操作的入口。你用的 kubectl,本质上就是在调它的 API。
  • etcd:集群的「数据库」。所有状态都存这里。我建议你定期备份 etcd,否则集群挂了很难恢复。
  • kube-scheduler:负责把 Pod 调度到合适的节点上。它会考虑资源、亲和性、污点等因素。
  • kube-controller-manager:运行各种控制器,比如 Deployment 控制器、Node 控制器等。

1.4.2 工作节点组件

  • kubelet:每个节点上的「代理」。它负责接收控制平面的指令,管理 Pod 的生命周期。
  • kube-proxy:负责实现 Service 的网络规则。说白了,就是做负载均衡和流量转发。
  • 容器运行时:比如 Docker、containerd。Kubernetes 本身不运行容器,它通过容器运行时来操作。

一个小技巧:排查问题时,先看 kubelet 日志。很多节点异常,kubelet 都会报出具体原因。我曾经靠这个定位过磁盘空间不足、CNI 插件配置错误等问题。

1.5 本章小结

这一章我们聊了 Kubernetes 的来龙去脉,也拆解了 Pod、Service、Deployment 这三个核心概念,最后看了架构组件。

你可能会觉得信息量有点大。没关系,Kubernetes 的学习曲线确实陡。我的建议是:先动手搭一个单节点集群,用 kubectl 创建几个 Pod 和 Deployment,感受一下「声明式」的魅力。

下一章,我们会深入 Pod 的细节,聊聊资源限制、健康检查、以及生命周期管理。到时候见。

课后思考:如果不用 Deployment,只用 Pod,你能实现应用的高可用吗?为什么?


公众号:蓝海资料掘金营,微信deep3321