从零搞懂 Kubernetes架构剖析 YAML 实战 常用命令速查写在前面本文基于 Kubernetes v1.36代号 Haru编写适用于 v1.30 版本集群。文中所有示例均经过实测验证可直接复制使用。一、为什么需要 Kubernetes在容器化时代Docker 解决了应用打包的问题但当规模从几个容器膨胀到成百上千个时运维噩梦才刚刚开始痛点具体场景规模管理手动docker run启动 200 个容器不现实故障自愈容器崩溃后谁来自动拉起滚动更新如何做到零停机发布新版本、出问题秒级回滚负载均衡请求怎么均匀分发到后端多个实例资源调度哪个节点剩余资源最多哪个节点最适合跑这个服务Kubernetes简称 K8s正是为解决上述问题而生的容器编排平台。它的核心价值可以浓缩为四句话声明式管理—— 你只管写我想要什么K8s 负责把现实掰到你想要的样子自动化运维—— 调度、部署、伸缩、自愈全程无需人工干预解耦架构—— 应用逻辑与底层基础设施彻底分离上云下云随意迁移生态可扩展—— 通过 CRD、Operator、Webhook 等机制无限延伸能力边界二、K8s 集群架构全景图K8s 采用经典的控制平面Control Plane 工作节点Worker Node分层架构。控制平面是大脑工作节点是手脚两者通过 API Server 紧密协作。下面逐一拆解每个组件的职责这是面试高频考点建议熟记。2.1 控制平面四大核心 kube-apiserver —— 集群唯一入口暴露 REST API是所有内部和外部通信的唯一通道所有组件kubectl、kubelet、控制器等都必须通过它来读写集群状态无状态设计可以水平扩展多实例负责认证Authentication、授权Authorization、准入控制Admission Control唯一与 etcd 直接对话的组件安全边界非常清晰记忆技巧把 API Server 想象成公司前台——所有访客请求都必须先登记由前台统一转达。 etcd —— 集群唯一真相源高可用的分布式键值存储基于 Raft 共识算法保证强一致性持久化存储所有集群数据Pod、Service、ConfigMap、Secret 等一切对象的配置和状态生产环境建议部署3 / 5 / 7节点的 etcd 集群以保证高可用只有 API Server 能直接访问 etcd简化了安全模型和一致性保证⚠️血的教训etcd 数据务必定期备份它是整个集群的命根子丢了就全完了。 kube-scheduler —— 智能调度器监听 API Server发现未被调度的新 Pod采用“过滤 → 评分”两阶段算法为 Pod 挑选最优 Node考虑因素包括资源需求CPU、内存的 Request 和 Limit亲和性规则NodeSelector、NodeAffinity、PodAffinity/AntiAffinity数据局部性优先调度到已有相关数据的节点干扰度Disruption避免把高负载 Pod 堆到同一节点只做决策不负责执行——实际拉起容器是 kubelet 的活 kube-controller-manager —— 自动驾驶系统运行一系列控制循环Control Loop不断将实际状态向期望状态靠拢每个控制器逻辑上独立但编译为单个二进制文件、运行在一个进程中核心控制器一览控制器职责Node Controller监控节点健康宕机时标记并驱逐 PodReplicaSet Controller确保指定数量的 Pod 副本始终运行Endpoints Controller维护 Service 与 Pod 的映射关系ServiceAccount Controller为新命名空间创建默认账户和 TokenDeployment Controller管理滚动更新和回滚2.2 工作节点三大组件 kubelet —— 节点上的工头与控制平面通信的节点代理监听 API Server 下发的指令管理本节点 Pod 的完整生命周期通过CRI容器运行时接口调用底层运行时拉镜像、启容器定期向 API Server上报节点和 Pod 的状态执行存活探针LivenessProbe和就绪探针ReadinessProbe⚠️ 只管理 K8s 创建的容器不管野生容器 kube-proxy —— 网络代理与负载均衡维护节点上的网络规则实现 Service 的流量转发支持三种模式iptables默认利用内核 netfilter 规则性能不错ipvs推荐基于内核 L4 负载均衡性能更优支持更多算法userspace已废弃早期方案性能差类比就像公司电话总机把打进来的外部电话请求转接到正确的分机Pod Container Runtime —— 容器的真正执行者负责下载镜像、解压、运行容器K8s 通过CRI 标准接口对接多种运行时不绑定某一种常见选择containerd当前主流轻量高效CRI-O专为 K8s 设计极简主义Docker Engine已废弃内置支持内部仍用 containerd三、PodK8s 的最小调度单元3.1 什么是 PodPod 是 K8s 中最小的可部署计算单元。可以把 Pod 理解为一个逻辑主机——它封装了一个或多个应用容器共享的存储卷Volume独立的网络 IP管理容器运行方式的策略关键特性K8s 调度的最小单位是 Pod不是容器Pod 内的容器共享网络命名空间同一 IP、可 localhost 通信Pod 内的容器共享存储卷Pod 内的容器同生共死生命周期一致3.2 单容器 vs 多容器 Pod单容器 Pod最常见一个 Pod 只跑一个应用容器Pod 就是这个容器的壳。多容器 PodSidecar 模式当多个容器需要紧密协作时使用。典型场景日志收集主容器跑业务Sidecar 容器负责采集日志并推送到 ELK服务网格主容器跑应用Sidecar如 Envoy处理流量劫持和治理适配器模式主容器输出非标准格式Sidecar 做格式转换经验法则如果容器之间不需要共享网络/存储就拆成独立 Pod如果必须 localhost 通信或共享文件才放同一个 Pod。四、YAML 资源清单文件详解K8s 的声明式管理依赖 YAML 文件来描述期望状态。一个标准的资源清单包含四个根字段apiVersion:apps/v1# API 版本不同资源对应不同版本kind:Deployment# 资源类型metadata:# 元数据名称、标签、命名空间等name:my-appnamespace:productionspec:# 期望状态核心配置区replicas:3# ... 具体配置因资源类型而异# status: # 当前状态由 K8s 自动维护用户不写4.1 各字段说明字段说明apiVersionAPI 版本号可用kubectl api-resources查看所有资源对应的版本kind资源种类如 Pod、Deployment、Service、ConfigMap、Ingress 等metadata资源的身份标识name必填、namespace默认 default、labels 等spec资源的期望状态描述不同 kind 结构完全不同4.2 一个完整的 Deployment 示例apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentlabels:app:nginxspec:replicas:3selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginx-containerimage:nginx:1.25ports:-containerPort:80env:-name:ENV_VAR_NAMEvalue:productionresources:requests:memory:64Micpu:250mlimits:memory:128Micpu:500mlivenessProbe:httpGet:path:/port:80initialDelaySeconds:5periodSeconds:10readinessProbe:httpGet:path:/port:80initialDelaySeconds:5periodSeconds:10volumes:-name:config-volumeconfigMap:name:nginx-config4.3 探针机制重点探针类型作用失败后果LivenessProbe检测容器是否存活杀死容器并重启ReadinessProbe检测容器是否就绪从 Service 后端摘除不接收流量StartupProbe检测慢启动应用是否就绪在成功前不会执行 liveness 检查三种探针都支持httpGet、tcpSocket、exec三种检测方式。五、kubectl 常用命令速查表kubectl 命令的通用语法kubectl[command][TYPE][NAME][flags]5.1 资源查看类# 查看所有 Pod默认命名空间kubectl get pods# 查看所有命名空间的 Podkubectl get pods-Akubectl get pods --all-namespaces# 查看指定命名空间的服务kubectl get svc-nnamespace# 查看所有 Deploymentkubectl get deployments# 宽格式输出含节点信息kubectl get pods-owide# 查看节点状态kubectl get nodes# 以 YAML 格式导出资源定义常用于备份kubectl get podpod-name-oyaml# 动态监听资源变化类似 tail -fkubectl get pods-w5.2 资源详情与诊断# 查看 Pod 详细信息含事件、IP、状态kubectl describe podpod-name# 查看 Node 详细信息kubectl describenodenode-name# 查看 Deployment 详情kubectl describe deploymentdeployment-name5.3 创建 / 更新 / 删除# 从 YAML 文件创建资源首次创建用kubectl create-fmanifest.yaml# 创建或更新资源声明式推荐日常使用kubectl apply-fmanifest.yaml# 从 URL 直接创建kubectl apply-fhttps://example.com/manifest.yaml# 删除 YAML 定义的资源kubectl delete-fmanifest.yaml# 删除指定 Podkubectl delete podpod-name# 强制删除卡在 Terminating 的 Podkubectl delete podpod-name--force--grace-period0# 删除命名空间下所有 Podkubectl delete pods--all-nnamespace5.4 日志与调试排障利器# 查看 Pod 日志kubectl logspod-name# 多容器 Pod 中查看指定容器日志kubectl logspod-name-ccontainer-name# 实时跟踪日志类似 tail -fkubectl logs-fpod-name# 查看上一次崩溃的日志排障超有用kubectl logs-ppod-name# 进入 Pod 交互式终端kubectlexec-itpod-name-- /bin/bash# 多容器 Pod 中进入指定容器kubectlexec-itpod-name-ccontainer-name-- /bin/sh# 不进入交互模式直接执行命令kubectlexecpod-name--ls/app5.5 端口转发# 本地 8080 → Pod 80kubectl port-forwardpod-name8080:80# 本地 8080 → Service 80kubectl port-forward service/service-name8080:80# 后台运行kubectl port-forwardpod-name8080:805.6 辅助命令# 查看所有资源类型及其 API 版本kubectl api-resources# 查看 YAML 字段含义官方文档内嵌超好用kubectl explain pod.spec.containers# 查看集群信息kubectl cluster-info# 切换命名空间避免每次 -nkubectl config set-context--current--namespacetest-dev六、实战从零部署一个 Nginx 服务理论讲完动手才是王道。下面演示如何在本地 K8s 环境Minikube / Kind / Docker Desktop 均可部署一套完整的 Nginx 服务。6.1 创建命名空间# 01-namespace.yamlapiVersion:v1kind:Namespacemetadata:name:web-demo6.2 创建 Deployment# 02-deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploynamespace:web-demolabels:app:nginxspec:replicas:3selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.25ports:-containerPort:80resources:requests:memory:64Micpu:50mlimits:memory:128Micpu:100mlivenessProbe:httpGet:path:/port:80initialDelaySeconds:30periodSeconds:10readinessProbe:httpGet:path:/port:80initialDelaySeconds:5periodSeconds:56.3 创建 Service 暴露服务# 03-service.yamlapiVersion:v1kind:Servicemetadata:name:nginx-svcnamespace:web-demospec:selector:app:nginxports:-protocol:TCPport:80targetPort:80type:ClusterIP6.4 一键部署 验证# 依次创建资源kubectl apply-f01-namespace.yaml kubectl apply-f02-deployment.yaml kubectl apply-f03-service.yaml# 也可以用 --- 分隔符合并到一个文件一条命令搞定kubectl apply-fall-in-one.yaml# 查看部署进度kubectl get pods-nweb-demo-w# 查看 Service 详情和端口映射kubectl get svc-nweb-demo# 进入 Pod 内部验证kubectlexec-it-nweb-demopod-name-- /bin/bash# 查看 Pod 日志kubectl logs-nweb-demopod-name# 端口转发到本地浏览器访问验证kubectl port-forward-nweb-demo svc/nginx-svc8080:80# 浏览器打开 http://127.0.0.1:8080 即可看到 Nginx 欢迎页6.5 合并版 YAML一个文件搞定# all-in-one.yamlapiVersion:v1kind:Namespacemetadata:name:web-demo---apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploynamespace:web-demolabels:app:nginxspec:replicas:3selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.25ports:-containerPort:80resources:requests:memory:64Micpu:50mlimits:memory:128Micpu:100mlivenessProbe:httpGet:path:/port:80initialDelaySeconds:30periodSeconds:10readinessProbe:httpGet:path:/port:80initialDelaySeconds:5periodSeconds:5---apiVersion:v1kind:Servicemetadata:name:nginx-svcnamespace:web-demospec:selector:app:nginxports:-protocol:TCPport:80targetPort:80type:ClusterIP 使用---分隔符可以在一个 YAML 文件中定义多个资源K8s 会按顺序依次创建。七、排障思路总结当 Pod 出现异常时推荐按以下顺序排查kubectl get pods → 看状态Pending? CrashLoopBackOff? kubectl describe pod pod-name → 看事件镜像拉取失败调度失败 kubectl logs pod-name → 看应用日志 kubectl logs -p pod-name → 看上一次崩溃日志 kubectl exec -it pod-name -- sh → 进容器排查 kubectl get events -n ns → 看命名空间级别事件八、学习建议先跑通再理解用 Minikube 或 Kind 在本地搭一套单节点集群把本文所有命令敲一遍善用kubectl explain这是内置的官方文档比翻网页快得多从 Pod → Deployment → Service的顺序逐步学习不要一上来就搞 Ingress Istio多看官方文档kubernetes.io 的中文文档质量已经很高了参考资源Kubernetes 官方文档https://kubernetes.io/zh-cn/docs/Kubernetes v1.36 Release Noteskubectl api-resources/kubectl explain命令输出