查看源文件

Kubernetes 架构入门:从一次应用部署认识组件与资源

在一台机器上运行容器时,我们可以直接启动进程、映射端口、挂载目录。机器增加后,还要决定应用放在哪里、故障后怎样恢复、扩容后流量如何到达新实例。Kubernetes 把这些工作拆成可协作的组件,并用 API 对象记录我们希望应用达到的状态。

本文从容器编排要解决的问题开始,再沿着一次部署请求认识控制平面、工作节点和常用资源。阅读时只需了解镜像与容器的基本概念;文中的 kubectl 查询命令需要已经配置好的集群访问凭据。

Kubernetes 负责什么

Kubernetes 简称 K8s,名称来自希腊语“舵手”。它是开源的容器编排平台,提供应用部署、调度、扩缩容和故障恢复等机制。它可以作为 PaaS 的基础,但日志平台、持续交付、完整监控和数据库备份等能力,通常还需要其他系统配合。官方对其定位和边界的说明见Kubernetes 概述。

Kubernetes 借鉴了 Google 在 Borg 等集群系统上的生产经验,2014 年开源,2015 年 7 月发布 1.0,随后加入 CNCF,2018 年成为 CNCF 毕业项目。学习架构时,比记住发展时间更有用的是理解它的声明式管理方式:提交期望状态,由组件不断比较现实与期望,再采取动作缩小差距。

从单机容器走向集群

单机 Docker 本身已有网络、卷、健康检查等能力。困难主要出现在多节点协作:一台宿主机不可用后,谁在其他机器重新创建实例;多个副本同时上线时,谁组织更新、服务发现和流量转发。

日常问题Kubernetes 提供的机制还需配置的条件
容器退出或节点故障kubelet 重启容器,控制器按需创建替代 Pod控制器、资源容量与存储必须允许恢复
扩容后发现新实例Service 与 EndpointSlice 记录后端标签、就绪状态和网络正确
发布新版本或回退Deployment 等控制器组织更新与回滚探针、更新策略、镜像和应用兼容性合理
按负载增减容量HPA 调整副本,节点自动扩缩容器管理节点指标系统和节点供应能力需另行接入
管理配置与数据ConfigMap、Secret、PVC 等 API存储、凭据保护与备份方案需单独设计
区分团队和环境Namespace、RBAC、配额与 NetworkPolicyNamespace 本身不提供完整安全或网络隔离

Kubernetes 还能通过生命周期钩子、探针和资源限制管理应用运行过程。它提供健康检查的 liveness、readiness、startup 三类语义,具体可用的检查方式应按探针类型选择。滚动更新遵循控制器的更新策略、可用副本限制与就绪条件,并不保证所有新副本都先于旧副本启动。

开发和运维的工作发生了什么变化

对开发人员,统一日志入口能减少逐机登录;镜像与 CI/CD 流水线能让多环境发布更一致;Namespace 和声明式清单有助于复制环境。Service 等机制承担了一部分服务发现与负载均衡工作,Helm 等工具可以复用应用的安装参数。

对运维人员,镜像与清单减少了重复配置,控制器能处理部分实例故障,扩容也有统一 API。中间件可以借助 Helm 或 Operator 部署和管理。不过,“一键安装”并不等于已经完成高可用设计;备份还原、数据库容灾、端口与网络冲突仍需要工程判断。容器使用独立网络空间能减少部分端口冲突,hostNetwork、hostPort 等配置仍会受宿主机端口约束。

集群本身也增加了网络、证书、存储和版本维护的工作。日志采集、监控告警、链路追踪、DevOps 与服务网格等生态组件,是在明确需求后逐步补充的能力。

控制平面:保存状态并作出调度与协调决定

一个集群由控制平面和工作节点组成。控制平面负责 API、状态存储、调度与控制循环;工作节点提供 Pod 的运行环境。小型实验中,两种角色可以放在同一台机器上,生产环境则通常采用多实例控制平面。

kube-apiserver:API 入口

用户、控制器和节点通过 API server 读取或修改 Kubernetes 对象。API server 处理认证、授权、准入和对象校验,再把可持久化的集群状态保存到 etcd。它还提供 watch 接口,让组件观察资源变化。

对 Kubernetes API 对象的协作主要经由 API server,但不能理解成集群内所有网络通信都要由它转发。例如业务 Pod 之间直接通信,API server 也会主动访问 kubelet,控制平面组件还可能访问外部云 API。

