Kubernetes 集群架构与高可用机制分析

环境信息

项目
集群地址 .148
API Server https://.141:60443
Kubernetes 版本 v1.24.10
容器运行时 containerd://1.7.3
集群年龄 22 天

一、集群架构概览

1.1 节点拓扑

┌─────────────────────────────────────────────────────────────────────────────┐
│                        Kubernetes 集群架构 (.148)                   │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐         │
│  │   qfusion1       │  │   qfusion2       │  │   qfusion3       │         │
│  │ Control Plane    │  │ Control Plane    │  │ Control Plane    │         │
│  │ .141    │  │ .148    │  │ .150    │         │
│  │ RHEL 7.9         │  │ openEuler 22.03  │  │ openEuler 22.03  │         │
│  │                  │  │                  │  │                  │         │
│  │ ┌──────────────┐ │  │ ┌──────────────┐ │  │ ┌──────────────┐ │         │
│  │ │kube-apiserver│ │  │ │kube-apiserver│ │  │ │kube-apiserver│ │         │
│  │ │   :6443      │ │  │ │   :6443      │ │  │ │   :6443      │ │         │
│  │ └──────────────┘ │  │ └──────────────┘ │  │ └──────────────┘ │         │
│  │ ┌──────────────┐ │  │ ┌──────────────┐ │  │ ┌──────────────┐ │         │
│  │ │kube-controll│ │  │ │kube-controll│ │  │ │kube-controll│ │         │
│  │ │     er      │ │  │ │     er      │ │  │ │     er      │ │         │
│  │ └──────────────┘ │  │ └──────────────┘ │  │ └──────────────┘ │         │
│  │ ┌──────────────┐ │  │ ┌──────────────┐ │  │ ┌──────────────┐ │         │
│  │ │kube-scheduler│ │  │ │kube-scheduler│ │  │ │kube-scheduler│ │         │
│  │ └──────────────┘ │  │ └──────────────┘ │  │ └──────────────┘ │         │
│  │ ┌──────────────┐ │  │ ┌──────────────┐ │  │ ┌──────────────┐ │         │
│  │ │     etcd     │ │  │ │     etcd     │ │  │ │     etcd     │ │         │
│  │ │   :2379/2380 │ │  │ │   :2379/2380 │ │  │ │   :2379/2380 │ │         │
│  │ └──────────────┘ │  │ └──────────────┘ │  │ └──────────────┘ │         │
│  │ ┌──────────────┐ │  │ ┌──────────────┐ │  │ ┌──────────────┐ │         │
│  │ │    Cilium    │ │  │ │    Cilium    │ │  │ │    Cilium    │ │         │
│  │ └──────────────┘ │  │ └──────────────┘ │  │ └──────────────┘ │         │
│  └──────────────────┘  └──────────────────┘  └──────────────────┘         │
│          │                     │                     │                     │
│          └─────────────────────┼─────────────────────┘                     │
│                                │                                           │
│                     ┌─────────────────┐                                    │
│                     │   qfusion4      │                                    │
│                     │  Worker Node    │                                    │
│                     │ .147   │                                    │
│                     │ Kylin V10        │                                    │
│                     │                 │                                    │
│                     │ ┌─────────────┐ │                                    │
│                     │ │   Cilium    │ │                                    │
│                     │ └─────────────┘ │                                    │
│                     └─────────────────┘                                    │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

1.2 节点详细信息

节点名称 IP 角色 操作系统 内核版本
qfusion1 .141 control-plane,master RHEL 7.9 4.19.113-300.el7.x86_64
qfusion2 .148 control-plane,master openEuler 22.03 SP1 5.10.0-136.12.0.86.oe2203sp1.x86_64
qfusion3 .150 control-plane,master openEuler 22.03 LTS 5.10.0-60.18.0.50.oe2203.x86_64
qfusion4 .147 worker Kylin V10 Halberd 4.19.90-52.22.v2207.ky10.x86_64

二、控制平面组件架构

2.1 kube-apiserver 高可用

部署方式: 静态 Pod (Static Pod)

分布情况:

