Kubernetes(k8s) 快速回顾

Kubernetes 快速复习指南

适用于有一定基础但太久没用的开发者,快速唤醒记忆,以面试/实战为导向。


一、概述

Kubernetes(简称 K8s)是容器编排平台,用于自动化管理容器应用。
它负责容器的部署、调度、扩缩容、自愈、运维,屏蔽底层服务器差异,实现应用弹性运行、高可用与统一管控,是当下云原生应用的主流运行底座。

1.1 架构

Master 与 Worker
角色说明
Master(控制平面)集群的大脑,负责调度、状态维护、API 响应。
Worker(工作节点)真正跑容器的地方,运行应用 Pod。

前置环境

在 Master 和 Worker 安装 k8s 前,需预先安装:

  • 容器运行时(CRI,Container Runtime Interface):如 containerd(推荐)、CRI-O、Docker Engine(v1.24+ 已不再直接支持 Docker,通过 cri-dockerd 桥接)。负责启动 Pod 中的应用。
  • 网络插件(CNI,Container Network Interface):如 Calico、Flannel、Cilium、Weave,负责 Pod 之间的网络连通和网络策略。
  • kubelet 和 kubeadm 和 kubectl:核心命令行工具。


k8s 架构图

请添加图片描述


Master 各组件详解
组件作用
etcd分布式键值存储。保存所有集群数据(Pod、Service、ConfigMap 等资源的状态)。
kube-api-server所有组件(包括 kubectl)都通过它通信。提供 RESTful API,负责认证、鉴权、准入控制、验证请求并写入 etcd。
kube-scheduler负责将新创建的 Pod 分配到合适的 Worker 节点。基于资源需求、亲和性、污点容忍等策略决策。
kube-controller-manager运行各种资源控制器,确保资源实际状态逼近期望状态。
cloud-controller-manager可选组件。与云厂商(AWS/GCP/Azure)的 API 集成,管理云资源。


Worker 各组件详解
组件作用
kubelet运行在每个 Worker 上。监听 API Server 的 Pod 分配,确保 Pods 和容器健康运行。向 API Server 汇报节点和 Pod 状态。与 CRI 交互创建/删除容器。
kube-proxy维护节点上的网络规则(iptables/IPVS)。实现 Service 的负载均衡和 Pod 间通信。
Pod最小部署单元,包含一个或多个容器。同一个 Pod 中的容器共享 IP、端口、Volume,通过 localhost 通信。


Cloud Provider API

K8s 可以通过 cloud-controller-manager 组件,调用各大云厂商的 Cloud Provider API(如 AWS EC2、Azure、GCP、阿里云、腾讯云),实现对云资源的自动化管理,包括:节点生命周期、负载均衡、网络路由、云存储卷等。



1.2 命令行工具

工具作用
kubeadm集群初始化和管理工具。kubeadm init 初始化 Master,kubeadm join 让 Worker 加入集群。
kubectlK8s 命令行客户端,通过调用 kube-api-server 管理集群中各类资源。


1.3 资源 Resource

Resource(资源) 是 Kubernetes 中所有可被管理的对象,K8s 遵循万物皆资源的设计思想。我们可以通过 命令行YAML/JSON 配置文件 声明资源的期望状态,集群会自动完成状态调和,让实际状态与期望状态保持一致。

资源的分类

命名空间资源(Namespaced Resource):归属于某个 Namespace,用于隔离资源。 常见的命名空间资源:Pod、Deployment、StatefulSet、DaemonSet、ReplicaSet、Job / CronJob、Service、ConfigMap、Secret、PersistentVolumeClaim (PVC)、Ingress

集群资源(Cluster-scoped Resource):不属于任何 Namespace,全局唯一。常见的集群资源:Node、Namespace、PersistentVolume (PV)、StorageClass

资源的声明方式

命令行:直接使用 kubectl 命令创建/删除资源,适合调试和临时操作。

kubectl run nginx --image=nginx
kubectl expose pod nginx --port=80

