Kubernetes 核心资源字段讲解与实战案例

Kubernetes 核心资源字段讲解与实战案例

面向:Kubernetes 入门、日常运维、交付部署与故障排查。整理日期:2026-10-27。

本文讲常用稳定 API 和高频字段,不罗列全部 API。示例为学习案例,镜像标签仅为示范,不代表生产版本推荐;实际使用应替换为可访问、经过验证的镜像,生产建议固定摘要。未连接集群,未执行部署与业务验证。版本支持最终以目标集群的 kubectl explain 和服务端校验为准。

目录

  1. 先看资源全景与关系
  2. YAML 公共字段与字段查询
  3. Namespace:命名空间
  4. Pod:容器运行的基本单位
  5. Deployment 与 ReplicaSet
  6. StatefulSet:稳定身份与持久存储
  7. DaemonSet:节点级常驻任务
  8. Job 与 CronJob
  9. HPA:水平自动扩缩容
  10. PV、PVC 与 StorageClass
  11. Service、DNS 与 EndpointSlice
  12. Ingress 与 Gateway API
  13. ConfigMap 与 Secret
  14. 必须补充的运行与治理知识
  15. 贯通实验与验收
  16. 故障定位速查
  17. 学习顺序与官方资料

1. 先看资源全景与关系

Kubernetes 的核心工作方式:你声明期望状态,控制器持续尝试让实际状态接近期望状态。创建资源成功,只表示 API 接受了配置,不代表应用已经可用。

资源 常用简称 常用 API 作用域 主要用途
Namespace ns v1 集群 按环境、团队划分资源名称范围
Pod po v1 命名空间 运行一个或多个紧密协作的容器
Deployment deploy apps/v1 命名空间 管理可替换的应用副本、滚动更新
ReplicaSet rs apps/v1 命名空间 维持匹配标签的 Pod 数量
StatefulSet sts apps/v1 命名空间 管理稳定名称、身份和存储的 Pod
DaemonSet ds apps/v1 命名空间 在符合条件的节点运行守护 Pod
Job job batch/v1 命名空间 执行到完成的一次性任务
CronJob cj batch/v1 命名空间 按时间计划创建 Job
HorizontalPodAutoscaler hpa autoscaling/v2 命名空间 按指标调整目标工作负载副本数
PersistentVolume pv v1 集群 表示可供绑定的持久存储
PersistentVolumeClaim pvc v1 命名空间 应用对持久存储的申请
StorageClass sc storage.k8s.io/v1 集群 定义动态供给存储的方式
Service svc v1 命名空间 为一组后端提供稳定访问入口
EndpointSlice — discovery.k8s.io/v1 命名空间 表示 Service 后端地址与状态
Ingress ing networking.k8s.io/v1 命名空间 HTTP/HTTPS 域名和路径路由
ConfigMap cm v1 命名空间 非敏感配置
Secret secret v1 命名空间 凭据、证书等敏感配置
ServiceAccount sa v1 命名空间 Pod 访问 API 时使用的身份
Role / RoleBinding — rbac.authorization.k8s.io/v1 命名空间 命名空间内授权
ClusterRole / ClusterRoleBinding — rbac.authorization.k8s.io/v1 集群 可复用权限规则与集群范围授权
NetworkPolicy netpol networking.k8s.io/v1 命名空间 控制 Pod 网络访问
ResourceQuota / LimitRange quota / limits v1 命名空间 总配额、默认资源和上下限
PodDisruptionBudget pdb policy/v1 命名空间 约束自愿驱逐时的可用副本
Node no v1 集群 工作节点的状态与可调度资源
Namespace
 ├─ Deployment → ReplicaSet → Pod
 ├─ StatefulSet → Pod → PVC → PV → 实际存储
 ├─ DaemonSet → 各符合条件节点上的 Pod
 ├─ CronJob → Job → Pod
 ├─ HPA → 调整 Deployment / StatefulSet 等目标的副本数
 ├─ Service → EndpointSlice → 后端 Pod 地址
 ├─ Ingress → Service → Pod
 └─ ConfigMap / Secret / ServiceAccount → 被 Pod 引用

箭头不全部表示所有权:例如 Service 按标签选择 Pod,并不创建或拥有 Pod;PVC 与 PV 是绑定关系。Pod 模板的入口统一记为 spec.template,但 CronJob 要多经过一层 spec.jobTemplate.spec.template。

2. YAML 公共字段与字段查询

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: k8s-notes
  labels:
    app: web
  annotations:
    description: "学习示例"
spec:
  replicas: 2
  # 具体字段依 kind 而定;此片段不是完整 Deployment
字段 含义 运维重点
apiVersion API 组及版本 核心组直接写 v1,其他如 apps/v1
kind 资源种类 使用单数且大小写准确,如 DaemonSet
metadata.name 资源名 同资源类型、同命名空间内唯一
metadata.namespace 所属命名空间 集群级资源不填;Namespace 自身也不填
metadata.labels 用于筛选的标签 Service、控制器、策略靠它关联对象
metadata.annotations 附加信息 控制器扩展配置、说明等,语义取决于使用方
metadata.ownerReferences 所有者引用 排查“删了又出现”与级联删除
metadata.finalizers 删除前清理标记 资源 Terminating 时检查,不能盲目移除
spec 期望配置 通常是声明式管理的主体
status 观察到的实际状态 通常由系统写入,不从导出的 YAML 原样回填

ConfigMap、Secret 主要配置在顶层 data 等字段,并不是每种资源都使用 spec。

# 先确认当前集群与命名空间
kubectl config current-context
kubectl version
kubectl api-resources
kubectl api-resources --namespaced=false
kubectl api-versions

# 直接向目标集群查询字段,比背诵全部 YAML 更实用
kubectl explain deployment --api-version=apps/v1
kubectl explain deployment.spec.strategy --api-version=apps/v1
kubectl explain pod.spec.containers.resources
kubectl explain statefulset.spec.volumeClaimTemplates
kubectl explain cronjob.spec.timeZone --api-version=batch/v1
kubectl explain hpa.spec --api-version=autoscaling/v2