etcd:集群状态存储

etcd 是分布式键值存储,也是控制平面的核心依赖。对于 Kubernetes 内置的 API 存储路径,通常由 API server 访问 etcd,其他组件通过 API server 访问对象,不能绕过 API 直接修改数据库。

etcd 使用多数派机制。生产集群常用 3 或 5 个成员,3 个成员能容忍 1 个成员故障,5 个能容忍 2 个;成员越多也会增加写入协调开销,因此无需为了高可用盲目增加数量。低延迟、可靠的磁盘和定期快照恢复演练都很重要。

kube-scheduler:为 Pod 选择节点

调度器观察尚未绑定节点的 Pod,按资源请求、亲和性、污点与容忍等条件筛选节点,再为候选节点评分。选择完成后,通过 API 绑定目标节点。容器的实际启动由该节点的 kubelet 与运行时执行。

“选择最合适节点”不表示总能放下 Pod。如果所有节点都不满足约束,Pod 会保持 Pending,事件中通常能看到资源不足或约束不匹配的原因。

kube-controller-manager:持续比较期望与实际状态

controller manager 运行多种控制器。例如 Deployment 控制器维护 ReplicaSet,ReplicaSet 控制器维护 Pod 数量。实际状态偏离目标时,相应控制器通过 API 创建、更新或删除对象。

在常见高可用部署中,scheduler 与 controller manager 的多个实例通过选主协作,通常由一个领导实例执行相应控制循环。领导信息可通过 Lease 对象观察:

kubectl get leases -n kube-system

备用实例主要用于故障接替,简单增加实例数通常不会让同一控制循环按实例数成倍加速。组件职责见官方组件说明。云环境还可能运行 cloud-controller-manager,用于连接云负载均衡、节点和路由等接口。

kubeadm 如何运行这些组件

kubeadm 默认把 API server、scheduler、controller manager,以及本地 etcd 配置为静态 Pod。kubelet 配置中的 staticPodPath: /etc/kubernetes/manifests 指定了清单目录;kubelet 直接监视其中的清单并启动组件,不依赖 API server 先创建这些 Pod。

这个字段在 kubelet 的配置文件中,而不是每份静态 Pod 的 YAML 中。不要把备份清单也放进该监视目录,否则 kubelet 可能尝试加载它们。外部 etcd 或托管控制平面会采用不同部署方式。

工作节点:让 Pod 真正运行起来

kubelet 与容器运行时

kubelet 是节点代理,负责观察分配给本节点的 Pod,协调容器运行、卷挂载、探针以及状态上报。它通过 CRI 与 containerd、CRI-O 等运行时交互;运行时通常在创建 Pod sandbox 时协调 CNI 配置网络。CSI 驱动及其节点组件参与卷的挂载,控制器侧组件则可能负责供应和附加卷。

这种分工使 Kubernetes 不必直接实现每一种容器运行时、网络和存储系统。containerd 的具体调用链可结合 24-k8s基础-容器运行时-containerd.md 理解。

kube-proxy 与 Service 转发

kube-proxy 观察 Service 和 EndpointSlice 等资源,在节点上维护转发规则,让访问 Service 的流量到达后端 Pod。具体实现可能采用 iptables、IPVS 或 nftables,取决于集群版本与配置。它不是所有外部流量的唯一入口,也不负责创建或维护 EndpointSlice 对象。

有些网络方案可以替代其数据转发功能。例如启用并正确配置 Cilium 的 kube-proxy replacement 后,可以不再运行 kube-proxy;仅安装某个 CNI,并不自动意味着已经完成替代。

CoreDNS 与 Calico 等插件

CoreDNS 为集群提供 DNS 解析。普通 Service 名称通常解析到 Service IP,Headless Service 则可返回后端 Pod 地址;外部域名可转发给上游 DNS。

Calico 是一种网络方案,可为 Pod 分配 IP,并通过路由或封装等方式实现跨节点通信。实际数据路径受所选模式影响,不能把所有 Calico 集群都等同于同一种 Linux 转发配置。控制平面节点通常也有 kubelet 和运行时,是否运行 kube-proxy、网络插件和普通业务 Pod,取决于集群架构与污点配置。

一次 Deployment 请求经过哪些组件