资源文件:预先编写 YAML/JSON 文件,通过 kubectl apply -f 执行。

编写资源文件 myPod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
spec:
  containers:
    - name: nginx
      image: nginx:1.25
      ports:
        - containerPort: 80

执行资源文件:

kubectl apply -f myPod.yaml

二、资源详解

2.1 工作负载类资源(Workload Resources)

Pod

Pod 是 Kubernetes 中最小的部署与调度单元。一个 Pod 可包含单个或多个容器,同一 Pod 内的容器共享网络命名空间(共用同一个 IP 与端口空间)和存储卷。Pod 属于命名空间级资源。

Pod 是 临时性 的,且本身不具备自愈能力。实际生产环境中,一般不会直接创建 Pod,而是借助 Deployment、StatefulSet 等上层控制器进行统一管理。



ReplicaSet

ReplicaSet 用于保证集群中始终运行指定数量的 Pod 副本。当 Pod 被删除、异常崩溃时,ReplicaSet 会自动创建新 Pod 完成替换,维持副本数稳定。ReplicaSet 属于命名空间级资源。

实际生产环境中,一般不会直接创建ReplicaSet,而是借助 Deployment 间接管理,极少单独使用。



Deployment

Deployment 是主流无状态应用控制器,通过管理 ReplicaSet 间接控制 Pod,具备滚动更新、版本回滚、副本扩缩容能力,属于命名空间级资源,是生产环境使用频率最高的工作负载资源。

无状态应用:应用自身不持久化本地数据,如:静态资源服务、API 网关,业务服务等。

滚动更新:升级应用时采用分批替换策略,新旧 Pod 短暂共存,逐步完成全量更新,实现服务零停机发布。



StatefulSet

StatefulSet 专门用于管理有状态应用,典型场景包括 MySQL、ZooKeeper、Kafka、Redis 集群等。属于命名空间级资源。

相较于 Deployment,它具备两大核心能力:

  • 稳定网络标识:Pod 拥有有序、固定的主机名与域名,集群节点间可稳定互相访问;
  • 独立持久化存储:每个 Pod 绑定专属存储卷,Pod 删除重建后依旧挂载原有数据卷,数据不会丢失。

有状态应用:Pod 具备唯一性,运行状态、本地数据、集群角色均与 Pod 强绑定,Pod 之间无法等价替换。这类应用对启动顺序、网络地址、数据持久性都有严格要求。



DaemonSet

DaemonSet 保证集群中每个节点或指定节点上仅运行一个 Pod 副本。当新节点加入集群时,会自动创建对应 Pod;节点下线移除时,也会自动清理关联 Pod,属于命名空间级资源。

经典场景:日志采集、节点监控、网络插件(Calico、Cilium 的 Agent)



Job / CronJob

Job:用于运行一次性任务,属于命名空间级资源。任务异常时会有限次数重试。常用于批处理、数据迁移、一次性脚本执行等场景。

CronJob: 基于标准 cron 表达式,定时创建并执行 Job,属于命名空间级资源。继承 Job 的重试规则,支持自定义执行周期。常用于定时数据备份、日志清理、定期报表生成、周期性运维任务。



2.2 服务发现与负载均衡类资源(Networking Resources)

Service

为一组 Pod 提供固定访问入口,实现服务发现与负载均衡,屏蔽 Pod IP 动态变化的问题,属于命名空间级资源。可根据业务选择不同类型,适配集群内部通信、外部访问等场景。

Service 类型:

  • ClusterIP(默认):仅集群内部可访问,用于服务间互相调用,是最常用类型。
  • NodePort:开放节点端口,外部可通过「节点 IP + 端口」访问服务。
  • LoadBalancer:依托云厂商负载均衡器,依赖cloud-controller-manager。
  • ExternalName:将集群内服务映射到集群外部的第三方服务地址。


Ingress

