Kubernetes核心组件架构与最佳实践

2026/06/17 共 10943 字,约 32 分钟

一、引言

Kubernetes(简称K8s)作为云原生时代的核心编排平台,其组件架构设计是理解和运维K8s集群的基础。一个稳定高效的K8s集群依赖于各组件的协同工作,了解每个组件的职责和工作机制,对于构建、维护和故障排查都至关重要。本文将深入剖析K8s的核心组件架构,并分享生产环境中的最佳实践。


二、SCQA分析框架

情境(Situation)

  • K8s已成为容器编排的标准,广泛应用于生产环境
  • 集群规模不断扩大,组件间协作复杂度增加
  • 高可用性要求越来越高,任何组件故障都可能影响业务

冲突(Complication)

  • 组件众多,职责划分不清晰
  • 控制平面组件故障可能导致整个集群不可用
  • 节点组件问题影响Pod运行,但定位困难
  • 缺乏系统化的组件管理和监控策略

问题(Question)

  • K8s集群由哪些组件组成?
  • 每个组件的核心功能是什么?
  • 组件之间如何协作?
  • 如何确保组件的高可用性?
  • 生产环境中如何优化组件配置?

答案(Answer)

  • K8s分为控制平面和节点组件两大部分
  • 控制平面负责集群管理和决策,节点组件负责执行
  • 通过API Server实现组件间通信
  • 部署多节点高可用集群保障稳定性
  • 配置资源限制、监控告警确保可靠性

三、Kubernetes架构概览

3.1 整体架构图

┌─────────────────────────────────────────────────────────────────────┐
│                     Kubernetes 集群架构                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │              Control Plane (控制平面)                        │   │
│  │                                                             │   │
│  │  ┌──────────────┐    ┌──────────────────┐                   │   │
│  │  │ kube-apiserver│───▶│      etcd       │                   │   │
│  │  │   (API入口)   │◀───│  (状态存储)     │                   │   │
│  │  └───────┬──────┘    └──────────────────┘                   │   │
│  │          │                                                   │   │
│  │          ▼                                                   │   │
│  │  ┌──────────────┐    ┌──────────────────┐                   │   │
│  │  │kube-scheduler│    │kube-controller- │                   │   │
│  │  │   (调度器)    │    │   manager       │                   │   │
│  │  └──────────────┘    └──────────────────┘                   │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                              │                                     │
│                              │ HTTPS                              │
│                              ▼                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                    Worker Nodes (工作节点)                   │   │
│  │                                                             │   │
│  │  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐   │   │
│  │  │   kubelet    │    │  kube-proxy  │    │ Container    │   │   │
│  │  │  (节点代理)   │    │  (网络代理)   │    │   Runtime    │   │   │
│  │  └──────────────┘    └──────────────┘    └──────────────┘   │   │
│  │          │                  │                  │             │   │
│  │          ▼                  ▼                  ▼             │   │
│  │  ┌──────────────────────────────────────────────────────┐   │   │
│  │  │                      Pods                           │   │   │
│  │  │  ┌─────┐  ┌─────┐  ┌─────┐  ┌───────────────────┐   │   │
│  │  │  │App1 │  │App2 │  │App3 │  │   Sidecar/Init    │   │   │
│  │  │  └─────┘  └─────┘  └─────┘  └───────────────────┘   │   │
│  │  └──────────────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────┘

3.2 组件分类

层级组件角色部署位置
控制平面kube-apiserverAPI入口Control Plane节点
 etcd状态存储Control Plane节点
 kube-schedulerPod调度Control Plane节点
 kube-controller-manager状态管理Control Plane节点
 cloud-controller-manager云厂商适配Control Plane节点(可选)
节点组件kubelet节点代理Worker节点
 kube-proxy网络代理Worker节点
 Container Runtime容器运行时Worker节点
附加组件CoreDNSDNS解析集群内部
 CNI插件网络通信Worker节点
 Ingress Controller外部访问集群内部
 Prometheus/Grafana监控告警集群内部

四、控制平面组件详解

4.1 kube-apiserver

核心职责

  • 集群的唯一入口,所有操作都必须通过它
  • 提供RESTful API接口(kubectl、UI、SDK)
  • 认证(Authentication):验证请求者身份
  • 授权(Authorization):验证请求权限
  • 准入控制(Admission Control):检查请求合法性
  • 唯一与etcd直接交互的组件

架构特点

  • 无状态设计,支持水平扩展
  • 提供Watch机制,支持增量更新
  • 实现RBAC细粒度权限控制