理解职责后,可以把一次应用部署连接起来:

  1. 用户通过 kubectl 提交 Deployment,API server 完成认证、授权、准入与校验,将对象保存到 etcd。
  2. Deployment 控制器观察对象,创建或调整 ReplicaSet;ReplicaSet 控制器创建缺少的 Pod。这些对象也通过 API server 持久化。
  3. scheduler 观察未调度的 Pod,为其选择节点,并提交绑定结果。
  4. 目标节点的 kubelet 观察到 Pod,协调存储,通过 CRI 调用运行时创建 sandbox 与容器,并上报状态。
  5. 配置了 Service 时,EndpointSlice 控制器根据选择器及 Pod 状态维护后端记录;kube-proxy 或替代实现据此更新转发规则。

Kubernetes 集群组件与工作节点

这些步骤由不同控制循环异步完成。kubectl apply 返回成功,只代表 API 已接受对象,还需要观察调度、镜像拉取、就绪探针与应用本身是否正常。

用 API 资源表达应用

Pod 与控制器

Pod 是 Kubernetes 创建和调度的最小单元,可以包含一个或多个紧密协作的容器。它们共享网络空间,并能通过声明的卷共享文件。容器在原 Pod 中重启时,Pod 的身份可以保持不变;Pod 被删除后再创建,才是具有新 UID 的另一个对象。

直接创建的 Pod 没有上层工作负载控制器负责补副本。Deployment 等控制器创建的 Pod 被删除后,在控制器仍需要该副本的前提下会补建。标签与选择器负责匹配,ownerReferences 记录对象的所有权,不能只凭标签断定一个 Pod 归谁管理。

资源管理重点常见用途
ReplicaSet维持所需副本数通常由 Deployment 管理,不直接承担滚动升级编排
Deployment管理 ReplicaSet 与版本发布无状态服务的扩缩容、滚动升级和回滚
StatefulSet稳定身份、顺序和存储关联需要固定序号与独立持久卷的有状态应用
DaemonSet每个符合条件节点一份 Pod节点日志、网络和监控代理
Job跟踪有限任务的成功完成一次性脚本、数据处理、备份
CronJob按计划创建 Job定期备份、清理和报表
HPA依据指标调整可扩缩目标的副本数自动调整 Deployment 等资源的容量

围绕 Pod 的 Kubernetes 资源关系

服务、配置、存储和命名空间

Service 为一组后端提供稳定访问入口,EndpointSlice 记录后端地址;Endpoints 是历史接口,新设计应关注 EndpointSlice。Ingress 表达 HTTP/HTTPS 入口路由,需要 Ingress 控制器实现,Gateway API 则提供另一套网关资源模型。集群内部服务调用常被称为东西向流量,从外部进入应用的访问常被称为南北向流量。

ConfigMap 保存普通配置,Secret 保存需要受控访问的数据;Secret 的 Base64 编码不等于加密。PV 描述可用持久存储,PVC 表达应用的存储申请。

Namespace 提供资源名称与管理边界,大部分应用资源都属于命名空间。Pod 不能直接挂载另一命名空间的 ConfigMap,但跨命名空间网络访问通常默认可行;API 是否允许读取其他命名空间对象,取决于调用者身份与 RBAC。需要网络隔离时,还应配置受网络插件支持的 NetworkPolicy。

用 kubectl 查找资源类型

kubectl 通过 kubeconfig 找到 API server,并获取访问所需身份。kubeadm 管理员常在控制平面上使用 /etc/kubernetes/admin.conf,也可以把授权的 kubeconfig 放在 $HOME/.kube/config。admin.conf 具有很高权限,不应作为所有用户通用的配置分发;普通用户应领取与职责匹配的凭据。

kubectl config current-context
kubectl api-resources

kubectl api-resources 可以查询资源名称、缩写、API 组以及是否属于命名空间。集群安装 CRD 后还会出现新的资源类型,因此本机输出比记忆固定清单更可靠。

资源分类资源名称缩写资源作用
集群级别资源nodesno集群组成部分
namespacesns管理命名空间边界
pod资源podspo装载容器
pod资源控制器replicationcontrollersrc控制pod资源
replicasetsrs控制pod资源
deploymentsdeploy控制pod资源
daemonsetsds控制pod资源
jobs控制pod资源
cronjobscj控制pod资源
horizontalpodautoscalershpa控制pod资源
statefulsetssts控制pod资源
服务发现资源servicessvc服务访问或入口规则
ingressing服务访问或入口规则
存储资源volumeattachments存储
persistentvolumespv存储
persistentvolumeclaimspvc存储
配置资源configmapscm配置
secrets配置