Ingress 提供集群外部 HTTP/HTTPS 访问入口,实现基于域名、路径的路由转发与负载均衡,统一管理外部访问规则。必须依赖 Ingress Controller 才能生效,属于命名空间级资源。

通常和 Service 搭配使用,Service 提供集群内部固定访问入口,属于四层流量转发;Ingress 提供统一的外部 HTTP/HTTPS 入口,基于域名和路径路由到后端 Service,实现多服务共用一个访问入口,是生产环境外部访问的标准方式。



2.3 存储类资源(Storage Resources)

PersistentVolume (PV)

PV 由管理员预先配置,代表一块真实的存储空间(如云盘、NFS、Ceph)。用于持久化保存数据,Pod 删除后数据依然存在,独立于 Pod 生命周期之外。属于集群资源,非命名空间资源。

访问模式

  • ReadWriteOnce(RWO):只能被一个节点挂载读写。
  • ReadOnlyMany(ROX):可以被多个节点同时读,但不能写。适合静态资源、配置文件共享。
  • ReadWriteMany(RWX):可以被多个节点同时挂载读写。


PersistentVolumeClaim (PVC)

PVC 是 用户/业务 向集群申请存储的凭证。只需声明需要的存储大小、访问模式,系统会自动匹配符合条件的 PV 并绑定,Pod 通过挂载 PVC 使用持久化存储。属于命名空间资源。

PV 和 PVC 的关系

管理员预先设置 → PV(物理存储设备)
用户/业务申请使用  → PVC(存储申请) → 匹配 PV → Pod 使用 PVC


StorageClass

StorageClass 集群级资源,用于实现动态供给 PV。无需管理员提前创建 PV,PVC 发起存储申请时,会通过它自动创建并绑定 PV,简化存储运维,是生产环境主流方案。属于集群资源,非命名空间资源。

可对接不同存储后端(云盘、Ceph、NFS 等),也能划分存储类型(高速盘、普通盘)。



2.4 配置与安全类资源(Config & Security Resources)

ConfigMap

ConfigMap 用于存储非敏感的配置信息(如配置文件、环境变量、启动参数),然后将配置数据注入到 Pod 中,让配置和容器分离,方便修改、统一管理。属于命名空间级资源。



Secret

Secret 专门存储敏感数据,如密码、密钥、令牌、证书等。数据以 Base64 编码存储(非加密,仅简单防明文展示),属于命名空间级资源。相比 ConfigMap 安全性更高,用于保护隐私信息。



三、调度

3.1 什么是调度

调度是将 Pod 分配给合适的 Worker 节点的过程,由 kube-scheduler 完成。调度策略在资源文件中配置即可。

调度流程

  1. Pod 创建(未调度状态,nodeName 为空)。
  2. kube-scheduler 通过 过滤(Predicates / Filtering) 选出符合条件的节点。
  3. 再通过 打分(Priorities / Scoring) 选出最优节点。
  4. 将 Pod 绑定到该节点(写入 spec.nodeName)。
  5. 该节点的 kubelet 收到通知,通过 CRI 创建容器。

3.2 调度策略

nodeSelector

最简单的节点选择器,通过节点标签精准匹配,Pod 只调度到带指定标签的节点。

nodeAffinity

节点亲和性选择器。支持丰富运算符(In、NotIn、Exists、DoesNotExist、Gt、Lt),分硬性规则(必须满足)和软性偏好(尽量满足)。生产环境中常用。

podAffinity

Pod 亲和性选择器。让当前 Pod 和指定 Pod 调度到同一区域 / 节点。用于关联应用部署在一起,提升访问效率。

podAntiAffinity

Pod 反亲和性选择器。让当前 Pod 不和指定 Pod 部署在同一区域 / 节点。用于打散副本、避免单点故障,实现高可用。

Taints & Tolerations

Taints(污点):给节点设置的排斥规则,没有对应容忍的 Pod 绝对不能调度到该节点。
Tolerations(容忍):在 Pod 上设置可以容忍的污点,当节点的污点和容忍的污点相同时,可以在该节点上创建。


