尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Kubernetes (K8s) 资源清单(Resource Manifest)详细说明

Kubernetes (K8s) 资源清单(Resource Manifest)详细说明 Kubernetes 资源清单完全指南从 Pod 到 Deployment HPA 实战本教程带你从零掌握 Kubernetes 资源清单Resource Manifest的编写涵盖核心字段详解、完整注释的 Nginx Pod 实战、kubectl 四步操作流程、生产环境避坑指南以及 Deployment HPA 自动扩缩容进阶内容。学完即可编写生产级 K8s 配置。目录什么是资源清单核心字段详解实战案例完整注释的 Nginx Podkubectl 四步使用流程生产环境避坑指南进阶Deployment HPA 自动扩缩容总结与下一步一、什么是资源清单在 Kubernetes 中资源清单Resource Manifest是一个 YAML 或 JSON 格式的文件用于描述 Kubernetes 对象如 Pod、Service、Deployment的期望状态Desired State。核心思想声明式 API你告诉 K8s“我想要 3 个 Nginx 副本每个分配 128Mi 内存”K8s 自动实现控制平面Control Plane会持续监控集群努力让实际状态与期望状态保持一致自动修复如果某个 Pod 挂了K8s 会自动重建无需人工干预类比理解就像你给餐厅下单期望状态厨师K8s负责做菜创建资源服务员Controller确保菜品的数量和质量符合订单要求。二、核心字段详解2.1 顶层必须存在的属性这是每个 K8s 资源清单文件的骨架缺一不可。字段名类型含义与用法示例apiVersionStringAPI 版本。告诉 K8s 使用哪个版本的 API 定义v1Pod/Service、apps/v1Deployment、autoscaling/v2HPAkindString资源类型。要创建什么对象Pod、Service、Deployment、ConfigMapmetadataObject元数据。对象的身份信息name、namespace、labelsspecObject规格/期望状态。详细描述对象的样子容器配置、副本数、网络策略等查看可用 API 版本kubectl api-versions2.2 容器定义spec.containers[]Pod 是容器的集合spec.containers是一个列表定义具体运行的容器。字段名含义与用法示例name容器在 Pod 内的唯一标识nginx-containerimageDocker 镜像地址nginx:1.25.3imagePullPolicy镜像拉取策略Always/Never/IfNotPresentIfNotPresentcommand覆盖镜像默认的 ENTRYPOINT[/bin/sh]args覆盖镜像默认的 CMD[-c, echo hello]workingDir容器启动时的工作目录/app2.3 存储卷挂载spec.containers[].volumeMounts[]容器数据默认是临时的需要持久化或共享数据时挂载存储卷。字段名含义与用法示例name卷名称必须与spec.volumes中定义的一致html-contentmountPath容器内的挂载路径/usr/share/nginx/htmlreadOnly是否只读true/falsetrue2.4 端口配置spec.containers[].ports[]定义容器对外暴露的网络端口。字段名含义与用法示例containerPort容器内部进程监听的端口80hostPort映射到宿主机的端口不推荐建议用 Service8080protocol协议TCP默认/ UDPTCP⚠️注意hostPort会限制 Pod 只能调度到该端口未被占用的节点通常不建议使用。2.5 环境变量spec.containers[].env[]向容器注入配置信息避免硬编码。env:-name:DATABASE_URLvalue:mysql://db.example.com:3306-name:LOG_LEVELvalueFrom:configMapKeyRef:# 也可以从 ConfigMap 或 Secret 引用name:app-configkey:log-level2.6 资源限制与请求spec.containers[].resources生产环境必配防止容器耗尽节点资源。字段名含义超限后果limits资源上限内存超限容器被杀OOMKilledCPU 超限被节流requests调度保底资源节点剩余资源不足时Pod 无法调度Pending单位说明CPU100m 0.1 核1 1 核内存128Mi 128 Mebibyte推荐128M 128 Megabyte2.7 Pod 级别策略spec下直接字段字段名含义与用法restartPolicy重启策略Always默认/OnFailure/NevernodeSelector节点选择器强制调度到特定标签的节点imagePullSecrets私有仓库的认证 SecrethostNetwork是否使用宿主机网络默认 false谨慎开启三、实战案例完整注释的 Nginx Pod3.1 场景说明部署一个 Nginx Web 服务器要求使用特定版本镜像避免latest不确定性限制资源使用防止撑爆节点挂载存储卷注入网页内容显式声明端口、环境变量与拉取策略3.2 nginx-pod.yaml 完整文件逐字段注释# # 1. apiVersion: API 版本# Pod 属于核心资源组使用 v1# apiVersion:v1# # 2. kind: 资源类型# Pod 是 K8s 最小部署单元# kind:Pod# # 3. metadata: 元数据对象的身份证# metadata:# name: Pod 的唯一标识同一 Namespace 下不能重名name:nginx-web-server# namespace: 命名空间用于资源隔离# default 是默认命名空间生产环境建议用专门的 namespacenamespace:default# labels: 标签非常重要# Service 选择器、监控、日志收集都依赖标签labels:app:nginx# 应用名称tier:frontend# 层级env:production# 环境# # 4. spec: 规格说明书Pod 的长相# spec:# ---------- Pod 级别策略 ----------# restartPolicy: 重启策略# Always (默认): 容器挂了无限重启适合长期运行的服务# OnFailure: 只有异常退出才重启适合批处理任务# Never: 挂了不重启restartPolicy:Always# nodeSelector: 节点选择器# 强制 Pod 只能调度到拥有 disktypessd 标签的节点# 如果没有匹配的节点Pod 会一直处于 Pending 状态nodeSelector:disktype:ssd# hostNetwork: 主机网络模式# 默认 false使用 K8s 虚拟网络Pod 有独立 IP# 设为 true 则直接使用宿主机 IP容易端口冲突需谨慎hostNetwork:false# imagePullSecrets: 私有仓库认证# 如果镜像在私有仓库Harbor、阿里云 ACR 等# 需要先创建 Secret 并在这里引用# imagePullSecrets:# - name: my-registry-secret# ---------- 容器列表 ----------containers:# 容器名Pod 内唯一小写字母、数字或连字符-name:nginx-container# 镜像地址# 强烈建议使用具体版本号不要用 latestimage:nginx:1.25.3# 镜像拉取策略# IfNotPresent: 本地有就用本地没有才拉取推荐# Always: 每次都拉取适合开发调试# Never: 只用本地镜像imagePullPolicy:IfNotPresent# ---------- 端口配置 ----------ports:-name:http-port# 端口名称方便 Service 引用containerPort:80# 容器内监听端口protocol:TCP# 协议-name:https-portcontainerPort:443protocol:TCP# ---------- 资源限制生产必配 ----------resources:# requests: 调度依据保底资源# 调度器会找剩余资源 requests 的节点requests:cpu:100m# 0.1 核 CPUmemory:64Mi# 64 MiB 内存# limits: 硬上限limits:cpu:500m# 最多 0.5 核超过被节流memory:128Mi# 最多 128 MiB超过被 OOMKilled# ---------- 环境变量 ----------env:-name:NGINX_HOSTvalue:www.example.com-name:LOG_LEVELvalue:info# 工作目录workingDir:/usr/share/nginx/html# ---------- 存储挂载 ----------volumeMounts:-name:html-content# 必须与 volumes 中的 name 对应mountPath:/usr/share/nginx/html# 容器内路径readOnly:true# 只读挂载# ---------- 卷定义 ----------volumes:-name:html-content# emptyDir: 临时目录Pod 删除后数据消失# 适合缓存持久化请用 persistentVolumeClaim (PVC)emptyDir:{}3.3 关键字段速查表字段作用本案例取值设计考量apiVersionAPI 版本v1Pod 属于核心资源组kind资源类型Pod最小部署单元metadata.name对象名称nginx-web-serverNamespace 内唯一metadata.labels标签app/tier/env供 Service、监控检索restartPolicy重启策略AlwaysWeb 服务需常驻nodeSelector节点选择器disktype: ssd定向调度image镜像nginx:1.25.3固定版本可预期imagePullPolicy拉取策略IfNotPresent快且稳ports端口声明80/443便于 Service 引用resources.requests保底资源100m/64Mi调度依据resources.limits资源上限500m/128Mi防止资源耗尽env环境变量NGINX_HOST 等配置解耦volumeMounts存储挂载/usr/share/nginx/html注入内容volumes卷定义emptyDir演示用生产用 PVC四、kubectl 四步使用流程第一步创建资源applykubectl apply-fnginx-pod.yaml输出示例pod/nginx-web-server createdapply是声明式命令资源不存在则创建已存在则更新。第二步查看状态get# 查看 Pod 状态-o wide 显示 IP 和所在节点kubectl get pods-owide# 查看详细信息事件、配置、挂载等kubectl describe pod nginx-web-server# 实时监控状态变化kubectl get pods-w期望输出NAME READY STATUS RESTARTS AGE IP NODE nginx-web-server 1/1 Running 0 30s 10.244.1.5 node-1第三步进入容器验证exec# 进入容器终端kubectlexec-itnginx-web-server -- /bin/bash# 容器内验证环境变量echo$NGINX_HOST# 输出: www.example.com# 查看挂载点df-h|grepnginx# 测试 Nginxcurllocalhost# 退出容器exit第四步清理资源delete# 删除资源kubectl delete-fnginx-pod.yaml# 验证已删除kubectl get pods五、生产环境避坑指南5.1 必须设置 resources.limits.memory为什么不设内存上限应用可能无限占用内存导致整个节点 OOM同节点的其他 Pod 也会被连累关键区别资源类型超限后果内存容器被直接杀掉OOMKilledPod 重启CPU被节流变慢但不会被杀单位注意Mi Mebibyte1024×1024K8s 推荐M Megabyte1000×1000易混淆5.2 谨慎使用 hostNetwork: true风险失去 K8s 网络隔离保护端口冲突概率大增同一节点无法启动多个副本适用场景网络插件Calico、Flannel特殊监控采集Node Exporter需要固定 IP 的传统应用5.3 显式写明 imagePullPolicy默认行为陷阱tag 为latest→ 默认Always每次都拉取tag 为具体版本 → 默认IfNotPresent最佳实践image:nginx:1.25.3# 固定版本imagePullPolicy:IfNotPresent# 显式声明好处启动更快省去拉取时间行为可预期不受仓库更新影响排查问题方便版本明确5.4 其他实用建议使用标签规范统一使用app.kubernetes.io/name等推荐标签配置探针添加livenessProbe和readinessProbe确保服务健康使用 ConfigMap将配置与镜像解耦不同环境用不同 ConfigMap设置 securityContext以非 root 用户运行容器提升安全性六、进阶Deployment HPA 自动扩缩容6.1 为什么要从 Pod 升级到 Deployment特性PodDeployment生命周期挂了就挂了自动重建保持期望副本数扩缩容手动改 yaml配合 HPA 全自动更新方式先删后建有停机滚动更新零中断自我修复无节点故障自动迁移适用场景学习测试生产环境标准6.2 nginx-deployment.yaml# Deployment 属于 apps/v1 组apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentlabels:app:nginxspec:# # 副本数初始 2 个HPA 会动态调整# replicas:2# # 选择器告诉 Deployment 管理哪些 Pod# 必须与 template.metadata.labels 匹配# selector:matchLabels:app:nginx# # Pod 模板定义 Pod 的具体配置# template:metadata:labels:app:nginxversion:v1spec:containers:-name:nginximage:nginx:1.25.3imagePullPolicy:IfNotPresentports:-containerPort:80name:http# # 资源限制HPA 的基础必须配置# resources:requests:cpu:100mmemory:128Milimits:cpu:500mmemory:256Mi# 健康检查推荐配置livenessProbe:httpGet:path:/port:80initialDelaySeconds:10periodSeconds:10readinessProbe:httpGet:path:/port:80initialDelaySeconds:5periodSeconds:56.3 nginx-hpa.yaml# HPA 使用 autoscaling/v2支持更丰富的指标apiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:nginx-hpaspec:# # 关联目标 Deployment# scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:nginx-deployment# # 扩缩容范围# minReplicas:2# 最少 2 个副本高可用maxReplicas:10# 最多 10 个控制成本# # 触发规则# metrics:-type:Resourceresource:name:cputarget:type:UtilizationaverageUtilization:60# CPU 平均使用率超 60% 触发扩容6.4 部署与验证# 1. 部署应用kubectl apply-fnginx-deployment.yaml# 2. 部署 HPAkubectl apply-fnginx-hpa.yaml# 3. 查看 HPA 状态kubectl get hpa nginx-hpa-w输出示例NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS nginx-hpa Deployment/nginx-deployment 45%/60% 2 10 26.5 模拟高负载测试# 方法一进入 Pod 执行 CPU 密集型命令kubectlexec-itpod-name--ddif/dev/zeroof/dev/null# 方法二使用压测工具kubectl run load-generator--imagebusybox -- /bin/sh-cwhile true; do wget -q -O- http://nginx-service; done观察 HPA 自动扩容kubectl get hpa-w# REPLICAS 列会从 2 逐渐增加到更多七、总结与下一步7.1 核心要点回顾资源清单三要素apiVersionkindmetadata/specPod 是最小单元但生产环境应该用 Deployment 管理资源限制必配requests保证调度limits防止资源耗尽HPA 三要素Deployment 资源限制 HPA 规则7.2 学习路径建议Pod → Deployment → Service → Ingress → ConfigMap/Secret → StatefulSet → Operator7.3 下一步要让外部用户真正访问到服务还需要Service为 Pod 提供稳定的访问入口ClusterIP/NodePort/LoadBalancerIngress统一管理外部 HTTP/HTTPS 访问支持域名路由ConfigMap管理配置实现配置与代码分离Secret管理敏感信息密码、Token、证书7.4 实用命令速查# 查看所有资源kubectl get all-nnamespace# 查看资源定义kubectl explain pod.spec.containers# 查看资源 YAMLkubectl get podname-oyaml# 实时监控kubectl get pods-w# 查看事件kubectl get events --sort-by.lastTimestamp# 查看日志kubectl logs-fpod-name参考资料Kubernetes 官方文档kubectl 命令参考Kubernetes API 参考
返回列表