# 读取实际状态;包含 Secret 的输出不要随意分享
kubectl get deployment web -n k8s-notes -o yaml
kubectl describe deployment web -n k8s-notes

YAML 使用空格缩进。containers、ports 等是列表,前面有 -;环境变量值和类似 "80" 的字符串建议加引号。command 类似覆盖镜像 ENTRYPOINT,args 类似覆盖 CMD;不会自动运行 shell,只有显式使用 sh -c 才处理管道、变量等 shell 语法。

参考:Kubernetes API。

3. Namespace:命名空间

apiVersion: v1
kind: Namespace
metadata:
  name: k8s-notes
  labels:
    environment: learning

资源名例如 web 可以同时存在于不同 Namespace。Namespace 本身不会自动阻止网络互通,也不会自动施加 CPU、内存配额;应结合 RBAC、NetworkPolicy、ResourceQuota。

kubectl get ns
kubectl get pods -n k8s-notes
kubectl get pods -A
# 修改当前上下文的默认命名空间,会影响之后不带 -n 的命令
kubectl config set-context --current --namespace=k8s-notes

常见系统命名空间包括 default、kube-system、kube-public、kube-node-lease。不要在不清楚用途时修改系统资源。删除命名空间会连带删除其中资源,不能作为普通排错手段。

参考:Namespaces。

4. Pod:容器运行的基本单位

同一 Pod 内容器共享网络,可通过 localhost 通信;通过显式挂载同一个 volume 共享文件。Pod 重建通常产生新 UID、新 IP;容器重启和 Pod 重建是不同事件。

4.1 常用字段路径

字段(省略 spec 前缀) 含义 / 案例
containers[].name / image 容器名称与镜像
containers[].imagePullPolicy Always / IfNotPresent / Never
containers[].command / args 启动命令与参数
containers[].ports[].containerPort 声明容器端口;不会让程序自动监听,也不会自动暴露到外部
containers[].env / envFrom 逐项或批量注入环境变量
containers[].resources requests 与 limits
containers[].volumeMounts 容器内挂载点,name 对应 volumes 的 name
volumes Pod 使用的卷来源:emptyDir、configMap、secret、PVC 等
initContainers 常规初始化容器顺序成功结束后再启动应用容器
restartPolicy Always / OnFailure / Never;Deployment 等要求 Always
terminationGracePeriodSeconds 退出宽限期,默认通常为 30 秒
serviceAccountName 运行身份
imagePullSecrets 镜像仓库凭据,引用同命名空间 Secret
nodeSelector / affinity 节点与 Pod 放置约束
tolerations 容忍节点污点;不保证一定调度到该节点
securityContext Pod 或容器安全配置,具体字段位置不同
dnsPolicy DNS 策略,常见 ClusterFirst
hostNetwork 是否共享节点网络,端口冲突和暴露面需单独考虑

4.2 可独立学习的 Pod 示例

apiVersion: v1
kind: Pod
metadata:
  name: toolbox
  namespace: k8s-notes
  labels:
    app: toolbox
spec:
  restartPolicy: Always
  terminationGracePeriodSeconds: 20
  automountServiceAccountToken: false
  initContainers:
    - name: init-file
      image: busybox:1.36
      command: ["sh", "-c", "echo initialized > /work/status.txt"]
      volumeMounts:
        - name: work
          mountPath: /work
  containers:
    - name: toolbox
      image: busybox:1.36
      command: ["sh", "-c", "cat /work/status.txt; sleep 3600"]
      env:
        - name: APP_MODE
          value: "learning"
      resources:
        requests:
          cpu: 50m
          memory: 32Mi
        limits:
          cpu: 200m
          memory: 64Mi
      volumeMounts:
        - name: work
          mountPath: /work
  volumes:
    - name: work
      emptyDir: {}

emptyDir 能跨同一个 Pod 内的容器重启保留数据,但 Pod 被删除或移离节点后不能依赖其数据保留。长期服务通常用控制器管理,而不是直接创建裸 Pod。

4.3 requests、limits 与 QoS

配置 作用 常见误解
requests.cpu 调度时的 CPU 请求,运行时也影响争用权重 不是实时 CPU 使用量
requests.memory 调度时的内存请求 不是“预先锁死一块内存”
limits.cpu CPU 使用上限,通常通过节流实现 超限通常不是直接 OOM
limits.memory 内存上限 超限可能被 OOM kill
ephemeral-storage 容器可写层、日志等本地临时存储请求与上限 与 PVC 存储容量不同

1000m CPU = 1 CPU;512Mi 是内存单位,别把内存误写为 512m。调度看 requests 和节点可分配资源,不是只看 kubectl top 当前是否空闲。

常见按容器声明资源的配置下:所有容器 CPU/内存 request 与 limit 均齐全且相等,可得到 Guaranteed;全部不声明一般是 BestEffort;其余通常为 Burstable。QoS 影响资源压力下的行为,但不是“Guaranteed 永不被驱逐”的承诺。新版本的 Pod 级资源等能力需单独查目标版本。

参考:资源管理。

4.4 三种探针

探针 问题 失败后的主要行为
startupProbe 程序是否完成启动? 达到失败阈值后终止容器,再依据重启策略处理
readinessProbe 现在能否接收请求? 标记未就绪,通常从 Service 可接流量后端中排除
livenessProbe 程序是否卡死且需要重启? 达到失败阈值后终止容器,再依据重启策略处理
字段 意义
httpGet / tcpSocket / exec / grpc 探测方式,支持情况与应用协议需匹配
initialDelaySeconds 初始延迟
periodSeconds 探测周期
timeoutSeconds 单次超时
failureThreshold 连续失败阈值
successThreshold 连续成功阈值;startup/liveness 必须为 1

有 startupProbe 时,startup 成功前不会执行 readiness/liveness 探测。readiness 失败本身不触发容器重启。不要把数据库暂时不可达直接设为所有实例的 liveness 失败条件,容易造成集体重启。

参考:探针配置。

5. Deployment 与 ReplicaSet

Deployment 用于管理可替换的副本,如 Web、API。ReplicaSet 负责副本数量,Deployment 在其上管理版本更新;日常修改 Deployment,避免手工修改它管理的 ReplicaSet 或 Pod。

