3. Kubernetes入门:K8s架构、核心组件、Pod与Deployment

好,咱们进入Kubernetes的世界。说实话,K8s这玩意儿刚接触时确实有点懵。我当年第一次部署集群,光看架构图就看了三天。但别怕,咱们一步步拆解。

3.1 K8s整体架构:控制平面与工作节点

Kubernetes本质上是一个集群操作系统。它把一堆服务器虚拟成一个巨大的资源池。你只管告诉它“我要跑3个Nginx”,它自己会搞定调度、部署、健康检查。

整个集群分两大部分:

  • 控制平面(Master节点):集群的大脑,负责决策
  • 工作节点(Worker节点):真正跑容器的地方

我习惯把Master比作公司的CEO,Worker就是一线员工。CEO做决策,员工执行任务。CEO挂了,公司就瘫痪了——所以生产环境至少3个Master节点做高可用。

核心要点:控制平面不跑业务容器,只跑系统组件。Worker节点不参与集群管理,只干活。

3.2 核心组件详解

3.2.1 控制平面组件

组件 职责 我的经验
kube-apiserver 所有操作的入口,提供REST API 这是集群的“大门”,所有组件都通过它通信
etcd 分布式键值存储,保存集群状态 etcd挂了集群就废了,一定要做备份
kube-scheduler 决定Pod调度到哪个节点 默认调度策略够用,但复杂场景要写自定义调度器
kube-controller-manager 运行各种控制器,确保集群状态符合预期 Deployment、Node、Namespace等控制器都在这里

3.2.2 工作节点组件

  • kubelet:节点上的“管家”,负责管理Pod和容器
  • kube-proxy:维护网络规则,实现服务发现和负载均衡
  • 容器运行时:比如Docker、containerd,真正跑容器

我曾经遇到过一个诡异问题:Pod一直处于Pending状态。查了半天,发现是kubelet没启动。你想想看,节点上的管家都不在,谁来干活?

小技巧:排查节点状态时,先看kubelet日志。命令:journalctl -u kubelet -f

3.3 Pod:K8s的最小调度单元

Pod是K8s里最基础的概念。说白了,Pod就是一个或多个容器的“组合包”。这些容器共享网络栈、存储卷,运行在同一台机器上。

为什么要有Pod?直接跑容器不行吗?

嗯,这里要注意:有些场景下,两个容器需要紧密协作。比如一个容器写日志,另一个容器收集日志。它们需要共享网络和存储。Pod就是为这种场景设计的。

3.3.1 创建一个简单的Pod

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80

保存为 pod.yaml,然后执行:

kubectl apply -f pod.yaml
kubectl get pods
kubectl describe pod my-nginx

我个人习惯用 kubectl describe 查看Pod的详细信息。它能告诉你Pod的完整生命周期,包括调度到哪个节点、拉取镜像的过程、启动日志等。

避坑指南:我曾经直接在生产环境用Pod跑业务,结果节点挂了Pod就没了。记住:Pod是“临时工”,不是“正式员工”。正式业务应该用Deployment。

3.4 Deployment:声明式应用管理

Deployment是K8s里最常用的工作负载控制器。它帮你管理Pod的“生老病死”。你只需要声明“我要3个副本”,Deployment会保证始终有3个Pod在运行。

3.4.1 Deployment的核心能力

  • 滚动更新:逐步替换旧版本Pod,保证服务不中断
  • 回滚:新版本出问题,一键回到旧版本
  • 扩缩容:根据负载动态调整副本数
  • 自愈:Pod挂了自动重建

3.4.2 创建Deployment

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

应用这个YAML:

kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods -l app=nginx

你会看到3个Pod,名字后面跟着随机字符串。这就是Deployment自动创建的。

3.4.3 滚动更新实战

假设我要把Nginx从1.21升级到1.22:

kubectl set image deployment/nginx-deployment nginx=nginx:1.22
kubectl rollout status deployment/nginx-deployment

K8s会逐个替换Pod。先启动一个新Pod,等它Ready了,再干掉一个旧Pod。整个过程服务不中断。

我记得有一次升级后业务报错,赶紧回滚:

kubectl rollout undo deployment/nginx-deployment

10秒内就恢复了。这就是声明式管理的威力——你不需要手动操作每个Pod。

关键区别:Pod是“怎么做”,Deployment是“要什么”。K8s负责把“要什么”变成“怎么做”。

3.5 从Pod到Deployment的演进

为什么我们不直接用Pod?

你想想看,如果直接管理Pod:

  • Pod挂了,你得手动重建
  • 要升级版本,你得一个个删了重建
  • 流量大了,你得手动加Pod

用Deployment,这些全自动了。我刚开始学K8s时,也是先玩Pod,后来发现Deployment才是生产环境的主角。

我的建议:学习时先用Pod理解概念,生产环境一律用Deployment。除非你有特殊需求,比如跑一次性任务。

3.6 本章小结

这一章我们聊了:

  • K8s架构:控制平面+工作节点,各司其职
  • 核心组件:apiserver是入口,etcd存状态,kubelet管节点
  • Pod:最小调度单元,共享网络和存储
  • Deployment:声明式管理,自动扩缩容、滚动更新、自愈

下一章我们会深入Service和Ingress,看看Pod之间怎么通信,外部怎么访问集群。嗯,到时候再聊。