如何在GKE的Container-Optimized OS(COS)上配置磁盘IO调度器为none?
在GKE(COS节点)全局设置IO调度器为none的解决方案
针对你在GKE 1.24.2-gke.1900版本、使用Container-Optimized OS(COS 97)时,需要将动态挂载的PD磁盘IO调度器统一设置为none的需求,可通过以下方式实现:
核心思路
由于COS是只读系统,且GKE会自动挂载磁盘导致设备ID动态变化,我们使用Kubernetes DaemonSet在所有节点上运行特权容器,遍历节点上的块设备并批量修改IO调度器配置。
1. 创建DaemonSet配置文件
创建io-scheduler-config-daemonset.yaml,内容如下:
apiVersion: apps/v1 kind: DaemonSet metadata: name: set-io-scheduler namespace: kube-system spec: selector: matchLabels: name: set-io-scheduler template: metadata: labels: name: set-io-scheduler spec: hostPID: true hostNetwork: true containers: - name: set-io-scheduler image: busybox:1.36 command: ["/bin/sh", "-c"] args: - | while true; do # 遍历所有块设备,排除loop、ram等本地虚拟设备 for dev in /sys/block/*; do dev_name=$(basename $dev) if [[ $dev_name != loop* && $dev_name != ram* && $dev_name != sr* ]]; then # 设置IO调度器为none echo none > $dev/queue/scheduler fi done sleep 300 # 每5分钟检查一次,确保新挂载的磁盘也被配置 done securityContext: privileged: true volumeMounts: - name: sysfs mountPath: /sys volumes: - name: sysfs hostPath: path: /sys type: Directory
2. 部署DaemonSet
执行命令部署:
kubectl apply -f io-scheduler-config-daemonset.yaml
3. 验证配置生效
在任意节点上执行(可通过kubectl debug node/<node-name> -it --image=busybox进入节点):
# 检查某个PD磁盘的调度器 cat /sys/block/sdb/queue/scheduler # 预期输出:mq-deadline [none]
补充说明
- 脚本中排除了
loop、ram、sr类设备,仅针对物理磁盘(包括GCP PD)生效;如果有其他需要排除的设备类型,可自行调整判断条件。 - 脚本每5分钟执行一次遍历,确保新挂载的磁盘(如动态PVC绑定的PD)也会被自动配置为
none调度器。 - 该DaemonSet运行在
kube-system命名空间,特权模式确保有修改/sys目录的权限。
内容的提问来源于stack exchange,提问作者Martin Wang
相关产品推荐
相关产品推荐