5.1 核心字段

spec 字段 作用
replicas 期望副本数;配置 HPA 后应明确谁负责管理此字段
selector.matchLabels 筛选属于该工作负载的 Pod,创建后不能直接修改
template.metadata.labels 新建 Pod 的标签,必须匹配 selector
template.spec PodSpec,容器、卷、调度和探针写在这里
strategy.type RollingUpdate 或 Recreate
strategy.rollingUpdate.maxSurge 更新时允许额外创建多少 Pod
strategy.rollingUpdate.maxUnavailable 更新时允许多少期望副本不可用
minReadySeconds 新 Pod 持续 Ready 多久才计为 Available
progressDeadlineSeconds 多久没有发布进展则报告超时条件,不会自动回滚
revisionHistoryLimit 保留多少旧 ReplicaSet 供回滚
paused 暂停 Deployment 发布处理

5.2 完整案例:带资源限制和探针的 Web

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: k8s-notes
spec:
  replicas: 2
  revisionHistoryLimit: 3
  minReadySeconds: 5
  progressDeadlineSeconds: 600
  selector:
    matchLabels:
      app: web
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: web
    spec:
      automountServiceAccountToken: false
      terminationGracePeriodSeconds: 30
      containers:
        - name: nginx
          image: nginx:1.28
          ports:
            - name: http
              containerPort: 80
          resources:
            requests:
              cpu: 100m
              memory: 64Mi
            limits:
              cpu: 500m
              memory: 128Mi
          startupProbe:
            httpGet:
              path: /
              port: http
            periodSeconds: 2
            failureThreshold: 30
          readinessProbe:
            httpGet:
              path: /
              port: http
            periodSeconds: 5
            timeoutSeconds: 2
            failureThreshold: 3
          livenessProbe:
            httpGet:
              path: /
              port: http
            periodSeconds: 10
            timeoutSeconds: 2
            failureThreshold: 3

这里更新时可临时多 1 个 Pod,目标是保持 2 个可用副本,但需要额外资源、镜像拉取与新实例健康。正在退出的 Pod 可能让观察到的总数短时更高。

maxSurge 百分比向上取整,maxUnavailable 百分比向下取整;两者不能同时为 0。仅改 Deployment 自身的 metadata.labels 不会触发 Pod 模板更新。

kubectl get deploy,rs,pods -n k8s-notes -l app=web
kubectl rollout status deployment/web -n k8s-notes --timeout=120s
kubectl rollout history deployment/web -n k8s-notes
# 以下为实际变更命令,仅在自己的实验资源上执行
kubectl rollout restart deployment/web -n k8s-notes
kubectl rollout undo deployment/web -n k8s-notes

回滚主要恢复 Pod 模板版本,不会自动恢复外部数据库、ConfigMap 内容和存储数据。参考:Deployments。

6. StatefulSet:稳定身份与持久存储

适合需要稳定身份、固定卷关联的应用。StatefulSet 不自动完成数据库主从复制、选主或备份;“3 个数据库 Pod”不等于“数据库高可用”。

spec 字段 作用
serviceName 管理网络身份的 Service 名,一般使用 Headless Service
replicas / selector / template 副本数、标签选择器、Pod 模板
podManagementPolicy OrderedReady 默认有序;Parallel 放宽扩缩容的顺序约束
updateStrategy.type RollingUpdate 默认;OnDelete 等待手动删除 Pod 才使用新模板
updateStrategy.rollingUpdate.partition 序号低于 partition 的 Pod 暂不按新模板滚动更新
volumeClaimTemplates 为各 Pod 分别创建 PVC 的模板
persistentVolumeClaimRetentionPolicy 控制缩容/删除时 PVC 保留行为,版本支持需确认

案例:两个独立持久化站点

前提:已存在可动态供给的 StorageClass lab-storage,请替换为实际名称。这不是数据库集群案例。

apiVersion: v1
kind: Service
metadata:
  name: site-headless
  namespace: k8s-notes
spec:
  clusterIP: None
  selector:
    app: site
  ports:
    - name: http
      port: 80
      targetPort: http
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: site
  namespace: k8s-notes
spec:
  serviceName: site-headless
  replicas: 2
  podManagementPolicy: OrderedReady
  selector:
    matchLabels:
      app: site
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: site
    spec:
      automountServiceAccountToken: false
      initContainers:
        - name: prepare-index
          image: busybox:1.36
          command:
            - sh
            - -c
            - 'test -f /data/index.html || echo "created by $HOSTNAME" > /data/index.html'
          volumeMounts:
            - name: data
              mountPath: /data
      containers:
        - name: nginx
          image: nginx:1.28
          ports:
            - name: http
              containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            requests:
              cpu: 100m
              memory: 64Mi
            limits:
              cpu: 500m
              memory: 128Mi
          volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ReadWriteOnce]
        storageClassName: lab-storage
        resources:
          requests:
            storage: 1Gi

预期名称:Pod 为 site-0、site-1;PVC 为 data-site-0、data-site-1。默认集群域 cluster.local 时,单个 Pod DNS 类似 site-0.site-headless.k8s-notes.svc.cluster.local。DNS 发布受就绪状态等影响。

默认通常保留 PVC,缩容或删除 StatefulSet 后要检查实际保留策略;PV 是否删除还取决于回收策略。不要把删除 Pod、删除 PVC 和清理存储数据混为一谈。

参考:StatefulSets。

7. DaemonSet:节点级常驻任务

典型用途是日志代理、节点监控、CNI/CSI 节点组件。目标是在每个符合条件的节点放一个 Pod,不设置 replicas;更新期间可因更新策略存在临时变化。

spec 字段 作用
selector / template 标签选择器与 Pod 模板
updateStrategy.type RollingUpdate / OnDelete
updateStrategy.rollingUpdate.maxUnavailable 更新时允许不可用数量
minReadySeconds 计为可用之前需要保持 Ready 的时间
template.spec.nodeSelector / affinity 限定节点范围
template.spec.tolerations 允许进入带特定污点的节点
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-demo
  namespace: k8s-notes
