Kubernetes概览
k8s多节点集群架构图
1 | +----------------------------------------------------------------+ |
动作下发流程示意
以部署一个新 Pod 为例
- 用户或系统发起请求
- 通过 kubectl apply -f pod.yaml 提交创建 Pod 的请求。
- API Server 接收请求
- API Server 校验请求合法性,将 Pod 资源写入 etcd,保存集群状态。
- Scheduler 调度 Pod
- Scheduler 监听新 Pod 资源,选择一个合适的 Node 来运行该 Pod。(Scheduler 只“打标签”,不下发命令)
- 控制器管理器更新状态
- Controller Manager 监控 Pod 状态,确保副本数和实际运行数一致。
- kubelet 接收指令
- 被 Scheduler 选中的 Node 上的 kubelet 通过 API Server 获取 Pod 运行指令。
- kubelet 调用容器运行时
- kubelet 调用 Docker 或其他容器运行时启动 Pod 中定义的容器。
- Pod 运行,kubelet 持续汇报状态
- kubelet 持续向 API Server 汇报容器状态,API Server 更新 etcd,保证集群状态一致
类似于
- API Server 是中枢大脑,接受命令,保存状态。
- Scheduler 是派遣员,决定任务(Pod)去哪里执行。
- Controller Manager 是监管者,确保状态符合预期。
- kubelet 是执行官,拿到命令后具体去启动容器。
kube-proxy和containerd/Docker
kube-proxy
kube-proxy 本质上就是自动化管理节点上的「分布式防火墙 + 路由表」的工具
它不是传统意义上的防火墙,但它借用了 Linux 的防火墙技术(iptables / ipvs)来实现服务转发和负载均衡
举个例子
你访问了 10.96.0.10:80(某个 ClusterIP Service)
1 | 1. kube-proxy 已在本机通过 iptables 建了这样的规则: |
但是,kube-proxy 不是用来做安全策略限制的防火墙
总结
职责 | 说明 |
---|---|
🧭 服务发现路由(Service 转发) | 把虚拟的 Service IP 请求,转发给真实 Pod 的 IP |
🔁 负载均衡 | 在多个 Pod 之间做负载均衡:随机、轮询,具体由 iptables 或 ipvs 规则控制 |
🔗 节点网络配置 | 为 NodePort 类型 Service 开放端口并设置本地端口转发 |
🧲 监听 API Server 的 Service / Endpoints 变更 | 当 Pod 增加/减少时,自动更新转发规则 |
containerd/Docker
其实这个就是个docker,但是这只是早期版本才是,现在只需要containerd
谁是谁的下层?
- 当你执行 docker run nginx,其实底层就是:
- Docker CLI → Docker Engine → containerd → runc → 启动容器
containerd 作为后台运行容器的引擎
k8s使用容器运行时
运行时 | 是否兼容 Kubernetes | 说明 |
---|---|---|
Docker | ❌(已废弃) | 需要安装 dockershim 适配层,K8s 1.24 起已移除 |
containerd | ✅(推荐) | 与 Kubelet 直接通过 CRI 通信,轻量、稳定、性能好 |
CRI-O | ✅(OpenShift 等常用) | RedHat 主导,专为 Kubernetes 而生 |
版本变化
-
早期版本(K8s ≤ 1.23):
- kubelet 没有直接支持 containerd,而是通过一层叫 dockershim 的“适配器”让 Kubernetes 可以使用 Docker。
- 所以你必须装 Docker。
-
后来(K8s ≥ 1.24):
- 官方移除了 dockershim。
- Kubernetes 原生支持通过 CRI(Container Runtime Interface) 直接连接 containerd 或 CRI-O。
- Docker 不再被官方支持作为 Kubernetes 的运行时。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HAHA!