Kubernetes 集群架构与高可用机制分析
组件高可用方式关键配置多实例 + LB3 实例,Endpoints 自动负载均衡Leader 选举Leader 选举etcdRaft 集群3 节点,Quorum=2CoreDNSDeployment (2 副本)Kubelet独立运行 + 自动重启Containerd独立运行 + 无状态设计CiliumDaemonSet每节点运行 + Shim 隔离完全高可用- 控制平面组件均支持故障自动转移无单
·
目录标题
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
高可用机制:
- 多实例部署 - 3 个 kube-apiserver 实例同时运行
- 负载均衡 - 通过 kubernetes service (ClusterIP) 实现负载分发
- etcd 集群 - 每个 apiserver 连接本地 etcd(127.0.0.1:2379)
- 无状态设计 - 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
高可用特性:
- 多副本部署 - 2 个副本分散在不同节点
- Pod 反亲和 - 优先调度到不同节点,避免单点故障
- 滚动更新 - maxUnavailable=1 保证至少 1 个副本可用
- 关键优先级 - system-cluster-critical 保证优先调度
- 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
十、架构特点总结
优势
- 完全高可用 - 控制平面组件均支持故障自动转移
- 无单点故障 - etcd 3 节点集群,容忍 1 节点故障
- 多操作系统支持 - RHEL、openEuler、Kylin 混合部署
- 现代网络方案 - Cilium 提供 eBPF 高性能网络
- 本地访问优化 - apiserver 连接本地 etcd,降低延迟
- 容器运行时现代化 - containerd + runc v2,性能优于 Docker
- DNS 高可用 - CoreDNS 多副本 + Pod 反亲和
- 节点自治 - Kubelet 独立运行,API Server 故障不影响已有 Pod
组件版本信息
| 组件 | 版本 |
|---|---|
| Kubernetes | v1.24.10 |
| containerd | v1.7.3 |
| runc | v1.1.9 |
| CoreDNS | v1.8.6 |
| Cilium | (最新版) |
注意事项
- 节点容量 - 3 个控制平面节点 + 1 个工作节点,建议将工作负载与控制平面分离
- etcd 维护 - etcd 数据目录使用 /opt/qfusion/etcd,需定期备份
- 证书管理 - 各组件使用 TLS 双向认证,注意证书有效期
- 操作系统差异 - 不同 OS 内核版本不同,需注意兼容性测试
- Kubelet 驱逐 - 配置了内存/磁盘驱逐策略,注意资源监控
- containerd 存储 - 使用 overlayfs 存储驱动,注意磁盘空间
- CoreDNS 缓存 - 30秒 TTL,DNS 变更可能有延迟
更多推荐


所有评论(0)