一、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:1000m = 1核,内存:Mi/Gi |
二、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 删除