节点 Pod 名称 状态
qfusion1 kube-apiserver-qfusion1 Running
qfusion2 kube-apiserver-qfusion2 Running
qfusion3 kube-apiserver-qfusion3 Running

访问方式:

# Kubernetes Service Endpoints
kubernetes:
  endpoints:
    - .141:6443
    - .148:6443
    - .150:6443
  cluster_ip: 246.96.0.1

高可用机制:

  1. 多实例部署 - 3 个 kube-apiserver 实例同时运行
  2. 负载均衡 - 通过 kubernetes service (ClusterIP) 实现负载分发
  3. etcd 集群 - 每个 apiserver 连接本地 etcd(127.0.0.1:2379)
  4. 无状态设计 - apiserver 本身无状态,可随意切换

配置参数:

--etcd-servers=https://127.0.0.1:2379
--advertise-address=.141  # 各节点不同
--authorization-mode=Node,RBAC
--service-cluster-ip-range=246.96.0.0/12

2.2 kube-controller-manager 高可用

部署方式: 静态 Pod (Static Pod)

分布情况:

节点 Pod 名称 状态
qfusion1 kube-controller-manager-qfusion1 Running
qfusion2 kube-controller-manager-qfusion2 Running
qfusion3 kube-controller-manager-qfusion3 Running

高可用机制: Leader 选举 (Leader Election)

┌─────────────────────────────────────────────────────────────────┐
│           Controller Manager Leader Election                    │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  qfusion1           qfusion2           qfusion3                 │
│  ┌─────────┐       ┌─────────┐       ┌─────────┐              │
│  │Candidate│       │Candidate│       │ Leader  │  ← Active    │
│  │         │       │         │       │         │              │
│  └────┬────┘       └────┬────┘       └────┬────┘              │
│       │                 │                 │                    │
│       └─────────────────┴─────────────────┘                    │
│                         │                                       │
│                    ┌───▼────┐                                   │
│                    │  etcd  │  ← Lease lock coordination       │
│                    └────────┘                                   │
│                                                                 │
│  配置: --leader-elect=true                                     │
  租约时间: 15s (renewDeadline: 10s, retryPeriod: 2s)           │
└─────────────────────────────────────────────────────────────────┘

配置参数:

--leader-elect=true                    # 启用 leader 选举
--cluster-cidr=245.0.0.0/8             # Pod 网段
--service-cluster-ip-range=246.96.0.0/12  # Service 网段
--node-monitor-grace-period=168h       # 节点监控宽限期
--pod-eviction-timeout=120m            # Pod 驱逐超时
--use-service-account-credentials=true # 使用 ServiceAccount 凭证

2.3 kube-scheduler 高可用

部署方式: 静态 Pod (Static Pod)

分布情况:

节点 Pod 名称 状态
qfusion1 kube-scheduler-qfusion1 Running
qfusion2 kube-scheduler-qfusion2 Running
qfusion3 kube-scheduler-qfusion3 Running

高可用机制: Leader 选举 (Leader Election)

┌─────────────────────────────────────────────────────────────────┐
│              Scheduler Leader Election                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  qfusion1           qfusion2           qfusion3                 │
│  ┌─────────┐       ┌─────────┐       ┌─────────┐              │
│  │ Leader  │  ←     │Candidate│       │Candidate│              │
│  │         │  Active│         │       │         │              │
│  └────┬────┘       └────┬────┘       └────┬────┘              │
│       │                 │                 │                    │
│       └─────────────────┴─────────────────┘                    │
│                         │                                       │
│                    ┌───▼────┐                                   │
│                    │  etcd  │  ← Lease lock coordination       │
│                    └────────┘                                   │
│                                                                 │
│  配置: --leader-elect=true                                     │
└─────────────────────────────────────────────────────────────────┘

配置参数:

--leader-elect=true    # 启用 leader 选举

三、etcd 高可用架构

3.1 etcd 集群配置

部署方式: 静态 Pod (Static Pod)

分布情况:

节点 Pod 名称 数据目录
qfusion1 etcd-qfusion1 /opt/qfusion/etcd
qfusion2 etcd-qfusion2 /opt/qfusion/etcd
qfusion3 etcd-qfusion3 /opt/qfusion/etcd