spec:
  selector:
    matchLabels:
      app: node-demo
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: node-demo
    spec:
      automountServiceAccountToken: false
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: demo
          image: busybox:1.36
          command: ["sh", "-c", "while true; do date; sleep 30; done"]
          resources:
            requests:
              cpu: 10m
              memory: 16Mi
            limits:
              cpu: 100m
              memory: 32Mi

这只是调度演示,不具备日志采集能力。控制平面节点常有污点,上例不会自动容忍所有控制平面污点。

kubectl get ds node-demo -n k8s-notes
kubectl get pods -n k8s-notes -l app=node-demo -o wide
kubectl describe ds node-demo -n k8s-notes

重点看 DESIRED、CURRENT、READY、AVAILABLE 是否符合预期节点范围。参考:DaemonSet。

8. Job 与 CronJob

8.1 Job:执行到成功完成

spec 字段 作用
completions 目标成功完成次数
parallelism 允许的并行执行数量
backoffLimit 失败重试上限;并非简单等同于 Pod 总数
activeDeadlineSeconds Job 活跃运行总时限,优先于重试次数限制
ttlSecondsAfterFinished 完成或失败后等待多久自动清理 Job 及关联对象
template.spec.restartPolicy 常规 Job 使用 Never 或 OnFailure
suspend 暂停 Job,具体恢复行为查看目标版本
apiVersion: batch/v1
kind: Job
metadata:
  name: batch-demo
  namespace: k8s-notes
spec:
  completions: 3
  parallelism: 2
  backoffLimit: 2
  activeDeadlineSeconds: 120
  ttlSecondsAfterFinished: 3600
  template:
    spec:
      automountServiceAccountToken: false
      restartPolicy: Never
      containers:
        - name: worker
          image: busybox:1.36
          command: ["sh", "-c", "echo task-start; sleep 5; echo task-done"]

这里执行同一个命令直至累计 3 次成功,最多并行 2 个。业务分片需要 Indexed Job、队列或应用自行分工。任务可能因重试等原因重复执行,应设计幂等性。

Never 时失败容器不在原 Pod 内重启,Job 可创建新 Pod;OnFailure 时容器可在原 Pod 内重启,因此排障还要看 restartCount。

kubectl get jobs,pods -n k8s-notes
kubectl logs -n k8s-notes -l job-name=batch-demo --all-containers=true --prefix=true
kubectl wait --for=condition=complete job/batch-demo -n k8s-notes --timeout=150s

参考:Jobs。

8.2 CronJob:按计划创建 Job

spec 字段 作用
schedule 五段 cron 表达式:分 时 日 月 周
timeZone 明确时区,Kubernetes 1.27 起为稳定能力
concurrencyPolicy Allow / Forbid / Replace;只约束同一 CronJob 创建的 Job
startingDeadlineSeconds 错过计划时间后允许补启动的期限
successfulJobsHistoryLimit 保留多少成功 Job
failedJobsHistoryLimit 保留多少失败 Job
suspend 暂停后续调度,已经启动的 Job 不因此自动停止
jobTemplate.spec 每次创建的 Job 配置
apiVersion: batch/v1
kind: CronJob
metadata:
  name: scheduled-demo
  namespace: k8s-notes
spec:
  schedule: "*/5 * * * *"
  timeZone: Asia/Shanghai
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 120
  successfulJobsHistoryLimit: 2
  failedJobsHistoryLimit: 3
  suspend: false
  jobTemplate:
    spec:
      backoffLimit: 1
      activeDeadlineSeconds: 180
      template:
        spec:
          automountServiceAccountToken: false
          restartPolicy: Never
          containers:
            - name: task
              image: busybox:1.36
              command: ["sh", "-c", "date; echo scheduled-task"]

Forbid 表示上次未结束时跳过本次并发启动,不是保证排队补跑。CronJob 不提供严格 exactly-once 执行语义,扣款、发消息、备份等需业务幂等。修改 jobTemplate 不会改写已经创建的 Job。

参考:CronJob。

9. HPA:水平自动扩缩容

HPA 改的是目标资源副本数,不是单个容器的 CPU/内存配额,也不会自动增加节点。常见前提是 Metrics Server/资源指标 API 正常;自定义指标需要对应 adapter。

spec 字段 作用
scaleTargetRef 目标 apiVersion、kind、name,通常与 HPA 同命名空间
minReplicas / maxReplicas 最小、最大副本数
metrics[].type Resource / ContainerResource / Pods / Object / External 等
metrics[].resource.name cpu 或 memory
target.type Utilization / AverageValue / Value,需符合指标类型
target.averageUtilization 相对 requests 的平均使用率百分比
behavior.scaleUp / scaleDown 扩缩容窗口、速率等行为
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web
  namespace: k8s-notes
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 2
  maxReplicas: 6
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300

若单个容器 CPU request 为 100m,使用 60m 就是其 request 的 60%,不是节点总 CPU 的 60%。存在多个容器时要考虑全部相关容器的 requests 和使用量。

近似理解:期望副本 ≈ ceil(当前副本 × 当前指标 / 目标指标);实际还受容差、指标缺失、未就绪实例、扩缩速率和上下限影响。

kubectl top pods -n k8s-notes
kubectl get hpa web -n k8s-notes
kubectl describe hpa web -n k8s-notes
kubectl get apiservice v1beta1.metrics.k8s.io

<unknown> 先检查指标服务、资源 requests 和事件。HPA 与反复 apply 固定 replicas 可能相互覆盖;采用 HPA 后应在发布管理中明确副本字段所有权。扩容后 Pod Pending,还要检查节点容量和调度约束。

参考:Horizontal Pod Autoscaling。

10. PV、PVC 与 StorageClass

先记关系:应用在同命名空间引用 PVC;PVC 绑定集群级 PV;PV 描述实际存储。StorageClass 让 provisioner 根据 PVC 动态创建存储和 PV。

10.1 常用字段

