配置 Deployment 使用 Volcano 控制资源使用
这里举一个示例,限制Deployment
最多仅能使用 2 核 CPU。
-
创建队列
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: my-node-queue
spec:
weight: 1
reclaimable: false
capability:
cpu: 2创建一个仅有 2 核 CPU、并且绑定到节点组
my-node-group
的队列。这里的weight
表示集群资源划分中所占的相对比重,是软约束;reclaimable
表示是否允许被回收,由weight
来决定;capability
表示队列的资源限制。 -
创建
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: ubuntu-with-volcano
labels:
app: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
schedulerName: volcano
containers:
- name: demo
image: shaowenchen/demo-ubuntu
resources:
requests:
cpu: 1将
schedulerName
设置为volcano,表示使用``Volcano
调度器。 -
查看
Pod
$ kubectl get pods -l app=demo
NAME READY STATUS RESTARTS AGE
ubuntu-with-volcano-97c94f9fb-bfgrh 1/1 Running 0 6m24s -
扩容
Deployment
$ kubectl scale deployment/ubuntu-with-volcano --replicas=3
此时,三个 Pod 只有两个处于 Running 状态,因为 Volcano 限制了 Deployment 最多仅能使用 2c CPU。
$ kubectl get pods -l app=demo
NAME READY STATUS RESTARTS AGE
ubuntu-with-volcano-97c94f9fb-25nb7 1/1 Running 0 27s
ubuntu-with-volcano-97c94f9fb-6fd64 0/1 Pending 0 27s
ubuntu-with-volcano-97c94f9fb-bfgrh 1/1 Running 0 7m31s
配置Job使用Volcano限流并发执行
这里创建一个Job
并且要求至少 3 个Pod
一起运行的Job。
直接使用Kubernetes batch/v1
中的Job
,配置completions
和parallelism
,也可以实现这个需求。但Volcano
提供的Queue
可以控制资源使用、Policy
可以控制Task
的生命周期策略,能更精准控制Job
的执行。
-
创建
Job
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: my-job
spec:
minAvailable: 3
schedulerName: volcano
queue: default
policies:
- event: PodEvicted
action: RestartJob
tasks:
- replicas: 30
name: demo
policies:
- event: TaskCompleted
action: CompleteJob
template:
spec:
containers:
- image: ubuntu
name: demo
command: ["sleep", "5"]
resources:
requests:
cpu: 20
restartPolicy: Never其中:
policies:
- event: PodEvicted
action: RestartJob表示如果
Pod
被Evict
了,就重启Job
。policies:
- event: TaskCompleted
action: CompleteJob表示如果
Task
完成了,就完成Job
。通过
Event
和Action
,可以控制Job
的状态和行为。 -
查看
Pod
创建情况$ kubectl get pod
NAME READY STATUS RESTARTS AGE
my-job-demo-0 1/1 Running 0 7s
my-job-demo-1 1/1 Running 0 7s
my-job-demo-10 0/1 Pending 0 7s
...
my-job-demo-2 1/1 Running 0 7s
...由于我设置了
Pod
的CPU Request
为 20,集群上没有足够的资源,所以 30 个Pod
每次只能运行 3 个。执行完成之后,
Pod
不会被删除而是处于Completed
状态。由于Pod
的ownerReferences
是Job
,如果删除Job
,Pod
也会被删除。