K8S 是什么?像搭积木一样管理服务器的神奇工具

K8S 全称是 Kubernetes,你可以把它想象成一个超级厉害的“积木管理员”。当我们有很多服务器(像很多小积木)时,K8S 能帮我们把这些积木搭成我们想要的形状(比如网站、应用),还能保证积木不会倒,哪里坏了马上换一块新的。

一、K8S 的“身体构造”:核心组成部分

K8S 由两大部分组成:大脑中枢工作小兵,就像指挥中心和工人的关系。

1. 大脑中枢(Master 节点)
  • API 服务器(API Server):K8S 的“电话接线员”,所有命令都通过它传达。比如你说“搭一个网站”,它就会记录下来并告诉其他人。
  • 调度器(Scheduler):K8S 的“分配员”,它会看哪个服务器(积木)空着,就把任务分配过去。
  • 控制器管理器(Controller Manager):K8S 的“监督员”,时刻检查积木搭得对不对,有没有积木坏掉,坏了就找新的替换。
  • etcd 数据库:K8S 的“笔记本”,把所有积木的位置、任务信息都记在里面,保证不会忘。
2. 工作小兵(Node 节点)
  • kubelet:每个小兵的“耳朵”,听大脑的命令,比如“在这个积木上运行一个程序”。
  • 容器运行时(Container Runtime):比如 Docker,负责把程序装进集装箱(容器)里。
  • kube-proxy:小兵的“快递员”,负责让不同集装箱之间能互相送快递(网络通信)。

二、K8S 如何工作?就像搭积木的完整流程

  1. 你告诉 K8S 要搭什么
    比如写一个“搭积木图纸”(YAML 文件),告诉它需要多少个积木(容器)、每个积木放什么程序。

  2. API 服务器接收命令
    就像你打电话给接线员,说“我要搭一个有 3 个积木的网站”,接线员(API Server)记录下来。

  3. 调度器找合适的位置
    调度器看看哪个桌子(服务器)有空地方,能放下这 3 个积木,然后告诉对应的小兵(Node)。

  4. 小兵开始搭积木
    kubelet 收到命令后,让 Docker 把程序装进集装箱(容器),放在指定的积木上。

  5. 监督员检查成果
    控制器管理器一直看着,如果某个积木歪了(容器挂了),马上让小兵换一个新积木,保证整体形状不变。

  6. 快递员负责送快递
    kube-proxy 让不同积木上的集装箱能互相通信,比如一个集装箱负责显示网页,另一个负责存数据,它们之间要传消息。

三、K8S 底层原理:积木管理员的隐藏技能

1. 为什么能自动替换坏积木?
  • 复制控制器(Replication Controller):就像有个清单,记录着“必须有 3 个红色积木”,如果少了,马上补一个。
2. 如何让积木之间互相找到?
  • 服务发现(Service Discovery):每个集装箱都有一个“门牌号”(IP 地址),kube-proxy 像快递员一样记住所有门牌号,负责送信。
3. 怎么管理积木上的空间?
  • 卷(Volume):相当于积木上的小抽屉,程序需要存东西时,就存在抽屉里,换积木时可以把抽屉一起搬过去。
4. 如何让很多人同时用积木?
  • 资源调度算法:比如“最小资源使用”算法,就像分糖果,哪个小朋友手里糖果少,就多给一点,保证公平。

四、K8S 的使用场景:什么时候需要这个积木管理员?

  1. 网站访问量突然变大
    比如双十一,平时用 10 个积木搭网站,突然需要 100 个,K8S 能马上找 90 个新积木搭上去,不会让网站卡壳。

  2. 程序更新不中断
    就像换积木上的贴纸,K8S 会先在新积木上贴好贴纸,再把旧积木换掉,用户感觉不到变化。

  3. 管理很多不同的程序
    比如一个公司有官网、后台系统、数据库,每个都需要不同的积木组合,K8S 能帮你把它们整理得井井有条。

五、用 PHP 代码模拟 K8S 的核心逻辑(简化版)

下面是一个超级简化的 PHP 代码,模拟 K8S 如何管理“积木”(容器):

<?php
// K8S 核心类:模拟大脑中枢
class Kubernetes {
    private $apiServer; // 模拟 API 服务器
    private $scheduler; // 模拟调度器
    private $controllerManager; // 模拟控制器管理器
    private $etcd; // 模拟数据库

    public function __construct() {
        // 初始化各个组件,就像给大脑装零件
        $this->apiServer = new APIServer($this);
        $this->scheduler = new Scheduler();
        $this->controllerManager = new ControllerManager($this);
        $this->etcd = new EtcdDatabase();
        
        // 启动监督员(控制器管理器)的检查任务
        $this->controllerManager->startWatching();
        echo "K8S 大脑启动啦!\n";
    }