资源 字段 含义
PV spec.capacity.storage 声明容量;后端是否强制容量限制取决于存储实现
PV spec.accessModes 支持的访问模式
PV spec.volumeMode Filesystem 或 Block
PV spec.persistentVolumeReclaimPolicy Retain / Delete;回收行为依后端实现
PV spec.storageClassName 所属存储类名
PV spec.csi / nfs / local 存储来源;local PV 还必须配置节点亲和性
PV spec.nodeAffinity 卷的节点/拓扑限制
PVC spec.resources.requests.storage 申请容量
PVC spec.accessModes / volumeMode 请求访问模式与卷模式
PVC spec.storageClassName 请求的存储类;省略可使用默认类,空字符串禁用默认类分配
PVC spec.volumeName 指定绑定的 PV 名,常用于静态预绑定
PVC spec.selector 选择 PV;可能限制动态供给,勿随意混用
StorageClass provisioner 存储驱动名,顶层字段
StorageClass parameters 驱动参数,不能照搬其他驱动
StorageClass reclaimPolicy 动态 PV 回收策略,未指定通常默认 Delete
StorageClass volumeBindingMode Immediate / WaitForFirstConsumer
StorageClass allowVolumeExpansion 是否允许扩容,还需要驱动与文件系统支持
访问模式 意义 注意
ReadWriteOnce / RWO 单个节点读写 同节点可能被多个 Pod 使用;不等于单 Pod
ReadOnlyMany / ROX 多节点只读 需要后端支持,不能替代完整权限控制
ReadWriteMany / RWX 多节点读写 常见于共享文件存储,需驱动支持
ReadWriteOncePod / RWOP 单个 Pod 读写 CSI 卷及相关版本/组件必须支持

10.2 静态 NFS 案例:PV + PVC + 消费 Pod

这是有环境依赖的模板:把 192.0.2.10 替换为可达 NFS 地址,把路径替换为真实导出。需已配置 NFS 服务、节点挂载依赖、网络和目录权限;声明 PV 不会创建 NFS 服务。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: lab-nfs-pv
spec:
  capacity:
    storage: 5Gi
  accessModes: [ReadWriteMany]
  volumeMode: Filesystem
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ""
  nfs:
    server: 192.0.2.10
    path: /exports/k8s-notes
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-data
  namespace: k8s-notes
spec:
  accessModes: [ReadWriteMany]
  volumeMode: Filesystem
  storageClassName: ""
  volumeName: lab-nfs-pv
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: storage-demo
  namespace: k8s-notes
spec:
  automountServiceAccountToken: false
  containers:
    - name: reader
      image: busybox:1.36
      command: ["sh", "-c", "ls -la /data; sleep 3600"]
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: shared-data

NFS 示例中的 5Gi 通常是 Kubernetes 绑定依据,不保证服务端目录自动有 5Gi 硬配额。一个 PV 通常与一个 PVC 一对一绑定,多个 Pod 通过同一个 PVC 共享。

10.3 动态 PVC 案例

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-data
  namespace: k8s-notes
spec:
  storageClassName: lab-storage
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 5Gi

前提:替换存储类名并确认 provisioner 正常。WaitForFirstConsumer 下,PVC 在没有消费 Pod 前 Pending 可能正常。扩容通常增加 PVC 请求容量,不能通过缩小请求实现缩容;是否在线完成取决于驱动。

kubectl get sc
kubectl get pvc -n k8s-notes
kubectl get pv
kubectl describe pvc dynamic-data -n k8s-notes
kubectl describe pod storage-demo -n k8s-notes

排查分三层:PVC 是否 Bound → 卷是否 Attach/Mount 成功 → 应用 UID/GID、权限与读写是否正常。Bound 不等于挂载成功,挂载成功也不等于数据和业务正常。Retain 后的 Released PV 需要人工确认数据归属和回收流程,不能直接当空盘复用。

参考:Persistent Volumes、Storage。

11. Service、DNS 与 EndpointSlice

11.1 字段与端口关系

spec 字段 作用
selector 按标签选择同命名空间 Pod,值需与 Pod 标签对应
type ClusterIP / NodePort / LoadBalancer / ExternalName
ports[].port Service 暴露的端口
ports[].targetPort 后端实际端口或 Pod 中定义的端口名
ports[].nodePort NodePort 类型的节点端口,范围由集群配置决定
ports[].protocol TCP / UDP / SCTP,支持情况取决于环境
clusterIP Service 虚拟 IP;None 表示 Headless
externalTrafficPolicy 外部流量策略,Cluster / Local
sessionAffinity 会话亲和,可选 ClientIP
apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: k8s-notes
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
    - name: http
      port: 80
      targetPort: http

这里客户端请求 Service 的 80 端口,转到 Pod 名为 http 的端口,即前文 nginx 的 80。containerPort 只是声明信息,最终必须有进程实际监听。

类型 使用场景 前提 / 限制
ClusterIP 集群内服务发现 外部通常不能直接访问该虚拟 IP
NodePort 经节点地址与端口访问 节点网络、防火墙、地址可达性需满足
LoadBalancer 获取外部负载均衡入口 需要云或裸金属 LB 实现,不是写上就一定有外部 IP
ExternalName DNS 别名 返回 CNAME,不代理 TCP 流量,不使用普通 selector 方式
Headless 直接发现后端地址 clusterIP: None,不提供普通 Service 虚拟 IP

默认集群域下可访问 web.k8s-notes.svc.cluster.local;同命名空间通常用 web 即可。集群域可能被定制。

kubectl get svc web -n k8s-notes
kubectl get endpointslices -n k8s-notes -l kubernetes.io/service-name=web -o yaml
kubectl get pods -n k8s-notes -l app=web --show-labels
# toolbox 镜像包含 wget/nslookup 时可直接验证
kubectl exec -n k8s-notes toolbox -- nslookup web.k8s-notes.svc.cluster.local
kubectl exec -n k8s-notes toolbox -- wget -qO- http://web

Service 存在但后端为空:优先检查 selector、Pod 标签、Ready 条件。跨节点失败再看 CNI、Service 数据面、NetworkPolicy 和节点网络。

参考:Service。

12. Ingress 与 Gateway API

