刚接触Kubernetes时,面对各种组件名词就像面对一盒乐高零件——知道每个部件都很重要,但不知道如何拼装成型。这里我用生产环境中最常见的组件拓扑,带你看懂Kubernetes集群的运转骨架。
典型生产集群分为两大平面:控制平面(Control Plane)和工作节点(Worker Node)。控制平面是集群的大脑,负责全局决策;工作节点是肌肉,负责执行具体任务。二者通过API Server这个"神经系统"保持通信。
API Server:集群的唯一边关,所有内部外部的通信都要经过它。采用声明式API设计,当你提交一个YAML文件时,它不会立即执行操作,而是先将期望状态写入etcd,再由其他组件协同达成目标状态。这种设计使得系统具备自我修复能力——比如某个Pod意外终止,控制器会发现实际状态与etcd中记录不符,自动重建Pod。
etcd:集群的"记忆中枢",采用Raft协议实现分布式一致性。所有集群状态数据都存储在这里,包括节点信息、Pod配置、Secret数据等。生产环境中建议部署3/5/7个节点组成高可用集群,避免单点故障导致整个集群失忆。
Controller Manager:集群的"自动驾驶系统",包含Node Controller、Replication Controller等子模块。以Deployment控制器为例,它会持续监控Pod副本数,如果实际数量少于声明数量(比如节点故障导致Pod丢失),就会自动创建新Pod。这种控制循环(Control Loop)机制是Kubernetes实现自愈能力的核心。
Scheduler:资源分配的"智能调度器",通过预选(Predicates)和优选(Priorities)两个阶段为Pod选择最佳节点。预选阶段过滤掉不符合硬性要求的节点(如资源不足、标签不匹配),优选阶段则根据资源平衡、数据亲和性等策略打分。你可以通过自定义调度器扩展策略,比如实现GPU资源的特殊调度逻辑。
kubelet:节点上的"监工",既接收API Server指令,也向控制平面汇报节点状态。它通过PodSpec文件(来自etcd)管理容器生命周期,但更关键的是持续执行节点健康检查。例如当内存压力过大时,kubelet会按优先级驱逐Pod,同时更新Pod状态到API Server。
kube-proxy:集群的"网络导游",维护节点上的iptables/IPVS规则,实现Service的虚拟IP到Pod IP的流量转发。当Service的后端Pod发生变化时(如扩缩容),kube-proxy会实时更新规则,确保流量正确路由。这种设计使得服务发现对应用完全透明。
容器运行时:实际干活的"搬运工",负责镜像管理和容器运行。虽然Docker曾是默认选择,但现在更推荐containerd或CRI-O这类符合CRI(容器运行时接口)标准的轻量级方案。Kubernetes通过CRI抽象了不同运行时的差异,就像JDBC屏蔽了数据库实现细节。
生产环境提示:控制平面组件建议以静态Pod方式运行,由kubelet直接管理。这样即使控制平面节点重启,kubelet也会自动恢复这些关键组件,形成"鸡生蛋蛋生鸡"的良性依赖。
理解单个组件只是第一步,更重要的是看清它们如何协同工作。我们以一个Pod创建请求为例,看看各组件如何接力完成任务。
用户提交YAML:当执行kubectl apply -f nginx.yaml时,kubectl会将YAML转换为JSON发送给API Server。API Server先进行认证(Authentication)和鉴权(Authorization),再通过准入控制(Admission Control)链进行修改或验证(比如自动注入Sidecar)。
状态存储:验证通过的资源定义会被写入etcd,此时API Server返回确认响应。注意这时还没有任何实际资源被创建,只是记录了用户的期望状态。
控制器介入:Deployment控制器watch到新的ReplicaSet创建事件,立即创建对应的Pod定义(此时仍是etcd中的记录)。调度器检测到未调度的Pod,开始执行调度算法。
节点绑定:调度器选择合适节点后,在etcd中更新Pod的nodeName字段。目标节点上的kubelet通过List-Watch机制发现有待运行的Pod,于是调用容器运行时拉取镜像并启动容器。
状态反馈:kubelet持续监控容器状态,通过API Server更新Pod状态。控制器管理器中的各种控制器会对比实际状态与期望状态,必要时采取纠正措施。
所有组件间通信都遵循以下黄金法则:
这种中心辐射型(Hub-Spoke)架构虽然给API Server带来较大压力,但大大简化了系统复杂度。实践中可以通过以下方式优化:
与传统运维工具的命令式操作不同,Kubernetes采用声明式API:
这种设计带来两个核心优势:
实现原理在于:
控制器是Kubernetes的"自动化引擎",其工作流程可以概括为:
以ReplicaSet控制器为例:
go复制for {
实际Pod数 := 统计当前运行中的Pod数量
期望Pod数 := 从etcd读取ReplicaSet定义的副本数
if 实际Pod数 < 期望Pod数 {
创建新的Pod
} else if 实际Pod数 > 期望Pod数 {
删除多余的Pod
}
sleep(同步间隔)
}
Kubernetes各组件的可扩展性体现在三个层面:
这种架构使得Kubernetes既能保持核心稳定,又能灵活适应各种场景需求。例如:
生产级控制平面需要避免单点故障,典型配置包括:
网络配置建议:
etcd性能优化:
yaml复制# 提高存储配额防止空间耗尽
--quota-backend-bytes=8GB
# 调整心跳间隔和选举超时
--heartbeat-interval=500ms
--election-timeout=2500ms
# 定期压缩历史版本
--auto-compaction-retention=8h
kubelet资源预留:
yaml复制# 确保系统进程有足够资源
kubeReserved:
cpu: "500m"
memory: "1Gi"
systemReserved:
cpu: "500m"
memory: "1Gi"
# 防止Pod耗尽所有磁盘空间
evictionHard:
memory.available: "200Mi"
nodefs.available: "10%"
核心监控指标包括:
常用排错命令:
bash复制# 检查组件健康状态
kubectl get --raw='/readyz?verbose'
# 追踪API请求
kubectl --v=8 get pods
# 分析调度决策
kubectl describe pod <name> | grep -A10 Events
# 检查证书有效期
openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
API Server无法连接etcd:
ETCDCTL_API=3 etcdctl endpoint health控制器管理器不断重启:
--leader-elect参数已启用API Server响应缓慢:
调度器延迟过高:
etcd存储增长过快:
--auto-compaction-retentionService无法访问:
kubectl get endpoints <service-name>Pod间网络不通:
Kubernetes版本迭代快速(每季度一个小版本),升级时需特别注意组件兼容性:
官方支持的版本偏差范围:
ETCDCTL_API=3 etcdctl snapshot save backup.dbkubectl convert工具转换旧版资源服务账户管理:
RBAC配置原则:
kubectl auth can-i验证权限网络策略示例:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-access
spec:
podSelector:
matchLabels:
role: db
ingress:
- from:
- podSelector:
matchLabels:
role: app
ports:
- protocol: TCP
port: 5432
Pod安全标准:
安全上下文配置:
yaml复制securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
capabilities:
drop:
- ALL