Kubernetes 高级调度 01:InitContainer、Ephemeral Containers 与 HPA 知识大全
本文是 Kubernetes 高级调度系列的第一篇,全面讲解 InitContainer、Ephemeral Containers 和 HPA 三大调度特性,包含所有代码示例、补充知识点、实战技巧和常见问题,适合作为博客知识库使用。
一、初始化容器(InitContainer)
1.1 核心概念
InitContainer 是一种在 Pod 中优先于业务容器运行的容器,通常用于执行初始化任务,如:
-
等待依赖服务(数据库、缓存等)就绪
-
修改系统内核参数
-
准备配置文件或目录
-
执行数据库迁移脚本
补充知识点:
| 特性 | InitContainer | 普通容器 |
|---|---|---|
| 运行顺序 | 串行执行,一个完成才执行下一个 | 并行启动 |
| 生命周期钩子 | 不支持 postStart / preStop |
支持 |
| 健康检查 | 不支持 livenessProbe / readinessProbe |
支持 |
| 重启策略 | 失败后会重启 Pod(除非 restartPolicy: Never) |
按 Pod 重启策略 |
| 资源请求/限制 | 支持,但取所有 InitContainer 的最大值 | 各自独立 |
⚠️ 注意:InitContainer 的资源请求不会累加,而是取所有 InitContainer 中最大请求值作为 Pod 的调度依据。
1.2 示例 1:延迟启动
yaml
apiVersion: v1
kind: Pod
metadata:
name: initc01
spec:
containers:
- name: n1
image: nginx:1.7.9
initContainers:
- name: initc01
image: nginx:1.7.9
command: ["sh", "-c", "sleep 15"]
restartPolicy: Never
观察状态变化:
bash
kubectl get pod -w # Init:0/1 → PodInitializing → Running
1.3 示例 2:修改内核参数(需要特权模式)
yaml
apiVersion: v1
kind: Pod
metadata:
name: initc02
spec:
containers:
- name: n1
image: nginx:1.7.9
initContainers:
- name: init02
image: alpine
command: ["sh", "-c", "/sbin/sysctl -w vm.swappiness=0"]
securityContext:
privileged: true
restartPolicy: Never
验证:
bash
# 在节点上执行 cat /proc/sys/vm/swappiness # 输出应为 0
💡 补充:
vm.swappiness=0表示尽量少使用 swap,适合内存敏感型应用。
1.4 示例 3:等待依赖服务(DNS 解析)
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
initContainers:
- name: init-redis
image: busybox:1.28
command: ['sh', '-c', 'until nslookup redis-server; do echo waiting for redis; sleep 2; done;']
- name: init-mysql
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mysql-server; do echo waiting for mysql; sleep 2; done;']
依赖服务示例(MySQL):
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- mountPath: /var/lib/mysql
name: volv
volumes:
- name: volv
hostPath:
path: /root/k8s/mysql/var/lib/mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysql-server
spec:
ports:
- port: 3306
selector:
app: mysql
二、临时容器(Ephemeral Containers)
2.1 概念与适用场景
临时容器是 Kubernetes 1.23+ 中引入的一种临时调试工具,适合:
-
排查无法
exec的容器(如 Distroless 镜像) -
查看崩溃容器的文件系统
-
安装临时工具(curl、tcpdump 等)
补充知识点:
| 特性 | 说明 |
|---|---|
| 生命周期 | 不会自动重启,Pod 重启后消失 |
| 字段限制 | 不支持 ports、livenessProbe、resources |
| 创建方式 | 只能通过 kubectl debug 或 API 创建,不能直接写在 pod.spec 中 |
| 共享命名空间 | 可与目标容器共享进程、网络、文件系统 |
2.2 实战:为 Tomcat Pod 添加临时容器
yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat-test
spec:
containers:
- name: tomcat-java
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
bash
kubectl apply -f pod-tomcat.yaml kubectl debug -it tomcat-test --image=busybox:1.28 --target=tomcat-java
进入容器后可以执行:
bash
ps -ef | grep tomcat df -h cat /etc/os-release
2.3 查看临时容器状态
bash
kubectl describe pod tomcat-test
输出中会包含 Ephemeral Containers 字段,显示临时容器的状态(通常是 Terminated)。
💡 提示:临时容器退出后不会删除描述信息,可用于事后审计。
三、水平自动扩缩容(HPA)
3.1 什么是 HPA
HPA 根据 CPU、内存或自定义指标自动调整 Deployment、StatefulSet 等的副本数。
核心组件:
| 组件 | 作用 |
|---|---|
| Metrics Server | 采集 Pod/Node 的 CPU、内存等指标 |
| HPA Controller | 定期计算目标副本数并扩缩容 |
| API Server | 提供 HPA 对象的管理接口 |
3.2 工作流程
-
创建 HPA 对象,指定目标 CPU 利用率、最小/最大副本数
-
Metrics Server 每 15 秒采集一次指标
-
HPA 每 15 秒计算一次期望副本数:
期望副本数=⌈当前指标总和目标值⌉期望副本数=⌈目标值当前指标总和⌉ -
更新 Deployment 的
replicas字段
⚠️ 注意:HPA 默认有冷却时间(扩缩容稳定窗口),避免频繁震荡。
3.3 实战:Nginx 自动扩缩容
步骤 1:部署 Nginx Deployment
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-server
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
resources:
requests:
cpu: 10m
bash
kubectl apply -f nginx-deployment.yaml kubectl expose deployment nginx-server --port=80
步骤 2:创建 HPA
bash
kubectl autoscale deployment nginx-server --cpu-percent=10 --min=1 --max=10
步骤 3:查看 HPA 状态
bash
kubectl get hpa # NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS # nginx-server Deployment/nginx-server 0%/10% 1 10 2
步骤 4:压测
bash
while true; do wget -q -O- http://<CLUSTER-IP> > /dev/null; done
步骤 5:观察扩容
bash
kubectl get hpa -w # 显示 55%/10%,副本数逐渐增加到 10 kubectl get pod # 看到多个 nginx-server-xxx 在运行
步骤 6:停止压测并观察缩容
bash
# Ctrl+C 停止 while 循环 kubectl get hpa # 2%/10% → 0%/10% kubectl get pod # 几分钟后副本数减少到 1 或 2
3.4 补充知识点:HPA 高级配置
支持多指标
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-server
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-server
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 200Mi
自定义指标(Prometheus + KEDA)
KEDA 是一个更强大的自动扩缩容组件,支持:
-
RabbitMQ 队列长度
-
Redis 列表长度
-
Cron 定时扩缩容
四、总结
| 特性 | 适用场景 | 关键限制 |
|---|---|---|
| InitContainer | 初始化、依赖检查、特权操作 | 不支持健康检查、生命周期钩子 |
| Ephemeral Container | 调试 Distroless 镜像、崩溃容器 | 不支持端口、资源限制、自动重启 |
| HPA | 应对流量波动、资源优化 | 需要 Metrics Server,有冷却时间 |
五、常见问题 FAQ
Q1:InitContainer 失败会怎样?
-
如果
restartPolicy: Always(默认),Pod 会不断重启 InitContainer -
如果
restartPolicy: Never,Pod 会保持Init:Error状态
Q2:临时容器能否使用 kubectl exec?
不能直接 exec,但可以通过 kubectl debug 创建并进入。
Q3:HPA 为什么不缩容?
-
检查
--horizontal-pod-autoscaler-downscale-stabilization窗口(默认 5 分钟) -
检查是否有其他 HPA 对象冲突
-
检查 Metrics Server 是否正常
六、清理资源
bash
kubectl delete -f init01.yml kubectl delete -f init02.yml kubectl delete -f myapp.yaml kubectl delete -f mysql-deployment.yaml kubectl delete -f redis-deployment.yaml kubectl delete hpa nginx-server kubectl delete deployment nginx-server kubectl delete service nginx-server
📌 本文所有代码均已测试于 Kubernetes 1.28+,欢迎收藏、转发、评论交流。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)