跳到主要内容
版本:v1.5

Colocation Profile

Motivation

如果现有集群中的工作负载想要通过 Koordinator 进行混合部署,则需要修改现有的 Controller/Operator 以支持 Koordinator 定义的 QoS Class、优先级和资源模型等协议。为了降低 Koordinator 混部系统的使用门槛,让大家可以简单快速的使用混部技术获得收益,因此 Koordinator 提供了一个 ClusterColocationProfile CRD 和 对应的 Webhook 修改和验证新创建的 Pod,注入 ClusterColocationProfile 中描述的字段。

构架

image

Feature Gates

ClusterColocationProfile mutating/validating 功能默认是打开的,如果想要关闭,请设置 Feature Gates:

$ helm install koordinator https://... --set featureGates="PodMutatingWebhook=false\,PodValidatingWebhook=false"

规格定义

如果您对 Kubernetes 资源不熟悉,请参考页面 了解 Kubernetes 对象

  • namespaceSelector: 如果命名空间与选择器匹配,则决定是否改变/验证 Pod。 LabelSelector 默认为空,它将匹配所有 Namespace。

  • selector: 如果 Pod 与选择器匹配,则决定是否改变/验证 Pod。 默认为空的 LabelSelector,它将匹配所有 Pod。

  • qosClass (required): 描述了 Pod 的 Koordinator QoSClass。该值以标签 koordinator.sh/qosClass 的形式更新到 Pod 中。对应的选项为 LSELSRLSBESYSTEM。 有关更多信息,请查看页面此处

  • priorityClassName (required): 指定要写入到 Pod.Spec.PriorityClassName 中的 Kubenretes PriorityClass. 选项为 koord-prodkoord-midkoord-batchkoord-free。有关更多信息,请查看 此处

  • koordinatorPriority: Koordinator 还提供了 Pod 级别的子优先级 sub-priority。 优先级值将作为标签 koordinator.sh/priority 更新到 Pod。 各个 Koordinator 组件通过 KoordinatorPriority 和 PriorityClassName 中的优先级值来确定 Koordinator 中 Pod 的优先级,值越高,优先级越高。

  • labels: 描述需要注入到 Pod.Labels 的 k/v 键值对。

  • annotations: 描述了需要注入到 Pod.Annotations 的 k/v 键值对。

  • schedulerName: 如果指定,则 Pod 将由指定的调度器调度。

  • patch: 表示用户想要注入 Pod 的 Pod 模板补丁。

例子

创建 ClusterColocationProfile

下面的 profile.yaml 文件描述了对所有含有标签 koordinator.sh/enable-colocation=true 的 Namespace 下的所有含有标签 koordinator.sh/enable-colocation=true 的 Pod 进行修改,注入 Koordinator QoSClass、Koordinator Priority 等。

apiVersion: config.koordinator.sh/v1alpha1
kind: ClusterColocationProfile
metadata:
name: colocation-profile-example
spec:
namespaceSelector:
matchLabels:
koordinator.sh/enable-colocation: "true"
selector:
matchLabels:
koordinator.sh/enable-colocation: "true"
qosClass: BE
priorityClassName: koord-batch
koordinatorPriority: 1000
schedulerName: koord-scheduler
labels:
koordinator.sh/mutated: "true"
annotations:
koordinator.sh/intercepted: "true"
patch:
spec:
terminationGracePeriodSeconds: 30

基于 YAML 文件创建 ClusterColocationProfile:

$ kubectl apply -f profile.yaml

验证 ClusterColocationProfile 是否生效

apiVersion: v1
kind: Pod
metadata:
labels:
koordinator.sh/enable-colocation: "true"
name: test-pod
spec:
containers:
- name: app
image: nginx:1.15.1
resources:
limits:
cpu: "1"
memory: "3456Mi"
requests:
cpu: "1"
memory: "3456Mi"

创建这个 Pod,现在你会发现该 Pod 被注入了 Koordinator QoSClass、Koordinator Priority 等。

$ kubectl get pod test-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
koordinator.sh/intercepted: true
labels:
koordinator.sh/qosClass: BE
koordinator.sh/priority: 1000
koordinator.sh/mutated: true
...
spec:
terminationGracePeriodSeconds: 30
priority: 5000
priorityClassName: koord-batch
schedulerName: koord-scheduler
containers:
- name: app
image: nginx:1.15.1
resources:
limits:
kubernetes.io/batch-cpu: "1000"
kubernetes.io/batch-memory: 3456Mi
requests:
kubernetes.io/batch-cpu: "1000"
kubernetes.io/batch-memory: 3456Mi