1. 概述

在本文中,我们将对 Kubernetes 进行一次简要的理论性介绍。主要内容包括:

  • 为何需要容器编排工具
  • Kubernetes 的核心特性
  • Kubernetes 架构组成
  • Kubernetes API 的基本概念

如需深入了解,建议查阅 Kubernetes 官方文档

2. 容器编排的必要性

在之前的一篇 Docker 教程 中,我们已经了解了 Docker 的基础概念,以及如何打包和部署应用。

一句话总结:Docker 是一个容器运行时工具,它提供了一种标准化的方式,用于打包、传输和运行单个应用实例,也就是我们常说的容器。

但随着系统复杂度的提升,一些新的需求也随之出现:比如自动化部署、容器编排、任务调度、高可用保障、多实例集群管理等。

市场上有不少容器编排工具,但 Kubernetes 正在逐步成为主流,被广泛采用。

3. Kubernetes 的核心特性

Kubernetes 是一个用于在一组节点上编排容器化应用的系统,它同时管理网络和存储基础设施。其主要特性包括:

  • 资源调度:将 Pod 合理分配到各个节点上运行
  • 自动扩缩容:根据负载动态增加节点并部署新 Pod
  • 自愈机制:监控容器状态,按策略重启失败容器
  • 服务发现:通过 DNS 注册并发布 Pod 和 Service
  • 滚动更新与回滚:支持按顺序更新 Pod,失败时可回退
  • 密钥与配置管理:安全地处理密码、API Key 等敏感信息
  • 存储编排:支持多种第三方存储系统,可作为持久化卷使用

4. Kubernetes 架构概览

Kubernetes 架构主要由以下核心组件构成:

  • Master(控制平面):维护集群的期望状态。我们通过 kubectl 等工具与 Master 交互。
  • Node(节点):运行应用的机器(可以是虚拟机或物理服务器),由 Master 控制。
  • Container Runtime(容器运行时):Node 上必须安装的容器运行环境,最常用的是 Docker。
  • Minikube:用于本地开发测试的单节点 Kubernetes 集群工具。
  • Kubernetes API:提供了对 Kubernetes 各种资源对象的抽象,通过 API 操作集群。
  • kubectl:命令行工具,用于创建、更新、删除和查看 Kubernetes 资源对象。

5. Kubernetes API 对象模型

API 对象是 Kubernetes 的“意图记录”,一旦创建对象,Kubernetes 就会持续确保该对象的状态与定义一致。

每个对象都包含两个部分:

  • spec:描述期望状态(我们定义的)
  • status:描述当前实际状态(由集群维护并更新)

接下来我们介绍几种常见的 Kubernetes 对象。

5.1 基础对象

  • Pod:最小调度单元,通常包含一个或多个紧密协作的容器、共享存储和网络。
  • Service:逻辑上将一组 Pod 分组,并定义访问方式,对外提供统一入口。
  • Volume:为容器提供持久化或共享存储。支持多种类型,例如 hostPath、NFS、云存储等。
  • Namespace:实现多租户,允许在同一个物理集群中划分多个虚拟集群。

5.2 控制器对象(Controller)

控制器基于基础对象构建,提供更高级的功能:

  • Deployment:用于声明式更新 Pod 和 ReplicaSet。我们定义期望状态,Deployment 控制器负责实现。
  • ReplicaSet:确保指定数量的 Pod 副本始终在运行。
  • StatefulSet:适用于有状态应用,Pod 有唯一、稳定的网络标识和存储。
  • DaemonSet:确保集群中每个节点(或部分节点)上运行一个特定 Pod,常用于日志收集、监控等场景。
  • GarbageCollection:清理无主对象,释放资源。
  • Job:用于运行一次性任务,确保指定数量的 Pod 成功完成。

5.3 对象元数据(Metadata)

元数据用于描述对象的附加信息,主要包括:

  • Namespace:默认为 default,用于隔离资源。
  • Name:在同一 Namespace 中唯一。
  • Uid:全局唯一标识符,用于区分不同生命周期的对象。

可选元数据包括:

  • Labels:键值对,用于分类资源,支持灵活筛选。
  • Label Selector:通过 Label 筛选符合条件的资源。
  • Annotations:键值对,用于存储构建、版本等信息,不用于选择资源。

5.4 示例说明

Kubernetes API 对象可以通过 JSON 或 YAML 定义,但推荐使用 YAML 进行手动配置。

下面是一个名为 demo-backend 的 Deployment 的 YAML 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-backend
spec:
  selector:
    matchLabels:
      app: demo-backend
      tier: backend
  replicas: 3
  template:
    metadata:
      labels:
        app: demo-backend
        tier: backend
    spec:
      containers:
        - name: demo-backend
          image: demo-backend:latest
          ports:
            - containerPort: 8080

这个 Deployment 定义了以下内容:

  • 使用 Deployment 控制器管理 Pod
  • 副本数为 3(replicas: 3
  • 每个 Pod 包含一个容器,镜像为 demo-backend:latest,监听 8080 端口
  • 给 Pod 添加了两个标签:app=demo-backendtier=backend
  • 通过 matchLabels 将 Deployment 与对应的 Pod 绑定

当我们通过 kubectl get deployment 查看状态时,返回的内容可能如下:

Name:                   demo-backend
Namespace:              default
CreationTimestamp:      Thu, 22 Mar 2018 18:58:32 +0100
Labels:                 app=demo-backend
Annotations:            deployment.kubernetes.io/revision=1
Selector:               app=demo-backend
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=demo-backend
  Containers:
   demo-backend:
    Image:        demo-backend:latest
    Port:         8080/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   demo-backend-54d955ccf (3/3 replicas created)
Events:          <none>

可以看到,Deployment 已经成功部署,3 个 Pod 副本都处于可用状态。未在 YAML 中显式定义的字段,通常为默认值。

6. 如何开始使用 Kubernetes

Kubernetes 支持多种部署方式,从本地开发环境到云平台,甚至是裸金属服务器集群。

**推荐初学者使用 Minikube**,它可以在本地快速搭建一个单节点 Kubernetes 集群,非常适合学习和测试。

更多部署方式详见 Kubernetes 官方安装指南

7. 总结

本文我们简要介绍了 Kubernetes 的基础知识,包括:

  • 容器编排工具的必要性
  • Kubernetes 的主要功能特性
  • 核心组件和架构设计
  • API 对象模型与操作方式

如果你计划在生产环境使用 Kubernetes,建议深入学习其调度策略、网络模型、安全机制等内容。后续我们也会陆续推出更深入的实践教程。


原始标题:Introduction to Kubernetes