集群拓扑:

┌─────────────────────────────────────────────────────────────────┐
│                    etcd Raft Cluster                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  qfusion1                   qfusion2                   qfusion3 │
│  ┌─────────┐               ┌─────────┐               ┌─────────┐│
│  │  etcd   │◄─────────────►│  etcd   │◄─────────────►│  etcd   ││
│  │         │   Peer TLS    │         │   Peer TLS    │         ││
│  │ :2379/  │               │ :2379/  │               │ :2379/  ││
│  │ :2380   │               │ :2380   │               │ :2380   ││
│  └────┬────┘               └────┬────┘               └────┬────┘│
│       │                         │                         │      │
│       └─────────────────────────┴─────────────────────────┘      │
│                                 │                               │
│                          Raft Consensus                         │
│                           (Quorum: 2/3)                         │
│                                                                 │
│  配置:                                                          │
│  --initial-cluster: qfusion1=https://.141:2380,      │
│                     qfusion2=https://.148:2380,      │
│                     qfusion3=https://.150:2380       │
│  --initial-cluster-state: existing (扩容节点)                   │
│  --election-timeout: 5000ms                                    │
│  --heartbeat-interval: 500ms                                   │
└─────────────────────────────────────────────────────────────────┘

3.2 etcd 高可用机制

机制 说明
Raft 共识算法 分布式一致性,保证数据强一致性
Quorum 机制 2/3 节点确认即可提交,容忍 1 个节点故障
Leader 选举 自动选举 Leader,Leader 故障时自动切换
WAL (预写日志) 数据变更先写入日志,保证数据持久性
Snapshot 定期快照,压缩日志
Peer TLS 节点间通信加密认证
Client TLS 客户端连接加密认证

关键配置参数:

--data-dir=/opt/qfusion/etcd
--name=qfusion1
--initial-advertise-peer-urls=https://.141:2380
--listen-peer-urls=https://.141:2380
--listen-client-urls=https://127.0.0.1:2379,https://.141:2379
--initial-cluster=qfusion1=https://.141:2380,qfusion2=https://.148:2380,qfusion3=https://.150:2380
--election-timeout=5000
--heartbeat-interval=500
--peer-client-cert-auth=true

3.3 etcd 与 API Server 连接

┌─────────────────────────────────────────────────────────────────┐
│           API Server → etcd Connection                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  qfusion1                   qfusion2                   qfusion3 │
│  ┌──────────┐              ┌──────────┐              ┌──────────┐│
│  │  apiserver│              │  apiserver│              │  apiserver││
│  └─────┬────┘              └─────┬────┘              └─────┬────┘│
│        │ 127.0.0.1:2379          │ 127.0.0.1:2379          │      │
│        └──────────┐              └──────────┐              └───┐  │
│                   ▼                        ▼                  ▼  ▼  │
│              ┌─────────┐              ┌─────────┐          ┌──────┐ │
│              │  etcd   │              │  etcd   │          │ etcd │ │
│              │ qfusion1│              │ qfusion2│          │fu3   │ │
│              └─────────┘              └─────────┘          └──────┘ │
│                                                                 │
│  每个 apiserver 连接本地 etcd,减少网络延迟                        │
└─────────────────────────────────────────────────────────────────┘

四、网络组件

4.1 Cilium CNI

部署架构:

组件 类型 分布
cilium-agent DaemonSet 所有节点
cilium-operator Deployment qfusion1, qfusion3
cilium-ipam-hook Deployment qfusion1, qfusion3

高可用机制:

  • cilium-agent 在每个节点运行,负责本节点的网络策略和路由
  • cilium-operator 管理集群级的 CNI 配置,多副本部署

4.2 CoreDNS 高可用架构

部署方式: Deployment (2 副本)

分布情况:

Pod 节点 IP 状态
coredns-678c656468-nx4dr qfusion1 10.255.253.228 Running
coredns-678c656468-t8vtx qfusion3 245.0.2.137 Running

Service 配置:

name: kube-dns
namespace: kube-system
cluster_ip: 246.96.0.10
ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP
  - name: metrics
    port: 9153
    protocol: TCP