Ingress 主要表达 HTTP/HTTPS 的 host/path 路由。需要实际安装的 Ingress Controller 和匹配的 IngressClass;仅创建 Ingress 对象不会凭空出现入口代理。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  namespace: k8s-notes
spec:
  ingressClassName: lab-ingress
  rules:
    - host: web.example.test
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80
字段 说明
spec.ingressClassName 替换为实际 IngressClass
rules[].host 请求 Host 域名;DNS 应指向入口地址
paths[].path / pathType 路径与匹配方式:Exact / Prefix / ImplementationSpecific
backend.service 同命名空间后端 Service 名称和 Service 端口
spec.tls[].hosts / secretName HTTPS 域名与同命名空间 TLS Secret,需有效证书

Prefix 按路径段匹配,不是任意字符串前缀。rewrite、超时等 annotation 依控制器而异,不能跨实现照搬。

Ingress API 已冻结但仍可用。Gateway API 值得补充学习:GatewayClass 定义实现,Gateway 表达入口,HTTPRoute 等表达路由;通常需要额外 CRD 与控制器,不属于安装 Kubernetes 就一定具备的核心内置资源。

参考:Ingress。

13. ConfigMap 与 Secret

资源/字段 作用
ConfigMap.data UTF-8 字符串配置
ConfigMap.binaryData base64 编码的二进制数据
Secret.type Opaque、kubernetes.io/tls、kubernetes.io/dockerconfigjson 等
Secret.data base64 编码的数据;base64 不是加密
Secret.stringData 用明文字符串提交,由 API 转为 data
immutable 禁止修改数据,更新时需使用新对象等方式
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: k8s-notes
data:
  APP_MODE: "learning"
  app.conf: |
    log_level=info
    timeout=5
---
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
  namespace: k8s-notes
type: Opaque
stringData:
  API_TOKEN: "EXAMPLE_ONLY_REPLACE_ME"

下面是 Pod 或 Deployment 的 PodSpec 下配置片段,不能单独 apply:

containers:
  - name: app
    image: busybox:1.36
    command: ["sh", "-c", "sleep 3600"]
    env:
      - name: APP_MODE
        valueFrom:
          configMapKeyRef:
            name: app-config
            key: APP_MODE
      - name: API_TOKEN
        valueFrom:
          secretKeyRef:
            name: app-secret
            key: API_TOKEN
    volumeMounts:
      - name: config
        mountPath: /etc/app
        readOnly: true
volumes:
  - name: config
    configMap:
      name: app-config
      items:
        - key: app.conf
          path: app.conf

环境变量注入的值不会随配置修改自动刷新,需要重建容器。普通卷投射可最终更新,应用仍要支持重新读取;subPath 挂载不接收这类自动更新。

真实 Secret 不应直接写入公开 Git、报告或聊天;需要最小 RBAC、存储加密与合适的密钥管理。能读 Secret 或能在相应权限范围创建 Pod,可能获得敏感数据,不能只看名称是否“隐藏”。

参考:ConfigMaps、Secret 使用建议。

14. 必须补充的运行与治理知识

14.1 标签、选择器与所有权:资源关联的基础

Deployment.spec.selector.matchLabels.app = web
Deployment.spec.template.metadata.labels.app = web
Service.spec.selector.app = web

三者值应一致,但含义不同:控制器 selector 判定管理对象;模板 labels 标记 Pod;Service selector 判定流量后端。一个 Namespace 中不同控制器要避免使用重叠 selector。

kubectl get pod -n k8s-notes --show-labels
kubectl get pod -n k8s-notes -l app=web
kubectl get pod -n k8s-notes -l app=web -o jsonpath='{range .items[*]}{.metadata.name}{" => "}{.metadata.ownerReferences[*].kind}{"/"}{.metadata.ownerReferences[*].name}{"\n"}{end}'

14.2 调度:nodeSelector、亲和性、污点与拓扑分散

机制 功能 典型误区
nodeSelector 节点标签必须全部满足 标签不存在会 Pending
nodeAffinity.required… 硬性节点亲和条件 多条件逻辑需看表达式与 term 的层次
nodeAffinity.preferred… 偏好某类节点 不是强制保证
podAffinity / podAntiAffinity 靠近或分散特定 Pod 硬性规则可能让扩容无处可放
taints / tolerations 节点排斥与 Pod 容忍 容忍不表示主动选择节点
topologySpreadConstraints 按节点/可用区分散副本 标签、拓扑域与副本数量需匹配
nodeName 直接指定节点 绕过调度器,不适合作为通用调度手段

PodSpec 片段,需要节点具有 workload=general 标签;如节点另有污点,还要满足其他限制:

nodeSelector:
  workload: general
tolerations:
  - key: dedicated
    operator: Equal
    value: learning
    effect: NoSchedule
topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: ScheduleAnyway
    labelSelector:
      matchLabels:
        app: web

NoSchedule 主要阻止新调度;PreferNoSchedule 为偏好性限制;NoExecute 还可能驱逐不能容忍的现有 Pod。调度可用性要同时满足资源、标签、污点、拓扑和卷约束。

kubectl get nodes -o wide
kubectl get nodes --show-labels
kubectl describe node NODE_NAME
kubectl describe pod POD_NAME -n k8s-notes

参考:Assigning Pods to Nodes。

14.3 ServiceAccount 与 RBAC:身份、权限和绑定

ServiceAccount 是“谁”,Role 是“可以做什么”,RoleBinding 是“把权限授给谁”。ClusterRole 可以通过 RoleBinding 限定在某命名空间使用,ClusterRoleBinding 则是集群范围绑定。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-reader
  namespace: k8s-notes
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: k8s-notes
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader
  namespace: k8s-notes
subjects:
  - kind: ServiceAccount
    name: pod-reader
    namespace: k8s-notes
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pod-reader

Pod 通过 spec.serviceAccountName: pod-reader 使用该身份。普通应用不访问 Kubernetes API 时,可设置 automountServiceAccountToken: false。新式令牌通常通过投射卷获取,不应假设创建 ServiceAccount 后自动生成长期 Secret token。