    // 接收用户的“搭积木图纸”
    public function deployApp($deploymentYaml) {
        echo "收到搭积木图纸:" . $deploymentYaml["name"] . "\n";
        // 把图纸存在笔记本(etcd)里
        $this->etcd->saveDeployment($deploymentYaml);
        // 让调度器找地方搭积木
        $this->scheduler->scheduleDeployment($deploymentYaml);
    }
}

// 模拟 API 服务器:接收命令
class APIServer {
    private $k8s;

    public function __construct($k8s) {
        $this->k8s = $k8s;
        echo "API 服务器准备好接电话啦~\n";
    }

    // 处理用户发送的部署请求
    public function handleDeploymentRequest($request) {
        // 解析请求中的图纸
        $deploymentYaml = json_decode($request["yaml"], true);
        // 告诉 K8S 大脑开始搭积木
        $this->k8s->deployApp($deploymentYaml);
    }
}

// 模拟调度器:分配积木位置
class Scheduler {
    public function __construct() {
        echo "调度器准备好分配积木啦~\n";
    }

    // 根据图纸找合适的服务器(Node)
    public function scheduleDeployment($deploymentYaml) {
        $requiredNodes = $deploymentYaml["replicas"]; // 需要多少个积木
        $availableNodes = $this->findAvailableNodes($requiredNodes); // 找空着的桌子
        
        if ($availableNodes) {
            echo "找到 " . count($availableNodes) . " 个空桌子,开始放积木~\n";
            // 给每个空桌子发送放积木的命令
            foreach ($availableNodes as $node) {
                $node->runContainer($deploymentYaml["containerImage"]);
            }
        } else {
            echo "哎呀,桌子不够啦!需要加桌子~";
        }
    }

    // 模拟寻找空桌子的过程
    private function findAvailableNodes($count) {
        // 这里应该从数据库查实际节点状态,简化为返回假数据
        $nodes = [
            new Node("Node1", "空闲"),
            new Node("Node2", "空闲"),
            new Node("Node3", "忙碌"),
            new Node("Node4", "空闲")
        ];
        
        // 过滤出空闲的桌子
        $available = array_filter($nodes, function($node) {
            return $node->status === "空闲";
        });
        
        // 只返回需要的数量
        return array_slice($available, 0, $count);
    }
}

// 模拟控制器管理器:监督积木状态
class ControllerManager {
    private $k8s;
    private $watching = true;

    public function __construct($k8s) {
        $this->k8s = $k8s;
        echo "控制器管理器准备好盯梢啦~\n";
    }

    // 启动监督任务(简化为循环检查)
    public function startWatching() {
        // 实际中是后台线程,这里用循环模拟
        $this->checkNodesStatus();
    }

    // 检查所有桌子和积木的状态
    private function checkNodesStatus() {
        echo "正在检查积木有没有歪...\n";
        // 模拟发现某个积木坏了
        $brokenContainer = $this->findBrokenContainer();
        if ($brokenContainer) {
            echo "发现一个坏积木!位置在:" . $brokenContainer->nodeName . "\n";
            // 让对应的桌子删掉坏积木,放新的
            $node = $this->findNode($brokenContainer->nodeName);
            $node->replaceContainer($brokenContainer->containerId, $brokenContainer->image);
        }
        
        // 每隔一段时间再检查(实际中是定时器)
        echo "3秒后再检查一次...\n";
        // sleep(3); // 实际代码会用定时器,这里注释掉避免卡住
    }

    // 模拟寻找坏积木
    private function findBrokenContainer() {
        // 随机返回一个坏积木(模拟故障)
        if (rand(0, 10) > 7) { // 30%概率发现坏积木
            return (object) [
                "nodeName" => "Node1",
                "containerId" => "container-123",
                "image" => "website-image:v1"
            ];
        }
        return false;
    }

    // 模拟根据名字找桌子
    private function findNode($nodeName) {
        // 实际中从数据库查,这里返回假数据
        return new Node($nodeName, "空闲");
    }
}

// 模拟 etcd 数据库:记笔记
class EtcdDatabase {
    private $deployments = [];

    public function __construct() {
        echo "笔记本准备好记东西啦~\n";
    }

    // 保存积木图纸
    public function saveDeployment($deployment) {
        $this->deployments[$deployment["name"]] = $deployment;
        echo "把图纸记在笔记本里:" . $deployment["name"] . "\n";
    }

