1. 简介

Kubernetes(简称 K8s)是容器化趋势的自然演进。虽然我们可以从零开始创建容器,但通常我们会使用像 Docker 这样的工具来自动化配置和部署。Kubernetes 则更进一步,确保这些流程按预期发生,包括冗余机制和高层配置的自动执行。

所有这些操作都运行在一个叫做 集群(Cluster) 的组织单元中。集群由控制节点(Control Plane)和工作节点(Worker Node)组成,用于管理和运行容器化应用,这些容器以 Pod(容器的封装)形式存在。为了便于组织和管理,Kubernetes 集群被拆分为多个组件。

本文将带你深入了解一个典型 Kubernetes 集群的组成部分。我们将依次介绍:

  • Kubernetes 的部署步骤
  • 集群整体结构
  • 容器运行时(Container Runtime)
  • 控制平面组件(Control Plane Components)
  • 节点组件(Node Components)
  • 插件(Addons)

我们使用的测试环境为 Debian 12(Bookworm)+ GNU Bash 5.2.15,除非特别说明,大部分命令在 POSIX 兼容环境中均可运行。


2. 部署 Kubernetes

在深入了解集群结构之前,我们先来部署一个基础的 Kubernetes 集群。

2.1. 禁用 Swap

目前 Kubernetes 仍不推荐使用 Swap。启用 Swap 会导致性能下降和调度不确定性。

操作步骤:

  1. 查看当前 Swap 使用情况:
$ cat /proc/swaps
Filename   Type       Size     Used   Priority
/dev/sda6  partition  6664301  66601  0
  1. 关闭所有 Swap:
$ swapoff --all
  1. 卸载 Swap 分区或文件:
$ umount /dev/sda6
$ rm --force /swapfile
  1. 修改 /etc/fstab,防止重启后自动挂载 Swap。

2.2. 内核配置

Kubernetes 依赖一些内核特性,需提前配置:

操作步骤:

  1. 启用 OverlayFS 和 Bridge 网络过滤模块:
$ cat <<EOI > /etc/modules-load.d/88-kuber.conf
overlay
br_netfilter
EOI
  1. 配置 sysctl:
$ cat <<EOI > /etc/sysctl.d/88-k8s.conf
# kubernetes bridge
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-iptables  = 1
EOI
  1. 清空 iptables 规则避免冲突:
$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

2.3. 安装 containerd

containerd 是 Kubernetes 推荐的容器运行时之一。

操作步骤:

  1. 安装 containerd:
$ apt-get update && apt-get install containerd
  1. 配置 containerd 与 Kubernetes 兼容:
$ cp /etc/containerd/config.toml /etc/containerd/config.toml.org
$ containerd config default > /etc/containerd/config.toml
$ sed --in-place 's/registry.k8s.io\/pause:3.6/registry.k8s.io\/pause:3.9/' /etc/containerd/config.toml
$ sed --in-place 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
$ systemctl daemon-reload
$ systemctl restart containerd

⚠️ 注意: pause 容器用于 Pod 的初始化和容器失败时的兜底,版本不一致可能导致 Pod 启动失败。


2.4. 安装 Kubernetes

操作步骤:

  1. 添加 Kubernetes 仓库:
$ apt-get update && apt-get install apt-transport-https curl gnupg2
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/kubernetes-archive-keyring.gpg add -
$ cat <<EOI > /etc/apt/sources.list.d/kubernetes.list
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main
EOI
  1. 安装 kubelet、kubeadm、kubectl:
$ apt-get update && apt-get install kubelet kubeadm kubectl
  1. 锁定版本避免升级导致问题:
$ apt-mark hold kubelet kubeadm kubectl

2.5. 初始化集群

使用 kubeadm 初始化单节点集群:

$ kubeadm init --pod-network-cidr=10.244.0.0/16

⚠️ 注意: --pod-network-cidr 是 Flannel 默认使用的网络段,若使用其他网络插件请根据实际情况调整。

初始化完成后,按照输出提示操作,配置 kubectl 的访问权限。


2.6. 启用单节点部署

如果你只部署了一个节点,需要允许其调度 Pod:

$ kubectl taint nodes --all node-role.kubernetes.io/control-plane-

⚠️ 说明: 去除 control-plane 的 Taint,使该节点也能运行普通 Pod。


2.7. 配置网络插件

我们使用 Flannel 作为网络插件:

$ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

你也可以先下载 YAML 文件,根据需要修改 CIDR 等参数后再应用。


3. Kubernetes 集群概览

部署完成后,查看 kube-system 命名空间下的所有组件:

$ kubectl get all --namespace=kube-system

输出示例:

