5月27日 23:39

什么是 Kubernetes?Kubernetes 的核心概念和架构是什么?

Kubernetes(简称 K8s)是 Google 开源、CNCF 维护的容器编排平台,负责容器化应用的自动化部署、弹性伸缩和故障自愈。理解它的核心概念和架构,是所有云原生面试的起点。

核心概念

Pod——K8s 最小调度单元

Pod 是 K8s 中最小的部署和调度单元,包含一个或多个共享网络/存储的容器。为什么不是容器?因为 K8s 需要一个抽象层来管理容器的生命周期——重启策略、存储挂载、网络标识都挂在 Pod 上,容器只是其中的运行实体。

同一个 Pod 内的容器共享 network namespace(同一 IP 和端口空间)和 volumes,适合 sidecar 模式(如日志采集容器与业务容器同 Pod)。Pod 生命周期短暂,IP 会随重建变化,这就是 Service 存在的原因。

Service——稳定的访问入口

Service 为一组 Pod 提供固定的 ClusterIP 和 DNS 名,屏蔽 Pod IP 的动态变化。请求经过 kube-proxy 生成的 iptables/ipvs 规则,被负载均衡到后端 Pod。

四种 Service 类型:

  • ClusterIP:集群内部访问(默认),适合微服务间调用
  • NodePort:在节点上开放端口,适合临时外部访问或调试
  • LoadBalancer:对接云厂商负载均衡器,生产环境对外暴露首选
  • ExternalName:映射到外部 DNS,用于集群内引用外部服务

Deployment——无状态应用管理

Deployment 通过 ReplicaSet 管理 Pod 副本数,核心能力是声明式管理和滚动更新。修改 replicas 或镜像版本后,K8s 自动完成扩缩容或灰度替换,出问题一键回滚。

有状态应用不能用 Deployment,要用 StatefulSet(稳定网络标识 + 有序部署/终止);定时任务用 CronJob;守护进程用 DaemonSet。

ConfigMap 与 Secret

ConfigMap 存非敏感配置,Secret 存密码/证书等敏感数据(base64 编码,需配合 RBAC 控制访问)。两者都通过环境变量或 Volume 挂载注入 Pod,实现配置与镜像解耦。

Namespace——资源隔离

Namespace 将集群划分为逻辑隔离区(如 dev/staging/prod),配合 ResourceQuota 和 LimitRange 实现多租户资源管控。注意:Namespace 不隔离网络,跨 Namespace 通信需要 NetworkPolicy。

架构

K8s 采用 Master-Worker 分层架构,Master 负责决策,Worker 负责执行。

控制平面(Master)

kube-apiserver:集群唯一入口,所有组件交互都通过 REST API 经由它完成。提供认证(谁在访问)、授权(能做什么)、准入控制(请求是否合规)三级安全机制。

etcd:分布式 KV 存储,保存集群所有状态数据。它是 K8s 的"大脑",etcd 不可用 = 集群瘫痪。生产环境必须部署奇数节点(3/5/7)保证 Raft 协议的多数派选举。

kube-scheduler:为未调度的 Pod 选择最优 Node。调度分两步——过滤(不符合资源/亲和性要求的 Node 淘汰)和打分(剩余 Node 按策略排序,选最高分)。

kube-controller-manager:运行各类控制器,持续将实际状态向期望状态收敛。核心控制器包括 Deployment Controller、ReplicaSet Controller、Node Controller 等。

工作节点(Worker)

kubelet:节点上的"代理人",从 apiserver 获取 Pod 规格,调用容器运行时创建/停止容器,并上报节点和 Pod 状态。它不接收 Master 的直接指令,而是通过 Watch 机制获取期望状态后自行执行。

kube-proxy:维护节点上的网络规则,实现 Service 到 Pod 的流量转发。模式有 iptables(默认,规则链式匹配)和 ipvs(内核级负载均衡,大规模集群性能更优)。

容器运行时:实际运行容器的组件(containerd、CRI-O 等),通过 CRI 接口与 kubelet 对接。注意:K8s 1.24 已移除 dockershim,Docker 不再是原生支持运行时,需通过 cri-dockerd 适配。

面试追问预判

Q:Pod 的 Container 和 Init Container 有什么区别? Init Container 在主容器启动前串行执行,完成初始化任务(如等待依赖服务就绪、下载配置)后退出,主容器才启动。主容器并行运行,Init Container 串行且必须全部成功。

Q:etcd 挂了集群还能用吗? 不能创建/更新资源(读写依赖 etcd),但已运行的 Pod 不受影响——kubelet 和 kube-proxy 是本地自治的。这就是 K8s 的"控制面与数据面分离"设计:Master 故障不波及已部署工作负载。

Q:Service 和 Ingress 的区别? Service 是四层(TCP/UDP)负载均衡,Ingress 是七层(HTTP/HTTPS)路由。需要按域名/路径分流到不同 Service 时用 Ingress;纯 TCP 转发用 Service。

掌握以上概念和架构,足以应对 K8s 核心知识层面的面试考察。进阶方向:网络模型(CNI)、存储体系(PV/PVC/StorageClass)、安全机制(RBAC/ServiceAccount)、调度策略(亲和性/污点容忍)。

标签:Devops