Kubernetes架构概述 #

一、整体架构 #

Kubernetes采用主从架构,由控制平面(Control Plane)和工作节点(Worker Node)组成。

1.1 架构图 #

text
┌─────────────────────────────────────────────────────────────────┐
│                      Kubernetes 集群                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    控制平面 (Control Plane)               │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐       │   │
│  │  │ API Server  │ │  Scheduler  │ │ Controller  │       │   │
│  │  │             │ │             │ │  Manager    │       │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘       │   │
│  │                                                         │   │
│  │  ┌─────────────────────────────────────────────────┐   │   │
│  │  │                    etcd                          │   │   │
│  │  │              (分布式键值存储)                      │   │   │
│  │  └─────────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  ┌───────────────────┐ ┌───────────────────┐                  │
│  │    Worker Node 1   │ │    Worker Node 2   │     ...        │
│  │  ┌─────────────┐  │ │  ┌─────────────┐  │                  │
│  │  │   kubelet   │  │ │  │   kubelet   │  │                  │
│  │  └─────────────┘  │ │  └─────────────┘  │                  │
│  │  ┌─────────────┐  │ │  ┌─────────────┐  │                  │
│  │  │ kube-proxy  │  │ │  │ kube-proxy  │  │                  │
│  │  └─────────────┘  │ │  └─────────────┘  │                  │
│  │  ┌─────────────┐  │ │  ┌─────────────┐  │                  │
│  │  │  容器运行时  │  │ │  │  容器运行时  │  │                  │
│  │  └─────────────┘  │ │  └─────────────┘  │                  │
│  │  ┌─────────────┐  │ │  ┌─────────────┐  │                  │
│  │  │    Pods     │  │ │  │    Pods     │  │                  │
│  │  └─────────────┘  │ │  └─────────────┘  │                  │
│  └───────────────────┘ └───────────────────┘                  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1.2 组件职责概览 #

组件 类型 职责
kube-apiserver 控制平面 API入口,认证授权
etcd 控制平面 存储集群状态
kube-scheduler 控制平面 Pod调度
kube-controller-manager 控制平面 运行控制器
cloud-controller-manager 控制平面 云平台集成
kubelet 节点组件 管理本节点容器
kube-proxy 节点组件 网络代理
容器运行时 节点组件 运行容器

二、控制平面组件 #

2.1 kube-apiserver #

API Server是Kubernetes的前端入口,所有操作都通过API Server进行。

text
请求流程
    │
    ├── 1. 认证 (Authentication)
    │       └── 验证用户身份
    │
    ├── 2. 授权 (Authorization)
    │       └── 检查操作权限
    │
    ├── 3. 准入控制 (Admission Control)
    │       └── 验证和修改请求
    │
    └── 4. 处理请求
            └── 写入etcd,触发控制器

主要功能:

功能 说明
RESTful API 提供资源CRUD接口
认证 支持多种认证方式
授权 RBAC、ABAC等
准入控制 验证和修改请求
数据存储 与etcd交互

启动参数示例:

bash
kube-apiserver \
  --advertise-address=192.168.1.10 \
  --etcd-servers=http://127.0.0.1:2379 \
  --service-cluster-ip-range=10.96.0.0/12 \
  --service-node-port-range=30000-32767 \
  --enable-admission-plugins=NodeRestriction \
  --authorization-mode=RBAC,Node

2.2 etcd #

etcd是高可用的键值存储系统,用于存储Kubernetes所有数据。

text
etcd数据结构
    │
    ├── /registry/pods/<namespace>/<pod-name>
    │
    ├── /registry/services/<namespace>/<service-name>
    │
    ├── /registry/deployments/<namespace>/<deployment-name>
    │
    └── /registry/configmaps/<namespace>/<configmap-name>

etcd操作示例:

bash
# 查看所有键
etcdctl get / --prefix --keys-only

# 查看特定Pod数据
etcdctl get /registry/pods/default/nginx-pod

# 备份数据
etcdctl snapshot save backup.db

# 恢复数据
etcdctl snapshot restore backup.db

etcd集群配置:

bash
# 3节点etcd集群
etcd \
  --name etcd-1 \
  --initial-cluster etcd-1=http://10.0.0.1:2380,etcd-2=http://10.0.0.2:2380,etcd-3=http://10.0.0.3:2380 \
  --initial-cluster-state new \
  --listen-client-urls http://10.0.0.1:2379 \
  --advertise-client-urls http://10.0.0.1:2379

2.3 kube-scheduler #

调度器负责将Pod分配到合适的节点。

text
调度流程
    │
    ├── 1. 过滤 (Filtering)
    │       ├── 资源是否充足
    │       ├── 节点是否健康
    │       ├── 污点容忍
    │       └── 亲和性约束
    │
    ├── 2. 打分 (Scoring)
    │       ├── 资源利用率
    │       ├── 亲和性权重
    │       └── 自定义打分
    │
    └── 3. 绑定 (Binding)
            └── 将Pod绑定到最优节点

调度策略示例:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disktype: ssd
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - amd64
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"

2.4 kube-controller-manager #

控制器管理器运行多个控制器,每个控制器负责特定功能。

text
控制器类型
    │
    ├── 节点控制器 (Node Controller)
    │       └── 监控节点状态
    │
    ├── 副本控制器 (Replication Controller)
    │       └── 维护Pod副本数
    │
    ├── 端点控制器 (Endpoints Controller)
    │       └── 管理Service端点
    │
    ├── 服务账户控制器 (Service Account Controller)
    │       └── 创建默认服务账户
    │
    └── 部署控制器 (Deployment Controller)
            └── 管理Deployment

控制器工作原理:

text
控制循环 (Control Loop)
    │
    ├── 1. 观察当前状态
    │
    ├── 2. 比较期望状态
    │
    ├── 3. 执行调谐操作
    │
    └── 4. 返回步骤1

2.5 cloud-controller-manager #

云控制器管理器用于与云平台集成。

text
云控制器类型
    │
    ├── 节点控制器
    │       └── 检查云平台节点状态
    │
    ├── 路由控制器
    │       └── 配置云平台路由
    │
    └── 服务控制器
            └── 创建云平台负载均衡器

三、节点组件 #

3.1 kubelet #

kubelet是每个节点上运行的代理,负责管理容器生命周期。

text
kubelet职责
    │
    ├── Pod管理
    │   ├── 创建Pod
    │   ├── 启动容器
    │   ├── 监控容器
    │   └── 删除容器
    │
    ├── 节点管理
    │   ├── 注册节点
    │   ├── 上报状态
    │   └── 资源统计
    │
    └── 健康检查
        ├── Liveness Probe
        └── Readiness Probe

kubelet工作流程:

text
Pod创建流程
    │
    ├── 1. kubelet监听API Server
    │
    ├── 2. 获取分配到本节点的Pod
    │
    ├── 3. 拉取镜像
    │
    ├── 4. 创建容器
    │
    ├── 5. 启动容器
    │
    └── 6. 上报状态到API Server

kubelet配置示例:

bash
kubelet \
  --node-ip=192.168.1.20 \
  --cluster-dns=10.96.0.10 \
  --cluster-domain=cluster.local \
  --cgroup-driver=systemd \
  --container-runtime=remote \
  --container-runtime-endpoint=/run/containerd/containerd.sock

3.2 kube-proxy #

kube-proxy维护节点上的网络规则,实现Service的负载均衡。

text
kube-proxy模式
    │
    ├── iptables模式
    │       ├── 使用iptables规则
    │       ├── 性能好
    │       └── 不支持会话保持
    │
    ├── IPVS模式
    │       ├── 使用IPVS负载均衡
    │       ├── 性能更好
    │       └── 支持多种算法
    │
    └── userspace模式(已废弃)
            └── 用户空间代理

iptables模式示例:

bash
# 查看iptables规则
iptables -t nat -L KUBE-SERVICES

# Service规则示例
Chain KUBE-SERVICES (3 references)
target     prot opt source     destination
KUBE-SVC-XXX  tcp  --  anywhere  10.96.0.1  /* default/kubernetes:https */

IPVS模式配置:

bash
# 启用IPVS模式
kube-proxy \
  --proxy-mode=ipvs \
  --ipvs-scheduler=rr

3.3 容器运行时 #

容器运行时负责运行容器,支持多种运行时。

text
容器运行时
    │
    ├── containerd
    │       └── Docker官方运行时
    │
    ├── CRI-O
    │       └── 专为Kubernetes设计
    │
    └── Docker Engine(通过dockershim)
            └── 已弃用

CRI接口:

text
容器运行时接口 (CRI)
    │
    ├── RuntimeService
    │   ├── CreateContainer
    │   ├── StartContainer
    │   ├── StopContainer
    │   └── RemoveContainer
    │
    └── ImageService
        ├── ListImages
        ├── PullImage
        └── RemoveImage

四、插件组件 #

4.1 网络插件 #

网络插件实现Pod网络通信。

text
网络插件 (CNI)
    │
    ├── Calico
    │       ├── 支持网络策略
    │       └── BGP路由
    │
    ├── Flannel
    │       ├── 简单易用
    │       └── VXLAN封装
    │
    ├── Weave Net
    │       └── 自动配置
    │
    └── Cilium
            └── eBPF技术

4.2 存储插件 #

存储插件提供持久化存储支持。

text
存储插件 (CSI)
    │
    ├── AWS EBS CSI
    │
    ├── GCE PD CSI
    │
    ├── Azure Disk CSI
    │
    ├── Ceph CSI
    │
    └── NFS CSI

4.3 DNS插件 #

DNS插件提供服务发现功能。

yaml
# CoreDNS配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }

五、通信流程 #

5.1 Pod创建流程 #

text
Pod创建完整流程
    │
    ├── 1. 用户提交请求
    │       └── kubectl apply -f pod.yaml
    │
    ├── 2. API Server处理
    │       ├── 认证
    │       ├── 授权
    │       ├── 准入控制
    │       └── 写入etcd
    │
    ├── 3. Scheduler调度
    │       ├── 监听未调度Pod
    │       ├── 选择最优节点
    │       └── 更新Pod的nodeName
    │
    ├── 4. kubelet执行
    │       ├── 监听分配的Pod
    │       ├── 拉取镜像
    │       ├── 创建容器
    │       └── 上报状态
    │
    └── 5. 运行成功
            └── Pod状态变为Running

5.2 Service访问流程 #

text
Service访问流程
    │
    ├── 1. 客户端请求
    │       └── 访问ClusterIP:Port
    │
    ├── 2. kube-proxy处理
    │       ├── 匹配iptables规则
    │       └── 随机选择后端Pod
    │
    ├── 3. 转发到Pod
    │       └── DNAT到PodIP:Port
    │
    └── 4. Pod响应
            └── 返回响应数据

六、高可用架构 #

6.1 控制平面高可用 #

text
高可用控制平面
    │
    ├── 多Master节点
    │   ├── 3或5个Master
    │   └── 负载均衡分发请求
    │
    ├── etcd集群
    │   ├── 奇数个节点
    │   ├── 3、5或7个
    │   └── Raft协议保证一致性
    │
    └── 负载均衡
        ├── HAProxy/Nginx
        └── 云平台LB

6.2 高可用配置示例 #

yaml
# HAProxy配置
frontend k8s-apiserver
    bind *:6443
    mode tcp
    option tcplog
    default_backend k8s-apiserver

backend k8s-apiserver
    mode tcp
    option tcp-check
    balance roundrobin
    server master1 192.168.1.10:6443 check
    server master2 192.168.1.11:6443 check
    server master3 192.168.1.12:6443 check

七、总结 #

7.1 架构要点 #

组件 关键点
API Server 统一入口,认证授权
etcd 状态存储,高可用
Scheduler 资源调度,策略匹配
Controller Manager 状态调谐,控制循环
kubelet 节点代理,容器管理
kube-proxy 网络代理,负载均衡

7.2 下一步 #

理解了Kubernetes架构后,让我们深入学习 Pod详解,掌握Kubernetes最小部署单元的使用。

最后更新:2026-03-28