NAME                               READY   STATUS    RESTARTS   AGE
pod/coredns-76f75df574-w62vl       1/1     Running   0          15m
pod/coredns-76f75df574-zqx8w       1/1     Running   0          15m
pod/etcd-xost                      1/1     Running   0          15m
pod/kube-apiserver-xost            1/1     Running   0          15m
pod/kube-controller-manager-xost   1/1     Running   0          15m
pod/kube-proxy-mvcfp               1/1     Running   0          15m
pod/kube-scheduler-xost            1/1     Running   0          15m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.96.0.10           53/UDP,53/TCP,9153/TCP   15m

可以看到,即使是刚初始化的 Kubernetes 集群,也包含多个核心组件,它们分布在控制平面和节点中。

下图展示了各组件之间的交互关系:

Kubernetes 集群组件


4. 容器运行时(Container Runtime)

容器运行时是 Kubernetes 的底层基础,负责容器的创建和管理。

常用的运行时包括:

  • dockerd(已逐步弃用)
  • containerd ✅(推荐)
  • cri-o

只要符合 Kubernetes CRI(容器运行时接口)标准的运行时都可以使用。


5. 控制平面组件(Control Plane Components)

控制平面是 Kubernetes 的“大脑”,负责集群的管理和调度。

5.1. kube-apiserver(API 服务器)

kube-apiserver 是 Kubernetes 的核心接口,所有组件都通过它进行通信。

✅ 特点:

  • 提供 RESTful API
  • kubectl 命令的后端
  • 是其他组件通信的中枢

5.2. etcd(分布式键值存储)

etcd 是 Kubernetes 的“大脑”存储,保存集群的所有状态信息。

✅ 特点:

  • 分布式、高可用
  • 保存集群配置、状态、元数据
  • 默认挂载配置和数据卷:
$ kubectl describe pods/etcd-xost --namespace=kube-system
[...]
Mounts:
  /etc/kubernetes/pki/etcd from etcd-certs (rw)
  /var/lib/etcd from etcd-data (rw)
[...]

5.3. kube-scheduler(调度器)

kube-scheduler 负责将 Pod 调度到合适的节点上运行。

✅ 调度依据包括:

  • 资源限制(CPU、内存)
  • 节点标签(Label)
  • 拓扑分布(Affinity/Anti-Affinity)
  • 数据卷需求

5.4. kube-controller-manager(控制器管理器)

负责运行多个控制器,确保集群实际状态与期望状态一致。

✅ 常见控制器包括:

  • ReplicaSet:确保 Pod 数量
  • Deployment:管理无状态应用
  • DaemonSet:每个节点运行一个 Pod
  • StatefulSet:管理有状态应用
  • Job/CronJob:定时任务
  • 自定义控制器

5.5. cloud-controller-manager(云控制器管理器)

用于与云平台交互,如 AWS、GCP、阿里云等。

✅ 说明:

  • 若部署在本地或私有环境,可忽略此组件

5.6. coredns(内部 DNS 服务器)

coredns 是 Kubernetes 的内置 DNS 服务,负责 Pod 和 Service 的内部域名解析。

✅ 特点:

  • 必须组件,即使是最简单的集群也必须包含
  • 默认部署为 Deployment,支持水平扩展

6. 节点组件(Node Components)

节点组件运行在每个 Worker Node 上,负责 Pod 的运行和与控制平面的通信。

6.1. kubelet(节点代理)

kubelet 是节点上的“大脑”,负责:

  • 管理 Pod 生命周期
  • 执行来自 API Server 的指令
  • 上报节点状态

⚠️ 踩坑提醒: 如果 kubelet 挂了,节点上的 Pod 将无法被管理。

6.2. kube-proxy(网络代理)

kube-proxy 负责节点上的网络通信,包括:

  • 转发数据包
  • 网络策略执行
  • 服务发现与负载均衡

⚠️ 注意: 它与 CNI 插件无关,属于 Kubernetes 原生网络组件。


7. 插件(Addons)

插件是 Kubernetes 的扩展功能,非核心但非常实用。

✅ 常见插件包括:

  • DNS:coredns(已包含)
  • Dashboard:图形化管理界面
  • 监控:Prometheus + Grafana
  • 日志:ELK Stack、Loki
  • 网络:Calico、Flannel、Cilium(已安装)

网络插件是插件中最为复杂的一类,因为容器之间的网络互通是 Kubernetes 最具挑战的部分之一。


8. 总结

本文我们部署了一个基础的 Kubernetes 集群,并逐一介绍了其核心组件:

组件 职责
kube-apiserver 提供 API 接口
etcd 存储集群状态
kube-scheduler 调度 Pod
kube-controller-manager 管理控制器
cloud-controller-manager 云平台交互
coredns 内部 DNS 解析
kubelet 管理节点上 Pod
kube-proxy 网络通信代理
CNI 插件 容器网络互通

即使是最简单的 Kubernetes 集群,也包含多个系统 Pod 和组件,它们协同工作,实现高效的容器编排能力。理解这些组件的作用和交互方式,有助于更好地排查问题和优化集群性能。


原始标题:Kubernetes Cluster Components