高可用机制:

┌─────────────────────────────────────────────────────────────────┐
│                    CoreDNS High Availability                    │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  qfusion1                           qfusion3                   │
│  ┌──────────────┐                 ┌──────────────┐            │
│  │   CoreDNS    │                 │   CoreDNS    │            │
│  │   Pod:01     │                 │   Pod:02     │            │
│  │              │                 │              │            │
│  │  :53 (UDP)   │◄────────────────►│  :53 (UDP)   │            │
│  │  :53 (TCP)   │   Service LB     │  :53 (TCP)   │            │
│  │  :9153       │                 │  :9153       │            │
│  └──────────────┘                 └──────────────┘            │
│         │                                 │                    │
│         └─────────────┬───────────────────┘                    │
│                       ▼                                         │
│              ┌─────────────────┐                               │
│              │  kube-dns SVC   │                               │
│              │  246.96.0.10    │                               │
│              └─────────────────┘                               │
│                                                                 │
│  配置:                                                          │
│  - replicas: 2                                                 │
│  - strategy: RollingUpdate (maxSurge: 25%, maxUnavailable: 1)  │
│  - Pod Anti-Affinity: 优先分散到不同节点                        │
│  - Priority: system-cluster-critical                           │
└─────────────────────────────────────────────────────────────────┘

Deployment 配置:

spec:
  replicas: 2
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 1
  template:
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  k8s-app: kube-dns
              topologyKey: kubernetes.io/hostname
      priorityClassName: system-cluster-critical
      tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
      - key: node-role.kubernetes.io/control-plane
        effect: NoSchedule

Corefile 配置:

.:53 {
    errors                    # 错误日志
    health {
       lameduck 5s           # 健康检查延迟5秒
    }
    ready                    # 就绪检查
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure         # Pod DNS 模式
       fallthrough in-addr.arpa ip6.arpa
       ttl 30                # DNS TTL 30秒
    }
    prometheus :9153         # 指标暴露
    forward . /etc/resolv.conf {
       max_concurrent 1000   # 最大并发查询
    }
    cache 30                 # 缓存30秒
    loop                     # 循环检测
    reload                   # 热重载
    loadbalance              # 负载均衡
}

资源限制:

resources:
  requests:
    cpu: 100m
    memory: 70Mi
  limits:
    memory: 170Mi

健康检查:

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 60
  periodSeconds: 10
  failureThreshold: 5

readinessProbe:
  httpGet:
    path: /ready
    port: 8181
  periodSeconds: 10
  failureThreshold: 3

高可用特性:

  1. 多副本部署 - 2 个副本分散在不同节点
  2. Pod 反亲和 - 优先调度到不同节点,避免单点故障
  3. 滚动更新 - maxUnavailable=1 保证至少 1 个副本可用
  4. 关键优先级 - system-cluster-critical 保证优先调度
  5. Master 容忍 - 允许调度到控制平面节点

五、Kubelet 架构与高可用

5.1 Kubelet 部署方式

部署方式: Systemd Service (每个节点独立运行)

服务状态:

● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled)
   Active: active (running)

启动参数:

/usr/bin/kubelet \
  --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
  --kubeconfig=/etc/kubernetes/kubelet.conf \
  --config=/var/lib/kubelet/config.yaml \
  --container-runtime=remote \
  --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
  --pod-infra-container-image=k8smaster.qfusion.irds/irds/pause:3.7 \
  --max-pods=300 \
  --fail-swap-on=false \
  --feature-gates=NodeSwap=true,ExecProbeTimeout=false \
  --node-ip .141

5.2 Kubelet 配置详解

配置文件位置: /var/lib/kubelet/config.yaml

关键配置:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration

# 认证配置
authentication:
  anonymous:
    enabled: false
  webhook:
    enabled: true
    cacheTTL: 0s
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt

# 授权配置
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s

# Cgroup 驱动
cgroupDriver: systemd

# 集群 DNS
clusterDNS:
- 246.96.0.10
clusterDomain: cluster.local

# 驱逐策略 - 硬驱逐
evictionHard:
  memory.available: 100Mi