高可用部署

# 至少部署3个实例
# 使用负载均衡器(如HAProxy)
# 配置示例(HAProxy)
frontend k8s-api
  bind *:6443
  default_backend k8s-api-servers

backend k8s-api-servers
  balance roundrobin
  server api1 192.168.1.10:6443 check
  server api2 192.168.1.11:6443 check
  server api3 192.168.1.12:6443 check

4.2 etcd

核心职责

  • 分布式键值数据库,存储集群所有状态数据
  • 保存Pod、Service、Node、ConfigMap、Secret等资源对象
  • 通过Raft一致性算法保证数据强一致性
  • 提供Watch机制,支持实时监听数据变化

与Redis对比

特性etcdRedis
一致性强一致性(线性一致性)最终一致性
持久化默认开启(WAL + Snapshot)可选(RDB/AOF)
Watch机制原生可靠事件通知Pub/Sub(不保证可靠)
适用场景元数据存储、分布式锁缓存、会话存储

生产配置建议

# 部署3/5/7节点集群(奇数节点)
# 配置示例
etcd --name=etcd1 \
  --data-dir=/var/lib/etcd \
  --listen-peer-urls=https://192.168.1.10:2380 \
  --listen-client-urls=https://192.168.1.10:2379 \
  --initial-advertise-peer-urls=https://192.168.1.10:2380 \
  --advertise-client-urls=https://192.168.1.10:2379 \
  --initial-cluster=etcd1=https://192.168.1.10:2380,etcd2=https://192.168.1.11:2380,etcd3=https://192.168.1.12:2380 \
  --initial-cluster-token=etcd-cluster-1 \
  --initial-cluster-state=new

4.3 kube-scheduler

核心职责

  • 为新创建的Pod分配合适的Worker节点
  • 监听API Server获取未调度的Pod
  • 执行调度算法:预选策略 + 优选策略
  • 只做调度决策,不负责创建Pod

调度流程

1. 监听:Watch API Server获取未调度Pod
2. 预选:过滤不满足条件的节点(资源不足、端口冲突等)
3. 优选:对候选节点打分排序(资源利用率、亲和性等)
4. 绑定:将Pod与最优节点绑定,写入etcd

调度策略示例

# Pod调度约束示例
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
  tolerations:
  - key: "key"
    operator: "Exists"
    effect: "NoSchedule"

4.4 kube-controller-manager

核心职责

  • 维护集群的期望状态,确保实际状态与期望状态一致
  • 包含多个子控制器,每个负责一类资源

子控制器列表

控制器职责
Replication Controller维护Pod副本数
Deployment Controller管理Deployment对象
StatefulSet Controller管理有状态应用
DaemonSet Controller确保每个节点运行Pod
Node Controller监控节点状态
Service Controller管理Service和Endpoint
EndpointSlice Controller管理Endpoint分片
Namespace Controller管理命名空间
PersistentVolume Controller管理存储卷

工作模式(Reconcile Loop)

监听状态变化 → 对比期望状态 → 执行调谐操作 → 更新状态

4.5 cloud-controller-manager

核心职责

  • 对接云厂商API,管理云资源
  • 实现云中立架构,使K8s可在任意环境运行
  • 负责负载均衡、存储、网络等云资源的管理

支持的云厂商

  • AWS、Azure、GCP、阿里云、腾讯云等

五、节点组件详解

5.1 kubelet

核心职责

  • 节点代理,控制平面与容器运行时的桥梁
  • Pod生命周期管理(创建/启动/停止/删除)
  • 状态同步(上报Node/Pod状态到API Server)
  • 卷管理(挂载/卸载PV/PVC)
  • 网络配置(调用CNI插件)
  • 健康检查(Liveness/Readiness/Startup Probe)
  • 资源管理(QoS保障:Guaranteed/Burstable/BestEffort)

工作流程

1. 向API Server注册节点
2. 监听Pod配置变化
3. 通过CRI调用容器运行时创建容器
4. 执行健康检查,必要时重启容器
5. 定期上报节点和Pod状态

健康检查配置示例

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: myapp:latest
    ports:
    - containerPort: 8080
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 30
      timeoutSeconds: 10
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 10
      periodSeconds: 5

5.2 kube-proxy

核心职责

  • 维护节点上的网络规则
  • 实现Service的ClusterIP到后端Pod的流量转发
  • 提供服务发现和负载均衡能力

工作模式

模式特点适用场景
iptables默认模式,基于Netfilter中小规模集群
ipvs基于IPVS内核模块大规模高流量集群

