一、Namespace 与 LimitRange —— 默认资源配额
实操过程
创建命名空间
bash
bash
kubectl create namespace test-limit kubectl get ns✅ 新建了一个名为
test-limit的独立资源空间,用于隔离本次实验的所有资源。配置 LimitRange
目录:
/opt/k8s/test-limit/limitrange.yaml
yaml
yaml
apiVersion: v1 kind: LimitRange metadata: name: default-resources namespace: test-limit spec: limits: - type: Container default: cpu: "500m" memory: "512Mi" defaultRequest: cpu: "100m" memory: "128Mi"应用并验证:
bash
bash
kubectl apply -f limitrange.yaml kubectl get limitrange -n test-limit验证默认资源继承
创建 BusyBox Pod(无 resources 配置)
yaml
yaml
apiVersion: v1 kind: Pod metadata: name: demo namespace: test-limit spec: containers: - name: app image: busybox command: ["sleep", "3600"]查看 Pod 详情:
bash
bash
kubectl describe pod demo -n test-limit✅ 发现 Pod 自动带上 CPU/MEM 的 request 和 limit。
对应知识点
概念 | 说明 |
|---|---|
Namespace | 逻辑隔离单元,不同 NS 的资源默认不可见 |
LimitRange | 为 NS 内 Pod/容器设置默认资源请求和上限 |
requests | 调度依据,确保节点有足够资源 |
limits | 运行时资源上限,防资源滥用 |
单位 | CPU: |
二、Pod 探针(Probe)—— 健康检测
实操过程
第一次错误配置
三个容器分别用 Exec / HTTP / TCP 方式做存活探针
未配置 startupProbe,探针几乎立即启动
结果:Pod 一直
CrashLoopBackOff
分析错误原因
容器还没完全启动,存活探针就失败 → 容器被杀 → 重启 → 再失败
探针没有“等待应用启动”的机制
正确配置
yaml
yaml
startupProbe: httpGet: path: / port: 80 periodSeconds: 5 failureThreshold: 12 # 最长等60秒 livenessProbe: httpGet: path: / port: 80 periodSeconds: 20 failureThreshold: 3 readinessProbe: httpGet: path: / port: 80 periodSeconds: 5 failureThreshold: 1✅ 启动探针成功 → 存活/就绪探针才开始工作
对应知识点
探针类型 | 作用 |
|---|---|
StartupProbe | 防止慢启动应用被误杀 |
LivenessProbe | 检测存活,失败即重启 |
ReadinessProbe | 检测是否可接流量,失败摘除 |
检测方式 | exec / httpGet / tcpSocket |
参数 | initialDelaySeconds / periodSeconds / failureThreshold / timeoutSeconds |
三、生命周期钩子(Lifecycle Hook)
实操过程
配置钩子
yaml
yaml
lifecycle: postStart: exec: command: ["/bin/sh","-c","echo 'nginx started' >> /tmp/poststart.log"] preStop: exec: command: ["/bin/sh","-c","echo 'nginx stopping' >> /tmp/prestop.log; sleep 5"]验证
查看 postStart 日志:
bash
bash
kubectl exec -n test-limit lifecycle-demo -- cat /tmp/poststart.log删除 Pod 触发 preStop:
bash
bash
kubectl delete pod lifecycle-demo -n test-limit
知识点
钩子 | 说明 |
|---|---|
postStart | 容器启动后立即执行,常用于初始化 |
preStop | 容器终止前执行,用于优雅下线 |
区别 | 探针只检测状态,钩子执行动作 |
四、标签(Label)与节点调度
实操过程
给 Pod 打标签
bash
bash
kubectl label pod lifecycle-demo version=v1.0 -n test-limit kubectl get pods -n test-limit --show-labels指定节点部署
yaml
yaml
spec: nodeName: k8s-node2✅ Pod 成功调度到 node2
知识点
概念 | 说明 |
|---|---|
Label | 键值对,用于分组和选择 |
nodeName | 硬性调度,跳过调度器 |
推荐方式 | nodeSelector / affinity / taint-toleration |
五、整体流程串联(实操 + 知识点)
Pod 生命周期全景:
纯文本
纯文本
创建 Namespace → LimitRange 设置默认资源 ↓ Pod 创建 → 资源自动继承 ↓ StartupProbe 成功 ↓ Liveness / Readiness 开始检测 ↓ postStart 执行初始化 ↓ 运行中(探针持续检测) ↓ preStop 执行优雅下线 ↓ Pod 删除