3.k8s是如何工作的

Kubernetes 是一个复杂的分布式系统,其核心设计理念是 声明式管理 和 自动化控制。以下是 Kubernetes 的工作机制详解,从用户提交应用到容器运行的全流程:


1. 核心架构:控制平面(Control Plane)与工作节点(Worker Nodes)

Kubernetes 集群由两类角色组成:

• 控制平面 :负责全局决策和协调(如调度、扩缩容)。

• 工作节点:运行用户应用的实际容器。


2. 控制平面(Control Plane)的组件

(1) API Server(kube-apiserver)

• 作用 :集群的"前门",所有操作(包括 kubectl 命令)通过 REST API 与其交互。

• 关键行为 :

• 验证请求的合法性(认证、鉴权)。

• 将资源状态写入 etcd 数据库。

• 通知其他组件(如调度器、控制器)处理请求。

(2) etcd

• 作用 :分布式键值数据库,存储集群所有资源的状态(如 Pod、Service 配置)。

• 重要性:是集群的"唯一真实数据源"(Single Source of Truth)。

(3) 调度器(kube-scheduler)

• 作用 :为新创建的 Pod 选择合适的工作节点。

• 调度逻辑:

  1. 过滤不满足条件的节点(如资源不足、标签不匹配)。
  2. 对剩余节点打分(如资源利用率、亲和性策略)。
  3. 选择得分最高的节点绑定 Pod。
(4) 控制器管理器(kube-controller-manager)

• 作用 :运行一系列 控制器(Controllers) ,持续监控资源状态,确保其与期望状态一致。

• 常见控制器 :

• Deployment Controller :确保 Pod 副本数与 replicas 定义一致。

• Node Controller :监控节点状态,处理节点故障。

• Service Controller:管理负载均衡器和 DNS 记录。

(5) Cloud Controller Manager(可选)

• 作用:与云厂商(如 AWS、Azure)交互,管理云资源(如负载均衡器、磁盘卷)。


3. 工作节点(Worker Node)的组件

(1) kubelet

• 作用 :节点上的"代理",负责管理本节点的 Pod 和容器。

• 关键行为 :

• 从 API Server 接收 Pod 定义。

• 调用容器运行时(如 Docker、containerd)启动/停止容器。

• 定期向 API Server 报告 Pod 状态。

(2) kube-proxy

• 作用 :维护节点网络规则,实现 Service 的负载均衡和流量转发。

• 实现方式:基于 iptables 或 IPVS。

(3) 容器运行时(Container Runtime)

• 常见实现 :Docker、containerd、CRI-O。

• 作用:真正运行容器的底层引擎,负责镜像下载、容器启停等。


4. Kubernetes 的工作流程(以部署一个 Pod 为例)

步骤 1:用户提交资源定义

用户通过 kubectl apply -f pod.yaml 提交一个 Pod 的 YAML 定义:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.23
步骤 2:API Server 处理请求

• API Server 验证请求合法性,将 Pod 定义写入 etcd。

• 返回响应给用户(如 "pod/nginx created")。

步骤 3:调度器分配节点

• 调度器发现 etcd 中有一个未调度的 Pod(spec.nodeName 为空)。

• 根据资源需求、亲和性规则等选择合适节点。

• 更新 Pod 的 spec.nodeName 字段并写入 etcd。

步骤 4:kubelet 创建容器

• 目标节点上的 kubelet 通过 Watch 机制发现分配给自己的 Pod。

• 调用容器运行时下载镜像并启动容器。

• 更新 Pod 状态为 Running 并写入 etcd。

步骤 5:持续状态同步

• 控制器(如 Deployment Controller)持续检查 Pod 状态。

• 如果 Pod 崩溃,控制器会重新创建新的 Pod。


5. 核心工作原理:控制循环(Control Loop)

Kubernetes 的核心逻辑基于 "观察-比较-执行"(Observe-Diff-Act) 循环:

  1. Observe:从 etcd 读取当前资源状态。
  2. Diff:比较当前状态与用户声明的期望状态。
  3. Act:执行操作使当前状态逼近期望状态(如扩缩副本、重启容器)。

6. 网络与存储的实现机制

(1) 网络模型

• Pod 网络 :每个 Pod 拥有唯一 IP,跨节点可直接通信(需 CNI 插件如 Calico、Flannel)。

• Service 网络:通过虚拟 IP(ClusterIP)和 iptables/IPVS 规则实现负载均衡。

(2) 存储管理

• PV/PVC :管理员创建持久卷(PV),用户通过 PVC 申请存储。

• 动态卷供应:StorageClass 允许按需自动创建云存储卷(如 AWS EBS)。


7. 自我修复(Self-Healing)场景示例

  1. 节点宕机 :

    • Node Controller 检测到节点状态为 NotReady。

    • 标记该节点上所有 Pod 为 Terminating。

    • 调度器在其他节点重新创建这些 Pod。

  2. 容器崩溃 :

    • kubelet 检测到容器退出,自动重启容器。

    • 若重启次数超过阈值,标记 Pod 为 Failed,由控制器重新创建 Pod。


8. 扩展机制:CRD 与 Operator

• Custom Resource Definition (CRD) :允许用户定义新的资源类型(如 MySQLCluster)。

• Operator:通过自定义控制器管理 CRD,实现复杂应用的自动化运维(如数据库备份、升级)。


总结

• 核心思想 :通过声明式 API 描述应用状态,由控制平面持续驱动集群达到期望状态。

• 组件协同 :

• API Server 作为中枢,连接所有组件。

• etcd 存储全局状态。

• 控制器和调度器实现自动化决策。

• 关键能力:调度、自愈、服务发现、滚动更新、扩缩容。

相关推荐
逐流人15 分钟前
Ceph分布式存储集群配置与池管理:从配置优先级到PG、复本池与纠删码池
运维·分布式·ceph·云原生·云计算·rados
AutumnWind04203 小时前
【Docker Compose 快速入门】
运维·docker·容器
分布式存储与RustFS4 小时前
图床搬到自己的对象存储:PicGo 加 S3 插件的完整配置
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
如果'\'真能转义说5 小时前
Docker Desktop | 本地化挂载 Postgresql
docker·postgresql·容器
谢亮_vipxieliang6 小时前
从 Docker 到 Kubernetes:概念对照与迁移
docker·容器·kubernetes
分布式存储与RustFS7 小时前
在 Kubernetes 里跑对象存储的三个方案:Helm、Operator、以及什么时候别用 K8s
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
怪力左手7 小时前
docker+qemu创建镜像
运维·docker·容器
筑梦之路8 小时前
K8S yaml文件部署kafka集群(Kraft模式)——筑梦之路
容器·kafka·kubernetes
极小狐8 小时前
CI 作业里 kubectl 连不上集群?用 Kubernetes Agent 打通部署链路的 7 个步骤
ci/cd·kubernetes·gitlab·devops·k8s部署