# 驱逐策略 - 软驱逐
evictionSoft:
  imagefs.available: 5%
  imagefs.inodesFree: 5%
  memory.available: 100Mi
  nodefs.available: 5%
  nodefs.inodesFree: 5%

evictionSoftGracePeriod:
  imagefs.available: 30s
  imagefs.inodesFree: 30s
  memory.available: 10s
  nodefs.available: 30s
  nodefs.inodesFree: 30s

evictionMaxPodGracePeriod: 30  # 驱逐时 Pod 优雅关闭时间

# 健康检查端口
healthzBindAddress: 127.0.0.1
healthzPort: 10248

# 静态 Pod 路径
staticPodPath: /etc/kubernetes/manifests

# 证书轮换
rotateCertificates: true

# TLS 密码套件
tlsCipherSuites:
  - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
  - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305

5.3 Kubelet 工作原理

┌─────────────────────────────────────────────────────────────────┐
│                    Kubelet 工作流程                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌──────────────┐                                              │
│  │ API Server   │                                              │
│  │              │                                              │
│  └──────▲───────┘                                              │
│         │ watch/                                               │
│         │ list                                                  │
│         │                                                      │
│  ┌──────┴────────────────────────────────────────────────┐    │
│  │                    Kubelet                             │    │
│  │  ┌─────────────────────────────────────────────────┐  │    │
│  │  │  Pod Manager (Pod 管理器)                        │  │    │
│  │  │  ├─ Sync Loop (同步循环)                         │  │    │
│  │  │  ├─ Sync Handler (同步处理器)                    │  │    │
│  │  │  └─ Pod Workers (Pod 工作线程)                  │  │    │
│  │  └─────────────────────────────────────────────────┘  │    │
│  │                                                         │    │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐   │    │
│  │  │  PLEG       │  │  CAdvisor   │  │  Probe      │   │    │
│  │  │ (Pod生命周期)│  │ (资源监控)   │  │ (健康检查)   │   │    │
│  │  └─────────────┘  └─────────────┘  └─────────────┘   │    │
│  │                                                         │    │
│  │  ┌─────────────────────────────────────────────────┐  │    │
│  │  │          Runtime Manager (运行时管理器)          │  │    │
│  │  │   ┌─────────────────────────────────────────┐   │  │    │
│  │  │   │         Container Runtime                │   │  │    │
│  │  │   │         (containerd via CRI)            │   │  │    │
│  │  │   └─────────────────────────────────────────┘   │  │    │
│  │  └─────────────────────────────────────────────────┘  │    │
│  └─────────────────────────────────────────────────────┘  │    │
│                         │                                    │
│                         ▼                                    │
│              ┌──────────────────────┐                        │
│              │   Pod / Containers   │                        │
│              └──────────────────────┘                        │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

5.4 Kubelet 高可用机制

机制 说明
独立部署 每个 node 独立运行 kubelet,无单点故障
自动重启 Systemd 管理,进程崩溃自动重启
状态同步 定期向 API Server 汇报节点和 Pod 状态
资源驱逐 内存/磁盘压力时主动驱逐 Pod
静态 Pod 支持直接管理静态 Pod(控制平面组件)
证书轮换 自动轮换客户端证书

六、Containerd 容器运行时

6.1 Containerd 架构

版本信息:

containerd: v1.7.3
runc: v1.1.9

部署方式: Systemd Service

服务状态:

● containerd.service - containerd container runtime
   Loaded: loaded (/usr/lib/systemd/system/containerd.service; enabled)
   Active: active (running)

6.2 Containerd 配置详解

配置文件位置: /etc/containerd/config.toml

核心配置:

version = 2

