Skip to main content

什么是 Kubernetes?

Kubernetes(常简称为 K8s,因为 K 和 s 之间有 8 个字母)是一个开源的容器编排平台,最初由 Google 设计并捐赠给云原生计算基金会(CNCF)来维护。 Kubernetes 的核心目标是让部署容器化应用变得简单高效。它提供了容器的自动化部署、扩展、负载均衡、自愈等能力,让开发者可以专注于业务代码,而不用担心底层基础设施。

为什么需要 Kubernetes?

在容器化时代之前,应用部署面临诸多挑战:
问题传统方式Kubernetes 方式
服务扩缩容手动添加/移除服务器自动水平扩缩容
服务发现硬编码 IP 地址内置服务发现机制
负载均衡单独配置负载均衡器内置负载均衡
滚动更新停机更新或复杂脚本零停机滚动更新
故障恢复人工介入处理自动检测和恢复
配置管理分散在各处集中式配置管理

Kubernetes 的核心特性

1. 自动化部署与回滚

Kubernetes 可以按照预期状态自动部署应用,如果发现问题可以自动回滚到之前的版本。

2. 服务发现与负载均衡

Kubernetes 可以使用 DNS 名称或 IP 地址暴露容器。如果到容器的流量很大,Kubernetes 能够自动进行负载均衡。

3. 自动装箱

根据资源需求和其他约束自动放置容器,同时不牺牲可用性。

4. 自我修复

当容器失败时,Kubernetes 会自动重启容器;当节点故障时,会自动替换和重新调度容器;当容器未通过健康检查时,会自动终止并重建。

5. 密钥与配置管理

Kubernetes 允许存储和管理敏感信息,如密码、OAuth 令牌和 SSH 密钥。可以在不重建容器镜像的情况下更新配置。

6. 存储编排

Kubernetes 允许自动挂载所选存储系统,包括本地存储、公有云提供商和网络存储系统。

Kubernetes 架构

Kubernetes 集群由控制平面(Control Plane)和工作节点(Worker Node)组成。
┌─────────────────────────────────────────────────────────────────────┐
│                              Kubernetes                             │
│  ┌─────────────────────────────────────────────────────────────────┐│
│  │                     Control Plane (Master)                      ││
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐   ││
│  │  │  API Server  │  │  Scheduler   │  │ Controller Manager   │   ││
│  │  └──────────────┘  └──────────────┘  └──────────────────────┘   ││
│  │  ┌──────────────────────────────────────────────────────────┐   ││
│  │  │                         etcd                             │   ││
│  │  └──────────────────────────────────────────────────────────┘   ││
│  └─────────────────────────────────────────────────────────────────┘│
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────────┐│
│  │                      Worker Node 1                              ││
│  │  ┌─────────┐  ┌─────────────┐  ┌─────────────────────────────┐  ││
│  │  │ kubelet │  │ kube-proxy  │  │        Container Runtime    │  ││
│  │  └─────────┘  └─────────────┘  └─────────────────────────────┘  ││
│  │  ┌─────────────────────────────────────────────────────────────┐││
│  │  │  Pod      Pod      Pod      Pod      Pod      Pod           │││
│  │  └─────────────────────────────────────────────────────────────┘││
│  └─────────────────────────────────────────────────────────────────┘│
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────────┐│
│  │                      Worker Node 2                              ││
│  │  ┌─────────┐  ┌─────────────┐  ┌─────────────────────────────┐  ││
│  │  │ kubelet │  │ kube-proxy  │  │        Container Runtime    │  ││
│  │  └─────────┘  └─────────────┘  └─────────────────────────────┘  ││
│  │  ┌─────────────────────────────────────────────────────────────┐││
│  │  │  Pod      Pod      Pod      Pod      Pod      Pod           │││
│  │  └─────────────────────────────────────────────────────────────┘││
│  └─────────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────────┘

Control Plane 组件

1. kube-apiserver

API Server 是 Kubernetes 控制平面的前端,负责处理所有 REST 请求。它是唯一直接与 etcd 交互的组件。
# 所有 kubectl 命令都是通过 API Server 执行的
kubectl get pods

2. etcd

etcd 是一个高可用的分布式键值存储,用于存储 Kubernetes 集群的所有配置数据和状态信息。 特点:
  • 分布式存储,支持高可用
  • 使用 Raft 协议保证一致性
  • 存储集群的所有元数据

3. kube-scheduler

调度器负责监控新创建的、未指定运行节点的 Pod,并为它们选择一个合适的节点运行。 调度因素:
  • 资源需求(CPU、内存)
  • 亲和性/反亲和性规则
  • 数据本地化
  • 节点污点和容忍

4. kube-controller-manager

控制器管理器运行各种控制器进程,包括:
  • Node Controller:负责节点故障检测和响应
  • Replication Controller:维护 Pod 副本数量
  • Endpoints Controller:填充 Endpoints 对象
  • Service Account & Token Controllers:为新命名空间创建默认账户和令牌

Worker Node 组件

1. kubelet

kubelet 是在每个节点上运行的主要代理,负责确保容器在 Pod 中运行。 主要职责:
  • 接收 PodSpec 并确保容器运行
  • 定期汇报节点和 Pod 状态
  • 执行容器健康检查

2. kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理,负责实现 Kubernetes Service 概念的一部分。 功能:
  • 维护节点上的网络规则
  • 实现 Service 的负载均衡
  • 支持 TCP/UDP/SCTP 协议转发

3. Container Runtime

容器运行时是负责运行容器的软件。Kubernetes 支持多种容器运行时:
  • containerd:目前最流行的选择
  • CRI-O:专为 Kubernetes 设计的轻量级运行时
  • Docker Engine(通过 cri-dockerd)

Kubernetes 核心对象

Pod

Pod 是 Kubernetes 中最小的可部署单元,可以包含一个或多个容器。
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80

ReplicaSet

ReplicaSet 确保指定数量的 Pod 副本始终运行。

Deployment

Deployment 提供了 Pod 和 ReplicaSet 的声明式更新能力。

Service

Service 将运行在一组 Pod 上的应用程序公开为网络服务。

Namespace

Namespace 提供了一种将集群资源划分为多个虚拟集群的方法。

Kubernetes vs Docker Swarm

特性KubernetesDocker Swarm
学习曲线陡峭平缓
安装复杂度复杂简单
扩展性非常强较强
负载均衡需要配置内置
社区支持非常活跃活跃
适用场景大规模生产环境中小规模环境

总结

Kubernetes 是当今最流行的容器编排平台,它提供了:
  1. 强大的编排能力:自动化部署、扩展和管理容器化应用
  2. 高可用性:自我修复、滚动更新、负载均衡
  3. 可扩展性:支持大规模集群和自定义扩展
  4. 声明式配置:使用 YAML 文件描述期望状态
  5. 丰富的生态系统:Helm、Istio、Prometheus 等
了解了 Kubernetes 的基本概念和架构后,接下来我们将学习如何安装和配置 Kubernetes 集群。