三、Kubernetes架构深度剖析
Kubernetes(K8s)是当前容器编排的事实标准,其设计哲学是声明式API + 控制器模式:用户只需声明期望状态,K8s控制器自动将实际状态收敛到期望状态。
3.1 K8s集群架构总览
┌─────────────────────────────────────────────────────────────────────────────┐
│ Kubernetes 集群架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 控制平面 (Control Plane) │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │kube-apiserver│ │ etcd │ │kube-scheduler│ │ │
│ │ │ 认证/授权 │ │ 集群状态 │ │ Pod调度 │ │ │
│ │ │ API入口 │ │ 存储 │ │ │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────────────────┐ │ │
│ │ │ kube-controller-manager │ │ │
│ │ │ Node/Deployment/Service/Job Controller等多种控制器 │ │ │
│ │ └──────────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────┼───────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ kubelet │ │ │ │ kubelet │ │ │ │ kubelet │ │ │
│ │ ├─────────────┤ │ │ ├─────────────┤ │ │ ├─────────────┤ │ │
│ │ │ kube-proxy │ │ │ │ kube-proxy │ │ │ │ kube-proxy │ │ │
│ │ ├─────────────┤ │ │ ├─────────────┤ │ │ ├─────────────┤ │ │
│ │ │ container │ │ │ │ container │ │ │ │ container │ │ │
│ │ │ runtime │ │ │ │ runtime │ │ │ │ runtime │ │ │
│ │ ├─────────────┤ │ │ ├─────────────┤ │ │ ├─────────────┤ │ │
│ │ │ Pod A │ │ │ │ Pod B │ │ │ │ Pod C │ │ │
│ │ │ Pod D │ │ │ │ Pod E │ │ │ │ Pod F │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ └───────────────────┘ └───────────────────┘ └───────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
3.2 控制平面组件详解
kube-apiserver —— 集群的网关
kube-apiserver是K8s集群的唯一操作入口,所有组件都通过它进行通信。
# kube-apiserver的核心职责:
1. REST API服务: 提供增删改查接口
2. 认证与授权:
- 认证: X509证书、Bearer Token、OIDC
- 授权: RBAC、ABAC、Webhook
3. 准入控制: Mutating/Validating Admission Webhook
4. 数据持久化: 唯一与etcd交互的组件
# 查看apiserver配置
kubectl get pod -n kube-system kube-apiserver-master -o yaml
etcd —— 集群的“事实来源”
etcd是一个高可用的分布式键值存储,保存所有集群状态数据。
# etcd数据查看(需要证书)
kubectl exec -n kube-system etcd-master -- sh -c \
"ETCDCTL_API=3 etcdctl --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 \
get /registry/pods/default/nginx --prefix"
# etcd备份(灾难恢复必备)
ETCDCTL_API=3 etcdctl snapshot save snapshot.db
kube-scheduler —— Pod调度决策者
kube-scheduler负责将待调度的Pod分配到最优节点。
// 调度流程(伪代码)
func schedule(pod *Pod) (node string) {
// 1. 过滤阶段:筛选满足条件的节点
feasibleNodes := filterNodes(pod, allNodes)
// 2. 打分阶段:为每个节点打分
for _, node := range feasibleNodes {
score := 0
score += prioritizeByResourceUsage(pod, node) // 资源均衡
score += prioritizeByAffinity(pod, node) // 亲和性
score += prioritizeByImageLocality(pod, node) // 镜像本地性
nodeScores[node] = score
}
// 3. 选择最优节点
return selectBestNode(nodeScores)
}
调度策略配置(可通过调度器配置扩展):
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: custom-scheduler
plugins:
score:
enabled:
- name: NodeResourcesBalancedAllocation # 资源均衡优先
weight: 2
- name: ImageLocality # 镜像本地性优先
weight: 1
kube-controller-manager —— 状态维持者
控制器管理器运行所有控制器,每个控制器负责一种资源的状态维护。
// 控制器通用模式(Reconcile Loop)
for {
desiredState := getDesiredState() // 用户声明
currentState := getCurrentState() // 当前实际状态
if desiredState != currentState {
// 执行调谐动作
reconcile(desiredState, currentState)
}
time.Sleep(resyncPeriod)
}
// 核心控制器列表:
// - DeploymentController: 管理Deployment生命周期
// - ReplicaSetController: 维护Pod副本数
// - NodeController: 监控节点健康状态
// - EndpointController: 维护Service与Pod映射
// - ServiceAccountController: 管理ServiceAccount
3.3 工作节点组件详解
kubelet —— 节点上的Pod管家
kubelet是每个节点上的主要代理,负责Pod生命周期管理。
// kubelet核心循环
func (kl *Kubelet) syncLoop() {
for {
// 1. 监听Pod变更(来自apiserver)
select {
case pod := <-kl.podUpdates:
kl.syncPod(pod) // 同步Pod状态
case <-kl.healthCheck:
kl.updateNodeStatus() // 上报节点状态
}
}
}
func (kl *Kubelet) syncPod(pod *Pod) {
// 1. 创建Pod的Sandbox容器(pause容器)
sandboxID := kl.createPodSandbox(pod)
// 2. 拉取容器镜像
for _, container := range pod.Spec.Containers {
kl.pullImage(container.Image)
}
// 3. 创建业务容器
for _, container := range pod.Spec.Containers {
kl.createContainer(container)
kl.startContainer(container)
}
// 4. 启动健康检查探针
kl.startProbes(pod)
}
kube-proxy —— 网络代理与服务发现
kube-proxy负责维护节点网络规则,实现Service的负载均衡。
三种代理模式:
# 1. userspace模式(旧版,性能差)
# 2. iptables模式(默认,性能较好)
# 3. ipvs模式(推荐,支持更多调度算法)
# ipvs模式支持以下调度算法:
# - rr: 轮询
# - lc: 最少连接
# - dh: 目标哈希
# - sh: 源哈希
# - sed: 最短期望延迟
# - nq: 永不排队
# 启用ipvs模式
kubectl edit configmap -n kube-system kube-proxy
# 修改 mode: "ipvs"