[plugins."io.containerd.grpc.v1.cri"]
  # 镜像配置
  sandbox_image = "k8smaster.qfusion.irds/irds/pause:3.7"
  max_container_log_line_size = 16384
  max_concurrent_downloads = 3

  # 存储配置
  snapshotter = "overlayfs"

  # CNI 配置
  [plugins."io.containerd.grpc.v1.cri".cni]
    bin_dir = "/opt/cni/bin"
    conf_dir = "/etc/cni/net.d"

  # 运行时配置
  [plugins."io.containerd.grpc.v1.cri".containerd]
    default_runtime_name = "runc"

    [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

  # 镜像仓库配置
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8smaster.qfusion.irds"]
      endpoint = ["http://k8smaster.qfusion.irds"]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8smaster.qfusion.irds".tls]
      insecure_skip_verify = true

# 存储路径
root = "/var/lib/containerd"
state = "/run/containerd"

# gRPC 配置
[grpc]
  address = "/run/containerd/containerd.sock"
  max_recv_message_size = 16777216
  max_send_message_size = 16777216

6.3 Containerd 架构原理

┌────────────────────────────────────────────────────────────────┐
│                  Containerd 架构层次                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    Kubelet                              │   │
│  │                    (CRI Client)                         │   │
│  └────────────────────────┬────────────────────────────────┘   │
│                           │ gRPC                                │
│                           ▼                                     │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │              Containerd (CRI Plugin)                     │   │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │   │
│  │  │   Image      │  │   Container  │  │    Snapshot  │  │   │
│  │  │   Service    │  │   Service    │  │    Service   │  │   │
│  │  └──────────────┘  └──────────────┘  └──────────────┘  │   │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │   │
│  │  │    Content   │  │    Diff      │  │    Metrics   │  │   │
│  │  │   Service    │  │   Service    │  │    Service   │  │   │
│  │  └──────────────┘  └──────────────┘  └──────────────┘  │   │
│  └────────────────────────┬────────────────────────────────┘   │
│                           │                                     │
│                           ▼                                     │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │              Shim V2 (containerd-shim)                   │   │
│  │  ┌─────────────────────────────────────────────────┐   │   │
│  │  │  runc (OCI Runtime)                             │   │   │
│  │  │  ┌─────────────────────────────────────────┐   │   │   │
│  │  │  │         Containers (Linux Namespace)    │   │   │   │
│  │  │  │  ┌─────────┐  ┌─────────┐  ┌─────────┐  │   │   │   │
│  │  │  │  │ Network │  │  File   │  │  Process│  │   │   │   │
│  │  │  │  │  (Cilium)│  │ System  │  │ Isolation│  │   │   │   │
│  │  │  │  └─────────┘  └─────────┘  └─────────┘  │   │   │   │
│  │  │  └─────────────────────────────────────────┘   │   │   │
│  │  └─────────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

6.4 Containerd 核心组件

组件 功能
Image Service 镜像管理、拉取、存储
Container Service 容器生命周期管理
Snapshot Service 快照管理(分层存储)
Content Service 内容寻址存储 (CAS)
Diff Service 层差异计算
Metrics Service 指标收集
Shim V2 容器运行时 shim 进程
runc OCI 标准运行时

6.5 Containerd 与其他组件交互

┌─────────────────────────────────────────────────────────────────┐
│              Kubelet ↔ Containerd 交互流程                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. Pod 创建流程:                                                │
│     Kubelet → CRI → Containerd → runc → containers               │
│                                                                 │
│  2. 镜像拉取流程:                                                │
│     Kubelet → CRI → Image Service → Registry                    │
│                           │                                     │
│                           ▼                                     │
│                     Content Store                               │
│                                                                 │
│  3. 容器执行流程:                                                │
│     Kubelet → CRI → Container Service → Shim V2 → runc          │
│                           │                                     │
│                           ▼                                     │
│                     Linux Namespaces                            │
│                     (Network/Mount/PID/UTS/IPC)                  │
│                                                                 │
│  4. 存储挂载流程:                                                │
│     Kubelet → CRI → Snapshot Service → overlayfs                │
│                           │                                     │
│                           ▼                                     │
│                     /var/lib/containerd/                         │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

6.6 Containerd 高可用机制

机制 说明
独立进程 与 kubelet 独立,故障不影响 kubelet 重启
Shim 隔离 每个 container 对应独立 shim 进程
无状态设计 状态存储在磁盘,进程重启可恢复
Systemd 管理 崩溃自动重启
资源限制 支持 cgroups 资源隔离
多运行时 支持多种 OCI 运行时 (runc, crun, kata 等)

七、高可用故障场景分析

5.1 API Server 故障

场景: qfusion1 的 kube-apiserver 故障

影响: 无影响
原因:
  1. kubernetes service 的 endpoints 自动移除故障节点
  2. 客户端请求自动路由到健康的 qfusion2/qfusion3
  3. controller/scheduler 重新连接到其他 apiserver

恢复:
  - 静态 Pod 由 kubelet 自动重启

5.2 Controller Manager 故障

场景: qfusion3 的 kube-controller-manager (Leader) 故障

影响: 短暂中断 (< 15s)
原因:
  1. Leader 租约超时 (renewDeadline: 10s)
  2. 剩余节点触发选举,产生新 Leader
  3. 控制器逻辑在新 Leader 上继续执行

恢复:
  - 故障节点重启后成为 Candidate
  - 自动加入下一个选举周期

5.3 Scheduler 故障

场景: qfusion1 的 kube-scheduler (Leader) 故障

影响: 新 Pod 调度短暂延迟 (< 15s)
原因:
  1. Leader 租约超时触发重新选举
  2. 新 Leader 接管调度工作
  3. 未调度的 Pod 在队列中等待

恢复:
  - 故障节点恢复后重新参与选举

5.4 etcd 节点故障

场景: qfusion2 的 etcd 故障

影响: 集群正常运作
原因:
  1. Raft Quorum 仍满足 (2/3)
  2. Leader 选举可在剩余 2 节点进行
  3. 读写操作继续正常

限制:
  - 容忍故障节点数: 1
  - 2 个节点故障时集群只读 (为了安全)

5.5 控制平面节点故障

场景: qfusion2 节点完全故障

影响: 集群功能正常
原因:
  1. 剩余 2 个控制平面节点满足 Quorum
  2. etcd 3→2 节点仍可写入
  3. API Server/Controller/Scheduler 自动切换

影响范围:
  - 运行在该节点的 Pod 需要重新调度
  - Cilium agent 由其他节点接管路由

八、关键配置总结

8.1 高可用配置清单

组件 高可用方式 关键配置
kube-apiserver 多实例 + LB 3 实例,Endpoints 自动负载均衡
kube-controller-manager Leader 选举 –leader-elect=true
kube-scheduler Leader 选举 –leader-elect=true
etcd Raft 集群 3 节点,Quorum=2
CoreDNS Deployment (2 副本) Pod Anti-Affinity + RollingUpdate
Kubelet Systemd Service 独立运行 + 自动重启
Containerd Systemd Service 独立运行 + 无状态设计
Cilium DaemonSet 每节点运行 + Shim 隔离

6.2 集群网络配置

配置项
Service CIDR 246.96.0.0/12
Pod CIDR 245.0.0.0/8
Cluster DNS 246.96.0.10
API Server Port 6443
API Server 246.96.0.1

6.3 静态 Pod 存储位置

控制平面组件作为静态 Pod 部署,配置文件通常位于:

/etc/kubernetes/manifests/
├── kube-apiserver.yaml
├── kube-controller-manager.yaml
├── kube-scheduler.yaml
└── etcd.yaml

九、监控与维护建议

9.1 关键监控指标

组件 监控指标
etcd Raft proposal 成功率、leader 选举次数、磁盘 IO
apiserver 请求延迟、请求成功率
controller-manager 并发 worker 数、处理队列长度
scheduler 调度延迟、调度失败率
CoreDNS DNS 查询延迟、缓存命中率、SERVFAIL 数量
Kubelet Pod 数量、容器启动时间、驱逐事件、PLEG 耗时
Containerd 容器数量、镜像拉取时间、磁盘使用、goroutines
Cilium 网络策略数量、丢包率、连接追踪数

9.2 健康检查命令

# 检查节点状态
kubectl get nodes -o wide

# 检查控制平面组件
kubectl get pods -n kube-system | grep -E "kube-apiserver|kube-controller|kube-scheduler|etcd"

# 检查 CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get endpoints -n kube-system kube-dns

# 检查 Cilium
kubectl get pods -n kube-system -l k8s-app=cilium

# 检查 etcd 健康
kubectl get endpoints -n kube-system kube-etcd

# 检查集群健康
kubectl cluster-info
kubectl get cs

# 检查 Kubelet 服务(在节点上执行)
systemctl status kubelet
journalctl -u kubelet -f

# 检查 Containerd 服务(在节点上执行)
systemctl status containerd
journalctl -u containerd -f
ctr --namespace k8s.io containers ls

9.3 Kubelet 故障排查

# 查看 Kubelet 日志
journalctl -u kubelet -n 100 --no-pager

# 查看 Kubelet 配置
cat /var/lib/kubelet/config.yaml

# 查看 Kubelet 健康状态
curl -k https://localhost:10248/healthz

# 查看节点事件
kubectl describe node <node-name>

# 查看 PLEG (Pod Lifecycle Event Generator) 问题
journalctl -u kubelet | grep -i "pleg"

# 查看驱逐事件
journalctl -u kubelet | grep -i "evict"

9.4 Containerd 故障排查

# 查看容器列表
ctr --namespace k8s.io containers ls

# 查看任务列表
ctr --namespace k8s.io tasks ls

# 查看容器详情
ctr --namespace k8s.io containers info <container-id>

# 查看容器日志
ctr --namespace k8s.io containers logs <container-id>

# 查看镜像列表
ctr --namespace k8s.io images ls

# 查看 containerd 服务状态
systemctl status containerd

# 查看 containerd 日志
journalctl -u containerd -n 100 --no-pager

# 查看 shim 进程
ps aux | grep containerd-shim

# 检查 overlayfs 挂载
mount | grep overlay

9.5 CoreDNS 故障排查

# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100

# 测试 DNS 解析
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default

# 查看 CoreDNS ConfigMap
kubectl get configmap -n kube-system coredns -o yaml

# 查看 CoreDNS Pod 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide

# 查看 DNS 端点
kubectl get endpoints -n kube-system kube-dns

# 测试 DNS 性能
dig @246.96.0.10 kubernetes.default.svc.cluster.local

9.6 备份建议

7.2 健康检查命令

# 检查节点状态
kubectl get nodes -o wide

# 检查控制平面组件
kubectl get pods -n kube-system | grep -E "kube-apiserver|kube-controller|kube-scheduler|etcd"

# 检查 etcd 健康
kubectl get endpoints -n kube-system kube-etcd

# 检查集群健康
kubectl cluster-info
kubectl get cs

7.3 备份建议

# etcd 备份 (在任一控制平面节点)
ETCDCTL_API=3 etcdctl snapshot save \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  /backup/etcd-snapshot-$(date +%Y%m%d).db

十、架构特点总结

优势

  1. 完全高可用 - 控制平面组件均支持故障自动转移
  2. 无单点故障 - etcd 3 节点集群,容忍 1 节点故障
  3. 多操作系统支持 - RHEL、openEuler、Kylin 混合部署
  4. 现代网络方案 - Cilium 提供 eBPF 高性能网络
  5. 本地访问优化 - apiserver 连接本地 etcd,降低延迟
  6. 容器运行时现代化 - containerd + runc v2,性能优于 Docker
  7. DNS 高可用 - CoreDNS 多副本 + Pod 反亲和
  8. 节点自治 - Kubelet 独立运行,API Server 故障不影响已有 Pod

组件版本信息

组件 版本
Kubernetes v1.24.10
containerd v1.7.3
runc v1.1.9
CoreDNS v1.8.6
Cilium (最新版)

注意事项

  1. 节点容量 - 3 个控制平面节点 + 1 个工作节点,建议将工作负载与控制平面分离
  2. etcd 维护 - etcd 数据目录使用 /opt/qfusion/etcd,需定期备份
  3. 证书管理 - 各组件使用 TLS 双向认证,注意证书有效期
  4. 操作系统差异 - 不同 OS 内核版本不同,需注意兼容性测试
  5. Kubelet 驱逐 - 配置了内存/磁盘驱逐策略,注意资源监控
  6. containerd 存储 - 使用 overlayfs 存储驱动,注意磁盘空间
  7. CoreDNS 缓存 - 30秒 TTL,DNS 变更可能有延迟

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