    // 读取图纸
    public function getDeployment($name) {
        return $this->deployments[$name] ?? null;
    }
}

// 模拟 Node 节点:工作小兵
class Node {
    public $name;
    public $status;
    private $containers = []; // 这个桌子上的积木(容器)

    public function __construct($name, $status) {
        $this->name = $name;
        $this->status = $status;
        echo "小兵" . $name . "报到!状态:" . $status . "\n";
    }

    // 在桌子上放一个积木(容器)
    public function runContainer($image) {
        $containerId = "container-" . rand(1000, 9999);
        $this->containers[$containerId] = [
            "image" => $image,
            "status" => "运行中",
            "startTime" => time()
        ];
        $this->status = "忙碌";
        echo "小兵" . $this->name . "在桌子上放了一个积木:" . $image . ",编号:" . $containerId . "\n";
    }

    // 替换坏积木
    public function replaceContainer($containerId, $image) {
        // 先删掉坏积木
        if (isset($this->containers[$containerId])) {
            unset($this->containers[$containerId]);
            echo "小兵" . $this->name . "拆掉坏积木:" . $containerId . "\n";
        }
        // 放一个新积木
        $this->runContainer($image);
    }
}

// 使用示例:模拟用户部署一个网站应用
$k8s = new Kubernetes();

// 定义“搭积木图纸”(YAML 格式,这里用数组模拟)
$deploymentYaml = [
    "name" => "my-website",
    "replicas" => 2, // 需要 2 个积木
    "containerImage" => "website-app:latest" // 积木上放的程序
];

// 用户通过 API 发送部署请求
$k8s->apiServer->handleDeploymentRequest([
    "yaml" => json_encode($deploymentYaml)
]);

代码注释解析(每一行为什么这样写)

  • Kubernetes 类:把 K8S 大脑的所有功能打包在一起,像一个工具箱,方便使用。
  • 构造函数:初始化各个组件(API 服务器、调度器等),就像组装工具箱里的工具。
  • deployApp 方法:接收用户的图纸,先记在笔记本(etcd)里,再让调度器找地方搭积木,这是整个流程的起点。
  • APIServer 类:专门负责接电话(接收请求),就像家里的电话只能用来打电话,功能单一更可靠。
  • Scheduler 类:只负责找空桌子,就像餐厅的领位员,只负责安排座位,不管做饭。
  • ControllerManager 类:循环检查积木状态,发现坏了就换,像妈妈时刻看着宝宝,防止摔倒。
  • etcd 类:用数组模拟笔记本,记住所有图纸和积木位置,防止忘记。
  • Node 类:模拟工作小兵,知道怎么放积木、换积木,每个小兵独立工作。

六、K8S 核心概念图解

1. 思维导图:K8S 的整体结构
Kubernetes
├── 大脑中枢(Master)
│   ├── API 服务器(接命令)
│   ├── 调度器(分任务)
│   ├── 控制器管理器(查故障)
│   └── etcd 数据库(记笔记)
└── 工作小兵(Node)
    ├── kubelet(听命令)
    ├── 容器运行时(如 Docker,装程序)
    └── kube-proxy(传消息)
2. 流程图:K8S 工作流程
你给 K8S 图纸 → API 服务器收命令 → 调度器找空桌子 → 
小兵在桌子上放积木 → 控制器管理器检查积木 → 
发现坏积木就换新的 → 积木之间通过 kube-proxy 传消息
3. 概念图:K8S 与积木的类比
K8S 大脑       → 积木管理员
服务器         → 桌子
容器           → 积木
程序           → 积木上的贴纸
YAML 图纸      → 搭积木的说明书
etcd 数据库    → 记录所有积木位置的笔记本

七、K8S 与 Docker Compose 的区别(简单对比)

  • Docker Compose:适合在一台电脑上搭小积木模型,比如自己做一个小网站,简单方便。
  • K8S:适合在很多台电脑上搭大型积木城堡,比如淘宝双十一,需要很多积木且不能倒,K8S 能管理得井井有条。

总结:K8S 就是高级积木管理员

K8S 的核心就是让很多服务器(桌子)上的容器(积木)能像搭积木一样灵活组合,并且自动维护这个积木结构。它的底层原理就是通过大脑中枢(Master)指挥工作小兵(Node),用笔记本(etcd)记笔记,调度器分任务,监督员查故障,让整个积木搭建过程又快又稳。

当你需要管理很多服务器和程序时,K8S 就能大显身手,帮你轻松应对访问量突然变大、程序更新、多程序管理等场景,就像一个不知疲倦的超级积木管理员。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