Shell脚本如何配置容器抢占策略

wen 实用脚本 3

本文目录导读:

Shell脚本如何配置容器抢占策略

  1. Docker 容器的抢占/优先级配置
  2. Kubernetes Pod 的抢占策略配置
  3. containerd 的抢占配置
  4. 使用cgroup直接控制优先级(高级用法)
  5. 完整的抢占策略管理脚本
  6. 重要注意事项

在Shell脚本中配置容器的抢占策略,通常需要根据你使用的容器运行时(如Docker、containerd)和编排工具(如Kubernetes)来设置,以下是几种常见的场景和配置方法:

Docker 容器的抢占/优先级配置

Docker本身没有直接的"抢占"概念,但可以通过CPU权重和资源限制来模拟优先级:

#!/bin/bash
# 高优先级容器 - 分配更多CPU权重
docker run -d \
  --name high-priority-container \
  --cpu-shares 2048 \  # 默认1024,值越高优先级越高
  --cpus 2 \
  --memory 4g \
  --memory-reservation 2g \
  nginx:latest
# 低优先级容器 - 分配较低CPU权重
docker run -d \
  --name low-priority-container \
  --cpu-shares 512 \   # 权重较低
  --cpus 1 \
  --memory 2g \
  --memory-reservation 1g \
  nginx:latest

Kubernetes Pod 的抢占策略配置

在Kubernetes中,通过PriorityClass和Pod优先级来实现抢占:

创建PriorityClass的Shell脚本

#!/bin/bash
# 创建高优先级类
cat <<EOF | kubectl apply -f -
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000
globalDefault: false
description: "This priority class should be used for critical services only."
EOF
# 创建低优先级类
cat <<EOF | kubectl apply -f -
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: low-priority
value: 100
globalDefault: false
description: "This priority class is for non-critical services."
EOF

为Pod设置优先级的Shell函数

#!/bin/bash
deploy_with_priority() {
  local name=$1
  local priority_class=$2
  local image=$3
  cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: ${name}
spec:
  priorityClassName: ${priority_class}
  containers:
  - name: main
    image: ${image}
    resources:
      requests:
        cpu: "500m"
        memory: "512Mi"
      limits:
        cpu: "1"
        memory: "1Gi"
EOF
}
# 使用示例
deploy_with_priority "critical-app" "high-priority" "nginx:latest"
deploy_with_priority "batch-job" "low-priority" "busybox:latest"

containerd 的抢占配置

对于containerd,可以通过调整CGroup配置来实现:

#!/bin/bash
# 为容器设置CPU权重(基于cgroup v2)
cat /sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/*.scope/cpu.weight
# 设置CPU权重(值范围1-10000,默认100)
echo "500" > /sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-pod${POD_UID}.slice/cpu.weight
# 使用crictl配置运行时的CPU共享
crictl update --cpu-shares 2048 ${CONTAINER_ID}

使用cgroup直接控制优先级(高级用法)

#!/bin/bash
# 检查cgroup版本
if [ -f /sys/fs/cgroup/cgroup.controllers ]; then
    echo "cgroup v2 detected"
    # v2版本的CPU权重设置
    CPU_WEIGHT_PATH="/sys/fs/cgroup/system.slice/docker-${CONTAINER_ID}.scope"
    echo "500" > ${CPU_WEIGHT_PATH}/cpu.weight
else
    echo "cgroup v1 detected"
    # v1版本的CPU共享设置
    CPU_SHARES_PATH="/sys/fs/cgroup/cpu/docker/${CONTAINER_ID}"
    echo "2048" > ${CPU_SHARES_PATH}/cpu.shares
fi

完整的抢占策略管理脚本

#!/bin/bash
# 抢占策略管理脚本
set -e
# 配置参数
DOCKER_BINARY="/usr/bin/docker"
KUBECTL_BINARY="/usr/bin/kubectl"
# 设置Docker容器优先级
set_docker_priority() {
    local container_id=$1
    local priority=$2  # 1-10, 10最高优先级
    # 将优先级1-10映射到CPU shares 128-2048
    local cpu_shares=$(( priority * 2048 / 10 ))
    echo "Setting container ${container_id} priority to ${priority} (cpu_shares: ${cpu_shares})"
    ${DOCKER_BINARY} update --cpu-shares ${cpu_shares} ${container_id}
}
# 设置Kubernetes Pod优先级
set_k8s_pod_priority() {
    local namespace=$1
    local pod_name=$2
    local priority_class=$3
    echo "Updating pod ${namespace}/${pod_name} with priority class ${priority_class}"
    # 创建临时patch文件
    cat > /tmp/pod-priority-patch.json <<EOF
{
    "spec": {
        "priorityClassName": "${priority_class}"
    }
}
EOF
    ${KUBECTL_BINARY} patch pod ${pod_name} \
        -n ${namespace} \
        --patch "$(cat /tmp/pod-priority-patch.json)"
    rm -f /tmp/pod-priority-patch.json
}
# 获取节点上所有容器的优先级信息
list_container_priorities() {
    echo "=== Docker容器优先级 ==="
    ${DOCKER_BINARY} stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" | head -20
    echo -e "\n=== Kubernetes Pod优先级 ==="
    ${KUBECTL_BINARY} get pods --all-namespaces \
        -o custom-columns=NAMESPACE:.metadata.namespace,\
NAME:.metadata.name,\
PRIORITY:.spec.priority,\
PRIORITY_CLASS:.spec.priorityClassName \
        | head -20
}
# 主菜单
case "$1" in
    docker)
        set_docker_priority "$2" "$3"
        ;;
    k8s)
        set_k8s_pod_priority "$2" "$3" "$4"
        ;;
    list)
        list_container_priorities
        ;;
    *)
        echo "Usage: $0 {docker|k8s|list} [args]"
        echo "  docker <container_id> <priority(1-10)>"
        echo "  k8s <namespace> <pod_name> <priority_class>"
        echo "  list"
        exit 1
        ;;
esac

重要注意事项

  1. 资源限制与抢占的关系:抢占策略通常与资源限制配合使用,确保高优先级任务有足够的资源。

  2. 云平台限制:某些云平台(如AWS ECS、Google GKE)可能有自己的抢占策略配置方式,需要参考相应文档。

  3. 内核支持:确保操作系统内核支持相应的cgroup功能。

  4. 安全考虑:设置过高优先级可能导致其他容器资源饥饿,建议合理规划。

  5. 监控与调优:配置后需要监控系统性能,必要时调整参数。

这些脚本提供了在Shell中配置容器抢占策略的基础框架,具体实现可能需要根据你的环境和技术栈进行调整。

抱歉,评论功能暂时关闭!