# 执行者需有相应 impersonate 权限,否则该检查可能被拒绝
kubectl auth can-i list pods -n k8s-notes --as=system:serviceaccount:k8s-notes:pod-reader
kubectl auth can-i delete pods -n k8s-notes --as=system:serviceaccount:k8s-notes:pod-reader

参考:RBAC。

14.4 NetworkPolicy:网络流量访问规则

前提:网络插件实际支持并实施 NetworkPolicy。未被策略隔离的 Pod,在对应方向通常默认允许;多个匹配策略的允许规则相加。目的 Pod 入站和源 Pod 出站都需要允许。

下面仅允许同命名空间 app=toolbox 的 Pod 访问 app=web 的 TCP 80,其他入站将受到限制;没有限制 web 的出站。这会影响前面 Ingress 的访问,不要在贯通基础实验中直接混用。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-ingress
  namespace: k8s-notes
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes: [Ingress]
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: toolbox
      ports:
        - protocol: TCP
          port: 80

顶层 podSelector 选被保护的 Pod,规则内 from 选允许的来源。podSelector: {} 在顶层表示选中本命名空间全部 Pod。

同一条 peer 内同时出现 namespaceSelector 与 podSelector 是 AND;列表中的两条独立 peer 是 OR。限制 Egress 时要考虑 DNS UDP/TCP 53、依赖服务和外部系统。仅资源创建成功不能证明策略已生效,应验证允许与拒绝两种流量。

参考:Network Policies。

14.5 ResourceQuota 与 LimitRange:总量和单体约束

apiVersion: v1
kind: ResourceQuota
metadata:
  name: learning-quota
  namespace: k8s-notes
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "30"
    requests.storage: 50Gi
---
apiVersion: v1
kind: LimitRange
metadata:
  name: container-defaults
  namespace: k8s-notes
spec:
  limits:
    - type: Container
      defaultRequest:
        cpu: 100m
        memory: 64Mi
      default:
        cpu: 500m
        memory: 256Mi

Quota 控制命名空间资源总量;LimitRange 可设置每容器/Pod/PVC 的默认值和上下限,上例只演示容器默认值。它们不增加节点容量。设置 CPU/内存配额后,缺少必要 request/limit 且未被默认补齐的 Pod 可能被拒绝;Deployment 本身成功,但创建 Pod 可能在 ReplicaSet 事件里报错。

这些属于治理扩展实验,先评估所有示例的累计需求再启用。

参考:Resource Quotas。

14.6 PodDisruptionBudget:节点维护时保留服务能力

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web
  namespace: k8s-notes
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: web

minAvailable 与 maxUnavailable 二选一。PDB 主要约束通过 Eviction API 的自愿中断,例如正常 drain;不防机器突然宕机,也不直接限制 Deployment 自身滚动更新。直接删除 Pod 也不能指望 PDB 拦截。

kubectl get pdb web -n k8s-notes
kubectl describe pdb web -n k8s-notes

ALLOWED DISRUPTIONS 为 0 时,维护驱逐可能被阻塞,需要先确认副本健康、容量和预算。参考:Disruptions。

14.7 securityContext 与优雅退出

适合支持非 root 运行的镜像的容器安全片段,不能不经验证直接套到依赖 root/写系统目录的镜像:

securityContext:
  runAsNonRoot: true
  runAsUser: 10001
  allowPrivilegeEscalation: false
  readOnlyRootFilesystem: true
  capabilities:
    drop: [ALL]
  seccompProfile:
    type: RuntimeDefault

这是容器级片段,写在 containers[] 下;fsGroup 等则放在 Pod 级 spec.securityContext。只读根文件系统下,应用缓存、临时目录可能需要独立可写卷。还应了解 Namespace 的 Pod Security Admission 标签,它会按策略拒绝不合规 Pod。

优雅退出需要应用正确处理 SIGTERM、停止接新请求并完成在途工作。preStop 执行会消耗退出宽限期,超时可能被强制终止;加一个 sleep 不等于已实现可靠排空。

14.8 运维必须理解的组件和扩展

概念 为什么必须知道
kube-apiserver / etcd API 接入与集群状态存储;etcd 备份不等于应用卷数据备份
scheduler / controller-manager 调度与控制循环,解释 Pending 与副本重建
kubelet / 容器运行时 节点实际拉镜像、启动容器、挂载卷与探测
CNI Pod 网络、跨节点通信,部分实现执行 NetworkPolicy
CSI 存储供给、挂载与扩容;不正常会导致 PVC/挂载故障
CoreDNS Service 名称解析,影响集群内部依赖
kube-proxy 或替代数据面 Service 转发,不同集群实现可能不同
Metrics Server / 监控系统 top 与 HPA 指标、历史监控和告警
CRD / Operator 扩展 API 与自动化运维;自定义资源并非所有集群都有
Helm / Kustomize 组织与生成部署清单,仍需看最终渲染的 YAML
PriorityClass / ResourceQuota 资源竞争下的优先级和配额,需结合抢占策略学习

15. 贯通实验与验收

15.1 最小实验:Namespace → Deployment → Service → 请求成功

将第 3 节 Namespace、第 5 节完整 Deployment、第 11 节 Service 按顺序保存为 01-namespace.yaml、02-web.yaml、03-service.yaml。本节文件名指你自己保存的实验文件,笔记未自动拆分生成它们。

# 只读:确认目标
kubectl config current-context
kubectl get nodes

# 服务端 dry-run 会经过校验/准入,但不持久化这些资源
kubectl apply --dry-run=server -f 01-namespace.yaml
# 创建 Namespace 后,才能针对它校验后续命名空间资源
kubectl apply -f 01-namespace.yaml
kubectl apply --dry-run=server -f 02-web.yaml
kubectl apply --dry-run=server -f 03-service.yaml

# 实际部署变更
kubectl apply -f 02-web.yaml
kubectl apply -f 03-service.yaml
kubectl rollout status deployment/web -n k8s-notes --timeout=180s
kubectl get deploy,rs,pods,svc -n k8s-notes
kubectl get endpointslices -n k8s-notes -l kubernetes.io/service-name=web

# 临时打开本地访问隧道,终端保持运行
kubectl port-forward -n k8s-notes svc/web 8080:80