切换到ipvs模式

# 安装ipvs依赖
apt-get install ipvsadm ipset

# 修改kube-proxy配置
kubectl edit configmap kube-proxy -n kube-system
# mode: "ipvs"

# 重启kube-proxy
kubectl rollout restart daemonset kube-proxy -n kube-system

5.3 Container Runtime

核心职责

  • 负责创建、运行和管理容器进程
  • 遵循CRI(Container Runtime Interface)规范
  • 提供镜像管理、容器生命周期管理、资源隔离能力

主流选择

Runtime特点推荐度
containerdDocker公司捐赠,CNCF毕业项目推荐
CRI-ORed Hat主导,轻量级推荐
Docker原始实现,但已将运行时分离不推荐(仅作build工具)

containerd配置示例

# 配置containerd使用systemd cgroup驱动
cat > /etc/containerd/config.toml <<EOF
[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.k8s.io/pause:3.9"
  [plugins."io.containerd.grpc.v1.cri".containerd]
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
        runtime_type = "io.containerd.runc.v2"
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
          SystemdCgroup = true
EOF

systemctl restart containerd

六、附加组件

6.1 CoreDNS

核心职责

  • 提供集群内DNS解析服务
  • Pod通过Service名称访问服务
  • 支持自定义域名解析

配置示例

apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.96.0.10
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

6.2 CNI插件

核心职责

  • 实现Pod间网络互通
  • 支持跨节点Pod通信
  • 提供网络策略(NetworkPolicy)

主流CNI插件

插件特点适用场景
Calico支持网络策略,性能优异大规模集群
Flannel简单易用,配置简单中小规模集群
Weave自动配置,无需额外依赖快速部署

NetworkPolicy示例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
spec:
  podSelector: {}
  policyTypes:
  - Ingress

6.3 Ingress Controller

核心职责

  • 管理外部访问集群服务
  • 提供负载均衡、SSL终止、路径路由

主流选择

  • Nginx Ingress Controller
  • Traefik
  • HAProxy Ingress

Ingress配置示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - example.com
    secretName: example-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

七、组件通信流程

7.1 典型操作流程

用户创建Deployment

kubectl apply -f deployment.yaml

内部执行流程

1. kubectl发送请求到kube-apiserver
2. apiserver验证请求(认证、授权、准入控制)
3. apiserver将Deployment写入etcd
4. kube-controller-manager监听到变化
5. controller-manager创建ReplicaSet和Pod
6. kube-scheduler为Pod选择节点
7. scheduler将Pod绑定信息写入etcd
8. 目标节点的kubelet监听到Pod创建事件
9. kubelet通过CRI调用containerd创建容器
10. kube-proxy配置Service网络规则
11. Pod状态上报到apiserver,最终写入etcd

7.2 网络通信安全

  • 所有组件间通信使用HTTPS
  • API Server提供证书颁发
  • 使用ServiceAccount令牌进行认证
  • RBAC控制访问权限

八、生产环境最佳实践

8.1 控制平面高可用

部署架构

┌──────────────────────────────────────────────────────┐
│                   Load Balancer                      │
│                    (VIP: 6443)                      │
└───────────────────────┬──────────────────────────────┘
                        │
        ┌───────────────┼───────────────┐
        ▼               ▼               ▼
┌─────────────┐  ┌─────────────┐  ┌─────────────┐
│  Master-01  │  │  Master-02  │  │  Master-03  │
│ API Server  │  │ API Server  │  │ API Server  │
│ Scheduler   │  │ Scheduler   │  │ Scheduler   │
│ Controller  │  │ Controller  │  │ Controller  │
│ Manager     │  │ Manager     │  │ Manager     │
│ etcd        │  │ etcd        │  │ etcd        │
└─────────────┘  └─────────────┘  └─────────────┘

kubeadm高可用部署

# 初始化第一个控制平面节点
kubeadm init \
  --control-plane-endpoint "vip.example.com:6443" \
  --upload-certs \
  --pod-network-cidr=10.244.0.0/16

# 加入额外控制平面节点
kubeadm join vip.example.com:6443 \
  --token xxx \
  --discovery-token-ca-cert-hash sha256:xxx \
  --control-plane \
  --certificate-key xxx

8.2 etcd备份与恢复

定期备份

# 创建备份脚本
cat > /usr/local/bin/etcd-backup.sh <<EOF
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR=/var/lib/etcd-backups
mkdir -p $BACKUP_DIR

ETCDCTL_API=3 etcdctl snapshot save $BACKUP_DIR/snapshot-$DATE.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 保留最近7天的备份
find $BACKUP_DIR -name "snapshot-*.db" -mtime +7 -delete
EOF

chmod +x /usr/local/bin/etcd-backup.sh

# 添加定时任务
echo "0 2 * * * /usr/local/bin/etcd-backup.sh" >> /var/spool/cron/root

恢复操作

# 停止etcd服务
systemctl stop etcd

# 恢复备份
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
  --data-dir=/var/lib/etcd

# 启动etcd服务
systemctl start etcd

8.3 资源限制配置

控制平面组件资源限制

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    resources:
      requests:
        cpu: "2"
        memory: "4Gi"
      limits:
        cpu: "4"
        memory: "8Gi"

节点资源预留

apiVersion: v1
kind: Node
metadata:
  name: worker-01
spec:
  taints:
  - key: node-role.kubernetes.io/worker
    effect: NoSchedule
  allocatable:
    cpu: "32"
    memory: "62Gi"
    pods: "110"

8.4 监控与告警

组件指标采集

# Prometheus ServiceMonitor配置
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-apiserver
  namespace: monitoring
spec:
  selector:
    matchLabels:
      component: apiserver
  endpoints:
  - port: https
    scheme: https
    tlsConfig:
      caFile: /etc/prometheus/secrets/kubelet-ca/ca.crt
      serverName: kubernetes

关键告警规则

groups:
- name: k8s-control-plane.rules
  rules:
  - alert: APIServerDown
    expr: up{job="kube-apiserver"} == 0
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "API Server不可用"
      description: "API Server  已停止响应"

  - alert: EtcdClusterUnhealthy
    expr: etcd_cluster_health != 1
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "etcd集群不健康"
      description: "etcd集群健康状态异常"

  - alert: KubeletDown
    expr: kube_node_status_condition{condition="Ready",status="true"} == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Kubelet离线"
      description: "节点  Kubelet已离线"

九、常见问题与解决方案

问题一:API Server响应缓慢

现象:kubectl命令超时,API响应延迟高

原因分析

  • 请求量过大,API Server资源不足
  • etcd性能瓶颈
  • 网络带宽不足

解决方案

# 增加API Server资源
# 配置etcd性能优化
# 启用API Server缓存
# 水平扩展API Server实例

问题二:Pod调度失败

现象:Pod长时间处于Pending状态

原因分析

  • 节点资源不足
  • 污点容忍配置问题
  • 亲和性规则冲突
  • 端口冲突

解决方案

# 检查节点资源
kubectl describe node <node-name>

# 检查Pod调度事件
kubectl describe pod <pod-name>

# 调整调度约束或增加节点

问题三:Service无法访问

现象:通过Service ClusterIP无法访问后端Pod

原因分析

  • kube-proxy未运行或配置错误
  • 网络策略阻止流量
  • Endpoint未正确配置
  • CNI网络问题

解决方案

# 检查kube-proxy状态
kubectl get pods -n kube-system -l k8s-app=kube-proxy

# 检查Endpoint状态
kubectl get endpoints <service-name>

# 检查网络策略
kubectl get networkpolicy

问题四:etcd数据损坏

现象:集群状态异常,无法正常操作

解决方案

# 使用备份恢复
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db

# 重建etcd集群

十、总结

核心要点

  1. 架构分层:控制平面负责决策,节点组件负责执行
  2. 组件协作:所有操作通过API Server,状态存储在etcd
  3. 高可用性:控制平面多节点部署,etcd Raft集群
  4. 网络通信:组件间使用HTTPS,kube-proxy实现Service网络
  5. 监控告警:监控关键组件状态,及时发现问题

实施建议

阶段任务时间
第一阶段部署单节点测试集群1天
第二阶段部署多节点高可用集群2-3天
第三阶段配置监控告警体系1-2天
第四阶段制定备份恢复策略1天
第五阶段性能优化和安全加固持续

本文对应的面试题:K8s里边组件都有哪些呢?然后功能是什么?


附录:常用K8s组件命令

# 查看控制平面组件状态
kubectl get pods -n kube-system -l tier=control-plane

# 查看节点状态
kubectl get nodes

# 查看etcd状态
ETCDCTL_API=3 etcdctl endpoint health --endpoints=https://127.0.0.1:2379

# 查看kubelet日志
journalctl -u kubelet -f

# 查看kube-proxy配置
kubectl get configmap kube-proxy -n kube-system -o yaml

文档信息

Search

    Table of Contents