本文目录导读:

在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
重要注意事项
-
资源限制与抢占的关系:抢占策略通常与资源限制配合使用,确保高优先级任务有足够的资源。
-
云平台限制:某些云平台(如AWS ECS、Google GKE)可能有自己的抢占策略配置方式,需要参考相应文档。
-
内核支持:确保操作系统内核支持相应的cgroup功能。
-
安全考虑:设置过高优先级可能导致其他容器资源饥饿,建议合理规划。
-
监控与调优:配置后需要监控系统性能,必要时调整参数。
这些脚本提供了在Shell中配置容器抢占策略的基础框架,具体实现可能需要根据你的环境和技术栈进行调整。