本文档适用于运行 GKE on Bare Metal 的应用所有者和平台管理员。本文档介绍了如何为使用 VM Runtime on Google Distributed Cloud 的虚拟机使用调度配置,例如亲和性和反亲和性。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- GKE on Bare Metal 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本集群的访问权限。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用 GKE on Bare Metal,或查看集群创建概览。 - 作为
kubectl
的插件安装的virtctl
客户端工具。如果需要,请安装 virtctl 客户端工具。
调度配置概览
调度配置是 VM Runtime on Google Distributed Cloud 中的可选值。如果未指定调度配置,则虚拟机默认采用 Kubernetes 默认调度行为。
通过默认调度行为,虚拟机将分布在整个集群中。调度器会查看当前节点资源的可用性(例如 CPU 和内存),并在节点上安排虚拟机以分布计算需求。如果没有具体要求,则无需定义任何调度配置。
以下三个字段可用于调度虚拟机:
nodeSelector
:指定虚拟机的主机节点必须具有的节点标签。VM Runtime on Google Distributed Cloud 仅在具有指定标签的节点上调度虚拟机。- 亲和性:指定虚拟机的亲和性规则。它包括节点亲和性和虚拟机间亲和性或反亲和性。您可以为调度器定义软性要求或硬性要求:
preferredDuringSchedulingIgnoredDuringExecution
为软性要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到非首选节点上。requiredDuringSchedulingIgnoredDuringExecution
为硬性要求。调度器会尝试满足您的请求。如果没有可用节点匹配您的要求,则不会安排虚拟机。
Tolerations
:允许将虚拟机安排到具有匹配污点的节点上。
您可以定义其中的任何调度配置,以支持您的计算工作负载和调度需求。除了调度配置之外,虚拟机调度还取决于可用资源。
VM Runtime on Google Distributed Cloud 使用与 Kubernetes 相同的虚拟机调度逻辑和清单结构来为节点分配 Pod。如需详细了解这些调度配置,请参阅以下链接:
将虚拟机放置在特定节点上
如果节点具有特定的硬件配置,您可以将虚拟机安排为仅在这些节点上运行。例如,虚拟机可能需要特定的 CPU 芯片组,或者需要 GPU 支持。您可以使用基本的 nodeSelector
或更灵活的亲和性规则来安排虚拟机在这些节点上运行。
nodeSelector
以下 VirtualMachine
清单使用 nodeSelector
来实现硬性调度要求。如果没有满足调度配置的可用节点,则无法调度虚拟机。
在您选择的编辑器中创建一个
VirtualMachine
清单,例如 my-scheduled-vm.yaml,。nano my-scheduled-vm.yaml
复制并粘贴以下 YAML 清单:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - virtualMachineDiskName: VM_NAME-boot-dv boot: true scheduling: nodeSelector: kubernetes.io/hostname: NODE_NAME
替换以下值:
VM_NAME
:您的虚拟机的名称。NODE_NAME
:要将虚拟机安排在其中的一个或多个节点。
名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机和调度配置:kubectl apply -f my-scheduled-vm.yaml
亲和性
以下 VirtualMachine
清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机会被安排到非首选节点上。
在您选择的编辑器中创建一个
VirtualMachine
清单,例如 my-scheduled-vm.yaml,。nano my-scheduled-vm.yaml
复制并粘贴以下 YAML 清单:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - virtualMachineDiskName: VM_NAME-boot-dv boot: true scheduling: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: kubernetes.io/hostname operator: In values: - NODE_NAME
替换以下值:
VM_NAME
:您的虚拟机的名称。NODE_NAME
:要将虚拟机安排在其中的一个或多个节点。
名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机和调度配置:kubectl apply -f my-scheduled-vm.yaml
不将虚拟机放置在特定节点上
某些虚拟机可能具有不能在特定节点上运行的工作负载。您可以使用反亲和性规则来避免在这些节点上安排虚拟机。
以下 VirtualMachine
清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到不合适的节点上。
在您选择的编辑器中创建一个
VirtualMachine
清单,例如 my-scheduled-vm.yaml,。nano my-scheduled-vm.yaml
复制并粘贴以下 YAML 清单:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VVM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - virtualMachineDiskName: VM_NAME-boot-dv boot: true scheduling: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: kubernetes.io/hostname operator: NotIn values: - NODE_NAME
替换以下值:
VM_NAME
:您的虚拟机的名称。NODE_NAME
:要将虚拟机安排在其中的节点。
名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机和调度配置:kubectl apply -f my-scheduled-vm.yaml
使虚拟机分散
为实现高可用性,您的计算工作负载可能具有应分布到不同节点的虚拟机,例如前端虚拟机池。您可以使用虚拟机之间的反亲和性规则避免将虚拟机一起安排到节点上。
以下 VirtualMachine
清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到不合适的节点上。
在您选择的编辑器中创建一个
VirtualMachine
清单,例如 my-scheduled-vm.yaml,。nano my-scheduled-vm.yaml
复制并粘贴以下 YAML 清单:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME labels: KEY:VALUE spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - virtualMachineDiskName: VM_NAME-boot-dv boot: true scheduling: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: topologyKey: kubernetes.io/hostname labelSelector: matchLabels: KEY:VALUE
替换以下值:
VM_NAME
:您的虚拟机的名称。KEY:VALUE
:应用于要安排到不同节点上的虚拟机的key:value
标签。如需了解详情,请参阅标签和选择器。
名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机和调度配置:kubectl apply -f my-scheduled-vm.yaml
使虚拟机集中
为减少延迟,您的计算工作负载可能具有应集中在某些节点上的虚拟机,例如中间件和数据库层。您可以使用虚拟机间的亲和性规则将虚拟机一起安排到节点上。
以下 VirtualMachine
清单使用亲和性来实现软性调度要求。调度器会尝试满足您的请求。如果调度器无法满足请求,则虚拟机可能会被安排到不合适的节点上。
在您选择的编辑器中创建一个
VirtualMachine
清单,例如 my-scheduled-vm.yaml,。nano my-scheduled-vm.yaml
复制并粘贴以下 YAML 清单:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME labels: KEY:VALUE spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - virtualMachineDiskName: VM_NAME-boot-dv boot: true scheduling: affinity: podAffinity: preferredDuringSchedulingIgnoredDuringExecution - podAffinityTerm: topologyKey: kubernetes.io/hostname labelSelector: matchLabels: KEY:VALUE weight: 100
替换以下值:
VM_NAME
:您的虚拟机的名称。KEY:VALUE
:应用于要安排到不同节点上的虚拟机的key:value
标签对。如需了解详情,请参阅标签和选择器。
名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机和调度配置:kubectl apply -f my-scheduled-vm.yaml
将虚拟机安排到具有污点的节点上
污点是一种调度属性,具有污点的节点可以仅允许具有指定容忍的虚拟机被安排到其上。您可以将污点应用于某个节点,然后在 VirtualMachine
清单中定义容忍,以允许虚拟机在该节点上运行。如需了解详情,请参阅污点和容忍。
在您选择的编辑器中创建一个
VirtualMachine
清单,例如 my-scheduled-vm.yaml,。nano my-scheduled-vm.yaml
复制并粘贴以下 YAML 清单:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - virtualMachineDiskName: VM_NAME-boot-dv boot: true scheduling: tolerations: - key: KEY_NAME operator: "Equal" value: KEY_VALUE effect: "NoSchedule"
替换以下值:
VM_NAME
:您的虚拟机的名称。KEY_NAME
:与节点上的污点匹配的容忍键的名称。KEY_VALUE
:与节点上的污点匹配的容忍键的值。
名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机和调度配置:kubectl apply -f my-scheduled-vm.yaml