深入理解Kubernetes核心组件

前言

笔者由于工作变动去做了云安全,第一次真正的使用上k8s作为部署和安全场景,记录一下k8s学习的过程,本篇是k8s核心组件的学习。

一、Kubernetes架构全景

graph TD
    A[Control Plane] --> B[API Server]
    A --> C[etcd]
    A --> D[Scheduler]
    A --> E[Controller Manager]
    F[Node] --> G[kubelet]
    F --> H[kube-proxy]
    F --> I[Container Runtime]
    B --> G
    B --> H

二、控制平面组件详解

2.1 API Server

  • 作用:集群的"前门",处理所有REST操作
  • 核心功能
    • 认证/授权(与RBAC集成)
    • 校验资源定义(通过Admission Controllers)
    • 提供Watch机制实现实时状态同步

2.2 etcd

  • 角色:分布式键值存储数据库

  • 关键数据

    1
    2
    3
    /registry/pods       # 所有Pod信息
    /registry/services # Service定义
    /registry/nodes # 节点注册信息
  • 操作示例

    1
    etcdctl get / --prefix --keys-only | grep pods

2.3 Scheduler

  • 工作流程
    1. 监听未调度Pod(spec.nodeName为空)
    2. 过滤不满足条件的节点
    3. 打分选择最优节点
    4. 绑定Pod到目标节点

2.4 Controller Manager

  • 核心控制器
    • Deployment Controller
    • ReplicaSet Controller
    • Node Controller
    • Service Controller
    • Endpoints Controller
    • Namespace Controller

三、工作节点组件剖析

3.1 kubelet

  • 主要职责

    • 管理Pod生命周期
    • 上报节点状态
    • 执行存活/就绪探针
  • 关键目录

    1
    2
    /var/lib/kubelet/pods   # Pod数据目录
    /etc/kubernetes/manifests # 静态Pod配置

3.2 kube-proxy

  • 网络代理模式

    • userspace(已淘汰)
    • iptables(默认)
    • IPVS(推荐生产使用)
  • 核心功能

    1
    2
    # 查看Service iptables规则
    iptables -t nat -L KUBE-SERVICES

3.3 Container Runtime

  • 常见选择

    • containerd(推荐)
    • CRI-O
    • Docker(已弃用)
  • 操作接口

    1
    ctr -n k8s.io containers ls  # 查看容器

四、关键附加组件

4.1 CNI插件

  • 常用方案
    • Calico(BGP路由)
    • Flannel(VXLAN)
    • Cilium(eBPF增强)

4.2 Ingress Controller

  • 实现方案
    • Nginx Ingress
    • Traefik
    • HAProxy

4.3 CSI驱动

  • 存储对接
    • AWS EBS
    • Ceph RBD
    • NFS

五、组件交互实战解析

5.1 Pod创建流程

sequenceDiagram
    User->>API Server: kubectl create -f pod.yaml
    API Server->>etcd: 存储Pod定义
    Scheduler->>API Server: Watch未调度Pod
    Scheduler->>API Server: 绑定节点
    kubelet->>API Server: Watch本节点Pod
    kubelet->>Container Runtime: 创建容器
    kubelet->>API Server: 更新Pod状态

5.2 Service流量转发

1
2
3
4
5
# 创建NodePort Service
kubectl expose deploy nginx --port=80 --type=NodePort

# 查看生成的iptables规则
iptables -t nat -L KUBE-SVC-XXX

六、学习资源推荐

6.1 官方文档

6.2 实验环境

  • minikube:本地单节点集群
  • kind:基于Docker的多节点集群

6.3 调试工具

1
2
3
kubectl get --raw /metrics           # 查看组件指标
kubectl describe pod <pod-name> # 查看调度事件
journalctl -u kubelet -f # 查看kubelet日志

结语

理解Kubernetes组件需要:

  1. 掌握各组件职责边界
  2. 熟悉组件间通信机制
  3. 通过实际运维加深理解
  4. 关注组件版本更新变化

建议通过以下步骤渐进学习:

  1. 使用minikube部署实验环境
  2. 手动停止组件观察集群行为
  3. 跟踪API Server的请求日志
  4. 分析etcd存储的数据结构

真正的精通来自于对底层原理的深刻理解!

欢迎关注我的其它发布渠道