四、Pod 生命周期与探针

4.1 生命周期

Pod 状态流转

Pending → Running → Succeeded / Failed
              ↓
          Unknown
状态说明
PendingPod 已提交,但尚未被调度,或正在拉取镜像。
RunningPod 已调度到节点上,容器至少有一个在运行。
SucceededPod 中的所有容器正常退出(退出码 0)。
FailedPod 中至少一个容器以非 0 退出码退出。
UnknownAPI Server 无法获取 Pod 状态(通常是节点故障或网络问题)。

容器重启策略(restartPolicy)

  • Always:始终重启(默认)。
  • OnFailure:仅失败时重启。
  • Never:从不重启。

4.2 探针(Probes)

探针 是 kubelet 定期对容器执行的健康检查。

三种探测方式

方式说明
HTTP GET向容器的指定路径发送 HTTP GET 请求,2xx/3xx 表示健康。
TCP Socket尝试连接容器的指定 TCP 端口,连接成功表示健康。
Exec Command在容器内执行命令,退出码 0 表示健康。

livenessProbe(存活探针)

判断容器是否还活着。如果探测失败,kubelet 会根据重启策略判断是否重启容器。

readinessProbe(就绪探针)

判断容器是否准备好接收流量。如果探测失败,Service 会将该 Pod 从 Endpoint 列表移除。

startupProbe(启动探针)

判断容器是否已完成启动。用于启动缓慢的容器(如 Java 应用)。探测成功前,livenessProbe 和 readinessProbe 不会启动。

三种探针的适用场景对比

探针失败后果典型用途
livenessProbe重启容器检测死锁、内存泄漏导致的僵死
readinessProbe从 Service 移除控制流量接入(应用启动慢、需要加载数据)
startupProbe重启容器启动极慢的应用(Java JVM、Legacy App)


五、组件协作流程(以 Deployment 为例)

1. 用户执行 kubectl apply -f deployment.yaml
                        │
                        ▼
2. kube-api-server ──► etcd(保存 Deployment 对象)
   ◄── 返回成功
                        │
                        ▼
3. kube-controller-manager 中的 Deployment Controller
   检测到新的 Deployment 资源
   └── 创建对应的 ReplicaSet 对象(写入 api-server → etcd)
                        │
                        ▼
4. ReplicaSet Controller(也是 kube-controller-manager 中的一部分)
   检测到新 ReplicaSet,发现期望副本数为 3
   └── 创建 3 个 Pod 对象(写入 api-server → etcd)
                        │
                        ▼
5. Pod 状态为 Pending(未调度,spec.nodeName 为空)
                        │
                        ▼
6. kube-scheduler
   └── 通过 Filtering + Scoring 选出最优 Worker 节点
   └── 通过 api-server 将 nodeName 写入 Pod spec
                        │
                        ▼
7. 选中节点的 kubelet(通过 API Server Watch 机制检测到 Pod 分配)
                        │
                        ▼
8. kubelet 调用 CRI(containerd)
   └── 拉取镜像 ──► 创建容器 ──► 启动容器
                        │
                        ▼
9. kubelet 调用 CNI(Calico/Cilium 等)
   └── 为 Pod 分配 IP ──► 配置网络
                        │
                        ▼
10. kubelet 配置 Pod 中声明的 Volume
                         │
                         ▼
11. kubelet 启动探针检查(如果声明了 probe)
    └── readinessProbe 成功后,Pod 变为 Ready
                         │
                         ▼
12. kube-proxy 检测到新 Pod 就绪
    └── 更新节点上的 iptables/IPVS 规则
    └── Service 将流量路由到此 Pod

完整链路总结

kubectl → API Server → etcd
  → Controller Manager (Deployment → ReplicaSet → Pod)
  → Scheduler (绑定 Node)
  → kubelet (调用 CRI + CNI 创建 Pod)
  → kube-proxy (更新网络规则)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值