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使用率,避免过度依赖。