刚接触Kubernetes时,最让人困惑的就是那一堆听起来相似的组件名词。作为容器编排领域的事实标准,Kubernetes通过模块化设计将功能分解到不同组件中。这里我用生产环境中最常见的二进制部署方式为例,带你看清集群各核心组件的协作关系。
先看整体架构图(以三节点集群为例):
code复制[控制平面]
kube-apiserver ──┬── etcd
kube-scheduler │
kube-controller │
│
[工作节点] │
kubelet ────────┘
kube-proxy
container runtime
控制平面和工作节点之间通过API Server这个"总接线员"通信,所有组件都只与API Server对话,这种设计保证了架构的松耦合。下面我们拆解每个组件的具体职责。
作为唯一与etcd直接交互的组件,API Server承担着以下关键职能:
生产环境中常见的性能优化手段:
bash复制# 调整API Server的etcd连接池大小
--etcd-servers-overrides=/events#https://127.0.0.1:2379
--storage-backend=etcd3
--etcd-compaction-interval=5m0s
重要提示:API Server是无状态的,可以水平扩展。生产环境建议至少部署2个实例做负载均衡。
当新建Pod时,Scheduler负责根据以下因素选择最优节点:
调度决策过程示例:
code复制节点筛选阶段 → 节点打分阶段 → 绑定阶段
↓ ↓ ↓
过滤不满足 根据优先级 将Pod绑定到
条件的节点 规则打分 最高分节点
这个组件实际上运行着多个控制器进程:
控制器通过以下机制确保系统收敛到期望状态:
go复制for {
实际状态 := 获取当前资源状态()
期望状态 := 获取资源配置声明()
if 实际状态 != 期望状态 {
执行协调操作()
}
}
作为分布式键值存储,etcd保存着所有集群数据:
关键监控指标:
这个运行在每个工作节点上的代理核心职责包括:
典型工作流程:
实现Service的IP虚拟化和负载均衡,支持三种模式:
IPVS模式工作原理:
bash复制# 查看IPVS规则
ipvsadm -Ln
TCP 10.96.0.1:443 rr
-> 192.168.1.10:6443 Masq 1 0 0
-> 192.168.1.11:6443 Masq 1 0 0
支持多种运行时:
containerd的架构简析:
code复制containerd
├── runc (实际运行容器)
├── containerd-shim (管理容器生命周期)
└── ctr (管理镜像)
| 插件名称 | 网络模型 | 性能损耗 | 适用场景 |
|---|---|---|---|
| Calico | BGP路由 | 低 | 需要网络策略 |
| Flannel | Overlay | 中 | 简单场景 |
| Cilium | eBPF | 极低 | 高性能需求 |
推荐Prometheus全家桶:
证书类型说明:
证书生成示例:
bash复制openssl req -x509 -newkey rsa:2048 \
-keyout apiserver.key -out apiserver.crt \
-days 365 -nodes -subj "/CN=kube-apiserver"
典型角色定义:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
诊断API Server健康状况:
bash复制curl -k https://localhost:6443/healthz
curl -k https://localhost:6443/livez
检查kubelet状态:
bash复制journalctl -u kubelet -n 50 --no-pager
跨节点通信测试:
bash复制# 在Pod中执行
ping <另一个Pod的IP>
curl <Service的ClusterIP>:<Port>
查看节点资源情况:
bash复制kubectl describe nodes | grep -A 10 "Allocated resources"
处理Pending状态的Pod:
bash复制kubectl describe pod <pod-name> | grep -A 10 Events
典型三节点部署方案:
code复制 +---------------+
| 负载均衡器 |
+-------+-------+
|
+--------------+--------------+
| | |
v v v
Master1 Master2 Master3
(API Server) (API Server) (API Server)
推荐内核参数调整:
bash复制# 增加连接跟踪表大小
sysctl -w net.netfilter.nf_conntrack_max=1000000
# 优化套接字缓冲区
sysctl -w net.core.somaxconn=32768
EFK栈部署要点:
我在实际运维中发现,理解组件交互原理比记住配置参数更重要。当出现问题时,能快速定位是哪个组件出了问题,这才是掌握Kubernetes的关键。建议新手多使用kubectl describe和logs命令观察组件行为,这对理解内部机制很有帮助。