01-架构与核心概念
Kubernetes Control Plane 和 Node 组件深度解析
学习目标
通过本模块学习,你将掌握:
- Kubernetes 整体架构和组件职责
- Control Plane 各组件的工作原理
- Node 侧组件的协作机制
- API 生态和扩展机制
- 面试高频架构问题
一、Kubernetes 整体架构
核心设计理念
Kubernetes 采用声明式 API 和 控制器模式,通过以下核心概念实现容器编排:
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes 集群 │
├─────────────────────────────────────────────────────────────┤
│ Control Plane (Master) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ API Server │ │ Scheduler │ │ Controller │ │
│ │ │ │ │ │ Manager │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ etcd │ │
│ └─────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Worker Nodes │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ kubelet │ │ kubelet │ │ kubelet │ │
│ │ kube-proxy │ │ kube-proxy │ │ kube-proxy │ │
│ │ Container │ │ Container │ │ Container │ │
│ │ Runtime │ │ Runtime │ │ Runtime │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
关键特性
特性 | 说明 | 优势 |
---|---|---|
声明式 API | 描述期望状态,而非执行步骤 | 幂等性、可重复性 |
控制器模式 | 持续监控并修正实际状态 | 自动化、自愈能力 |
微服务架构 | 组件松耦合,独立部署 | 可扩展性、可维护性 |
云原生设计 | 为云环境优化 | 弹性、可观测性 |
️ 二、Control Plane 组件详解
2.1 kube-apiserver(API 服务器)
职责:Kubernetes 集群的唯一入口点
核心功能
- 认证(Authentication):验证用户身份
- 鉴权(Authorization):检查用户权限
- 准入控制(Admission Control):验证和修改请求
- 审计(Audit):记录所有 API 请求
- QPS 限流:防止 API 过载
- 优先级队列:确保重要请求优先处理
工作原理
graph TD
A[客户端请求] --> B[认证]
B --> C[鉴权]
C --> D[准入控制]
D --> E[API 处理]
E --> F[etcd 存储]
F --> G[返回响应]
关键配置
# kube-apiserver 配置示例
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-apiserver-config
data:
kube-apiserver.yaml: |
apiVersion: kubeapiserver.config.k8s.io/v1
kind: KubeAPIServerConfiguration
audit:
logFormat: json
logMaxAge: 30
admission:
plugins:
- name: ResourceQuota
- name: LimitRanger
requestTimeout: 60s
maxRequestsInFlight: 400
2.2 etcd(分布式存储)
职责:存储集群的所有状态数据
核心特性
- 强一致性:Raft 算法保证数据一致性
- 高可用性:支持多节点部署
- 性能优化:SSD 存储,定期压缩
- 备份恢复:支持快照和恢复
性能调优
# etcd 性能监控
ETCDCTL_API=3 etcdctl endpoint health --endpoints=https://127.0.0.1:2379
# 查看 etcd 状态
ETCDCTL_API=3 etcdctl endpoint status --endpoints=https://127.0.0.1:2379 -w table
# 定期压缩(减少存储空间)
ETCDCTL_API=3 etcdctl defrag --endpoints=https://127.0.0.1:2379
备份策略
# 创建快照
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.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
# 恢复快照
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
--data-dir /var/lib/etcd-restore
2.3 kube-scheduler(调度器)
职责:为新创建的 Pod 选择最合适的 Node
调度流程
graph TD
A[Pod 创建] --> B[加入调度队列]
B --> C[预选阶段<br/>Filter]
C --> D[优选阶段<br/>Score]
D --> E[选择最佳节点]
E --> F[绑定到节点]
预选策略(Filter)
- NodeAffinity:节点亲和性
- PodAffinity:Pod 亲和性
- Taints/Tolerations:污点和容忍
- 资源检查:CPU、内存、存储
- 端口冲突:检查端口占用
优选策略(Score)
- LeastRequestedPriority:优先选择资源使用率低的节点
- BalancedResourceAllocation:平衡 CPU 和内存使用
- ImageLocalityPriority:优先选择已缓存镜像的节点
- NodeAffinityPriority:节点亲和性权重
自定义调度器
apiVersion: v1
kind: Pod
metadata:
name: custom-scheduler-pod
spec:
schedulerName: my-custom-scheduler
containers:
- name: nginx
image: nginx
2.4 kube-controller-manager(控制器管理器)
职责:运行各种控制器,确保集群状态符合期望
核心控制器
控制器 | 职责 | 关键资源 |
---|---|---|
Deployment Controller | 管理 Deployment 和 ReplicaSet | Deployment, ReplicaSet |
StatefulSet Controller | 管理有状态应用 | StatefulSet |
DaemonSet Controller | 确保每个节点运行一个 Pod | DaemonSet |
Job Controller | 管理批处理任务 | Job, CronJob |
Node Controller | 监控节点状态 | Node |
EndpointSlice Controller | 管理服务端点 | EndpointSlice |
控制器工作原理
graph TD
A[期望状态] --> B[控制器监控]
B --> C[比较实际状态]
C --> D{状态一致?}
D -->|是| E[无需操作]
D -->|否| F[执行调谐操作]
F --> G[更新实际状态]
G --> B
2.5 cloud-controller-manager(云控制器)
职责:与云厂商 API 交互,管理云资源
功能模块
- Node Controller:管理云实例生命周期
- Route Controller:配置云路由
- Service Controller:管理云负载均衡器
- Volume Controller:管理云存储卷
️ 三、Node 侧组件详解
3.1 kubelet(节点代理)
职责:管理节点上的 Pod 生命周期
核心功能
- Pod 生命周期管理:创建、启动、停止、删除
- 健康检查:livenessProbe、readinessProbe
- 卷挂载:处理 Volume 挂载
- 容器运行时接口:通过 CRI 与容器运行时交互
- 资源监控:监控节点资源使用情况
工作流程
graph TD
A[API Server] --> B[kubelet]
B --> C[Pod 规格]
C --> D[创建容器]
D --> E[健康检查]
E --> F[状态上报]
F --> A
关键配置
# kubelet 配置示例
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
webhook:
enabled: true
authorization:
mode: Webhook
cgroupDriver: systemd
containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock
podCIDR: 10.244.0.0/16
3.2 容器运行时(Container Runtime)
职责:实际运行容器的底层组件
主流选择
- containerd(推荐):轻量级,性能好
- CRI-O:专为 Kubernetes 设计
- Docker:已废弃 dockershim
CRI 接口
// Container Runtime Interface 核心方法
type RuntimeService interface {
// 创建 Pod
RunPodSandbox(ctx context.Context, req *RunPodSandboxRequest) (*RunPodSandboxResponse, error)
// 停止 Pod
StopPodSandbox(ctx context.Context, req *StopPodSandboxRequest) (*StopPodSandboxResponse, error)
// 创建容器
CreateContainer(ctx context.Context, req *CreateContainerRequest) (*CreateContainerResponse, error)
// 启动容器
StartContainer(ctx context.Context, req *StartContainerRequest) (*StartContainerResponse, error)
}
3.3 CNI(容器网络接口)
职责:为 Pod 配置网络
主流 CNI 插件
- Flannel:简单易用,VXLAN 模式
- Calico:功能丰富,支持网络策略
- Cilium:基于 eBPF,高性能
- Weave:简单部署,自动发现
CNI 工作原理
graph TD
A[Pod 创建] --> B[kubelet]
B --> C[调用 CNI 插件]
C --> D[创建网络接口]
D --> E[配置路由规则]
E --> F[Pod 网络就绪]
3.4 kube-proxy(网络代理)
职责:实现 Service 的负载均衡
工作模式
- iptables 模式:通过 iptables 规则实现
- IPVS 模式:基于内核 IPVS 实现
- eBPF 模式:基于 eBPF 程序实现
负载均衡原理
# 查看 iptables 规则
iptables -t nat -L KUBE-SERVICES
# 查看 IPVS 规则
ipvsadm -ln
# 查看 Service 端点
kubectl get endpoints
四、API 生态与扩展
4.1 原生资源类型
工作负载资源
- Pod:最小部署单元
- ReplicaSet:副本集管理
- Deployment:无状态应用部署
- StatefulSet:有状态应用部署
- DaemonSet:节点守护进程
- Job/CronJob:批处理任务
服务发现资源
- Service:服务抽象
- Ingress:HTTP/HTTPS 路由
- EndpointSlice:服务端点
存储资源
- PersistentVolume:持久卷
- PersistentVolumeClaim:持久卷声明
- StorageClass:存储类
4.2 策略与治理资源
访问控制
- RBAC:基于角色的访问控制
- ServiceAccount:服务账户
- Role/ClusterRole:角色定义
- RoleBinding/ClusterRoleBinding:角色绑定
资源管理
- ResourceQuota:资源配额
- LimitRange:资源限制
- HPA/VPA:自动扩缩容
- PodDisruptionBudget:Pod 中断预算
网络策略
- NetworkPolicy:网络隔离策略
4.3 扩展机制
CRD(自定义资源定义)
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: myresources.example.com
spec:
group: example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
replicas:
type: integer
minimum: 1
maximum: 10
scope: Namespaced
names:
plural: myresources
singular: myresource
kind: MyResource
Operator 模式
// 自定义控制器示例
type MyResourceController struct {
client kubernetes.Interface
informer cache.SharedIndexInformer
workqueue workqueue.RateLimitingInterface
}
func (c *MyResourceController) processNextWorkItem() bool {
obj, shutdown := c.workqueue.Get()
if shutdown {
return false
}
// 处理资源变更
err := c.syncHandler(obj.(string))
if err != nil {
c.workqueue.AddRateLimited(obj)
return true
}
c.workqueue.Done(obj)
return true
}
Admission Webhook
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionWebhook
metadata:
name: my-webhook
webhooks:
- name: my-webhook.example.com
clientConfig:
service:
name: my-webhook-service
namespace: default
path: "/validate"
rules:
- operations: ["CREATE", "UPDATE"]
apiGroups: ["apps"]
apiVersions: ["v1"]
resources: ["deployments"]
️ 五、命令速记
集群信息查看
# 查看集群信息
kubectl cluster-info
# 查看节点状态
kubectl get nodes -o wide
# 查看组件状态
kubectl get pods -n kube-system
# 查看 API 资源
kubectl api-resources
# 查看 API 版本
kubectl api-versions
组件调试
# 查看 kube-apiserver 日志
kubectl logs -n kube-system kube-apiserver-master
# 查看 etcd 状态
kubectl get pods -n kube-system -l component=etcd
# 查看调度器日志
kubectl logs -n kube-system kube-scheduler-master
# 查看控制器管理器日志
kubectl logs -n kube-system kube-controller-manager-master
资源管理
# 查看所有资源
kubectl get all --all-namespaces
# 查看资源详情
kubectl describe node <node-name>
kubectl describe pod <pod-name>
# 查看资源 YAML
kubectl get pod <pod-name> -o yaml
# 编辑资源
kubectl edit pod <pod-name>
六、面试核心问答
Q1: Kubernetes 的整体架构是怎样的?
答案要点:
- Control Plane:API Server、etcd、Scheduler、Controller Manager
- Worker Nodes:kubelet、kube-proxy、容器运行时、CNI
- 声明式 API 和控制器模式
- 微服务架构设计
Q2: kube-apiserver 的作用和特性?
答案要点:
- 集群唯一入口点
- 认证、鉴权、准入控制
- 审计、限流、优先级队列
- RESTful API 设计
Q3: etcd 在 Kubernetes 中的作用?
答案要点:
- 存储集群所有状态数据
- 强一致性保证
- 高可用部署
- 性能优化和备份策略
Q4: kube-scheduler 的调度流程?
答案要点:
- 预选阶段(Filter)
- 优选阶段(Score)
- 绑定阶段(Bind)
- 可扩展的调度框架
Q5: 如何实现 Kubernetes 的高可用?
答案要点:
- Control Plane 多节点部署
- etcd 集群部署
- 负载均衡器配置
- 数据备份和恢复策略
七、故障排查
常见问题诊断
1. API Server 无法访问
# 检查 API Server 状态
kubectl cluster-info
# 检查证书
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
# 检查网络连通性
telnet <master-ip> 6443
2. etcd 连接失败
# 检查 etcd 状态
ETCDCTL_API=3 etcdctl endpoint health
# 检查 etcd 日志
journalctl -u etcd -f
# 检查证书
ETCDCTL_API=3 etcdctl --cert-file=/etc/kubernetes/pki/etcd/server.crt \
--key-file=/etc/kubernetes/pki/etcd/server.key \
--ca-file=/etc/kubernetes/pki/etcd/ca.crt \
endpoint health
3. 节点 NotReady 状态
# 检查节点详情
kubectl describe node <node-name>
# 检查 kubelet 状态
systemctl status kubelet
# 检查容器运行时
systemctl status containerd
八、最佳实践
生产环境建议
Control Plane 高可用
- 至少 3 个 Master 节点
- 使用负载均衡器
- 定期备份 etcd
安全配置
- 启用 RBAC
- 使用 TLS 加密
- 定期轮换证书
监控告警
- 部署 Prometheus + Grafana
- 监控关键指标
- 设置告警规则
资源管理
- 设置合理的 requests/limits
- 使用 ResourceQuota
- 定期清理无用资源
九、总结
通过本模块学习,你已经掌握了:
- Kubernetes 整体架构和设计理念
- Control Plane 各组件的职责和工作原理
- Node 侧组件的协作机制
- API 生态和扩展机制
- 常见故障排查方法
- 生产环境最佳实践
下一步建议:继续学习 02-网络体系,深入了解 Kubernetes 网络通信机制。