在另一个终端执行:

curl --fail --show-error http://127.0.0.1:8080/

这证明通过本地隧道能访问被选中的 Pod;port-forward 不完整覆盖 ClusterIP 数据面、集群 DNS、Ingress、外部 LB。继续部署第 4 节 toolbox,从 Pod 内 wget http://web 与 nslookup 才能补充验证集群内访问。

15.2 扩展实验顺序

  1. Job:观察 Active → Complete,并查看日志。
  2. CronJob:观察它新建 Job;验证时区、并发策略与历史保留。
  3. HPA:确认指标 API 后添加,观察真实 CPU 指标与副本变化;静态网页低负载未必会扩容。
  4. StatefulSet:先配置可用 StorageClass,检查每 Pod 独立 PVC、稳定身份与数据保留。
  5. Ingress:先确认控制器与 IngressClass,再验证入口地址、Host 路由和 Service。
  6. NetworkPolicy:在隔离实验环境验证允许和拒绝来源,避免误阻入口流量。
  7. RBAC、Quota、PDB:逐个添加,观察准入、权限和维护行为。

15.3 验收看什么

层次 验收证据
配置 服务端接受字段,API 版本与目标集群匹配
控制器 Deployment Available,Job Complete,DaemonSet 目标节点覆盖正确
容器 探针通过,日志无持续错误,无反复重启
网络 DNS、Service 后端和实际请求成功,入口链路逐层验证
存储 PVC Bound、挂载成功、应用可读写;需要时验证重建后数据保留
业务 关键接口、依赖、数据一致性和预期功能通过

实验清理应只针对自己创建的对象。删除 Namespace 会删除其中工作负载和 PVC,可能按 PV 回收策略触发实际存储删除;先确认数据再清理。本文不执行任何清理。

16. 故障定位速查

16.1 通用顺序

kubectl get pods -n k8s-notes -o wide
kubectl describe pod POD_NAME -n k8s-notes
kubectl logs POD_NAME -n k8s-notes -c CONTAINER_NAME --tail=200
kubectl logs POD_NAME -n k8s-notes -c CONTAINER_NAME --previous --tail=200
kubectl get events -n k8s-notes --sort-by=.metadata.creationTimestamp
kubectl get deploy,sts,ds,job,cronjob,hpa -n k8s-notes
kubectl get svc,pvc -n k8s-notes
kubectl get nodes

--previous 读取同 Pod 中该容器上一次实例的日志;Pod 已删除或日志已回收后不一定还能拿到。Events 保留时间有限,长期追踪需要日志和监控系统。kubectl get all 不包括所有种类,例如不能替代对 PVC、Secret、Ingress、策略的单独检查。

16.2 状态与症状

症状 优先检查 判断要点
Pending Pod Events、requests、节点污点/标签、PVC 可能是调度或卷问题,别直接认为镜像问题
ContainerCreating 挂载、CNI、sandbox、节点运行时 看 Waiting 原因和 Events
ErrImagePull / ImagePullBackOff 镜像地址、凭据、仓库 DNS/网络、平台架构 确认节点实际能拉取该镜像
CrashLoopBackOff 当前/previous 日志、退出码、探针、配置 它是重启退避表现,不是根因
OOMKilled limit、峰值、工作集、节点内存与退出信息 区分容器超限、节点 OOM 和压力驱逐
Running 但 0/1 Ready readiness、端口、启动时长、依赖 Running 不代表就绪
Service 无法访问 selector、EndpointSlice、端口、DNS、策略 按 Pod → Service → 入口逐层定位
PVC Pending StorageClass、供给事件、容量/模式匹配 WaitForFirstConsumer 可能正常等待
FailedMount / FailedAttachVolume CSI、节点依赖、网络、拓扑、卷占用 PVC Bound 不代表卷挂载成功
Terminating 很久 finalizer、preStop、节点状态、存储卸载 先查清理依赖,再考虑处理 finalizer
HPA 不扩容 指标 API、requests、上下限、事件、窗口 HPA 不能解决没有节点容量的问题
Deployment 无 Pod ReplicaSet Events、配额、准入、模板 创建 Deployment 成功不代表 Pod 创建成功
CronJob 未执行 suspend、timeZone、deadline、并发、控制器 先确认是否生成 Job,再看其 Pod

Pod phase 只有 Pending、Running、Succeeded、Failed、Unknown 等;kubectl get pods 的 STATUS 列也可能显示容器等待或终止原因。不要把 CrashLoopBackOff 当成 Pod phase。

16.3 高频错误记忆表

错误理解 正确理解
ns 自动隔离网络 需要 NetworkPolicy 等机制
Pod 删除后一定会恢复 需要有合适的控制器管理
containerPort 会暴露端口 只是声明,仍需进程监听与网络入口
三副本数据库就是高可用 还需复制、选主、数据一致性与备份
RWO 只能一个 Pod 挂 通常限制单节点;单 Pod 语义看 RWOP
Secret 的 base64 是加密 编码可以直接解码
readiness 失败会重启 它主要影响就绪与接流量;重启看 liveness/startup 等
HPA 的 CPU 百分比对节点计算 Utilization 是相对资源 requests
PDB 防止所有中断 主要约束走 Eviction API 的自愿驱逐
apply 成功就是上线成功 还要验证副本、流量、依赖和业务

17. 学习顺序与官方资料

建议先熟悉:公共字段、标签 → Namespace、Pod → Deployment、Service、DNS → 配置、探针、资源 → Job/CronJob、DaemonSet → PVC/PV/StorageClass、StatefulSet → 调度、HPA → Ingress、RBAC、NetworkPolicy、Quota、PDB。

每学一种资源,回答五个问题:它解决什么问题?谁创建并管理它?关键 spec 在哪里?依赖什么组件?怎样用实际结果验收?

官方资料索引

文档核对与实测边界:参考链接已检索核对;本文示例按教学场景编写。静态格式检查不能替代目标 Kubernetes API 的服务端校验、组件兼容性检查和真实业务验收。官方滚动文档可能包含比你的集群更新的字段,使用时请选择目标版本文档。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容