Ubuntu Swap在容器化环境中的应用与配置
在容器化环境中,Ubuntu的Swap(交换空间)主要作为内存溢出保护和性能平滑工具,通过将部分内存数据临时存储到磁盘,防止容器因内存不足被系统杀死(OOM),同时缓解内存高峰期的性能波动。但需注意,Swap会引入磁盘I/O延迟,可能影响应用响应速度,因此应谨慎使用。
Docker通过--memory(内存限制)和--memory-swap(内存+Swap总限制)参数控制容器Swap使用,二者关系如下:
--memory-swap > --memory:容器可使用--memory的物理内存 + (--memory-swap - --memory)的Swap空间(如--memory=1g --memory-swap=2g,则容器可使用1G物理内存+1G Swap);--memory-swap = --memory:容器仅能使用指定物理内存,无Swap空间;--memory-swap = -1:容器可使用无限Swap(默认情况下,Docker为容器分配与物理内存等量的Swap)。示例命令:
启动一个物理内存限制为1G、Swap总限制为2G的容器:
docker run -it --memory="1g" --memory-swap="2g" ubuntu:latest /bin/bash
验证Swap使用:
进入容器后,通过free -h命令查看Swap使用量,或通过docker stats查看容器级资源占用。
Kubernetes对Swap的支持需通过节点配置和Pod资源限制实现,且默认情况下节点会禁用Swap(--fail-swap-on=true)。
修改Kubelet启动参数,允许Pod使用Swap:
编辑/etc/default/kubelet文件,添加--fail-swap-on=false --feature-gates="MemorySwap=true",然后重启kubelet服务:
sudo systemctl restart kubelet。
在Pod的YAML配置文件中,通过resources.limits.swap字段设置Swap上限(需配合resources.limits.memory使用):
apiVersion: v1
kind: Pod
metadata:
name: swap-pod
spec:
containers:
- name: my-container
image: nginx
resources:
limits:
memory: "512Mi"
swap: "1Gi" # 设置Swap上限为1Gi
requests:
memory: "256Mi"
swap: "512Mi" # 设置Swap请求为512Mi
验证配置:
部署Pod后,通过kubectl describe pod swap-pod查看资源限制是否生效,或进入容器执行free -h确认Swap使用量不超过限制。
docker stats(Docker)或kubectl top pod(Kubernetes)监控Swap使用率,避免过度依赖。