Este documento está dirigido a los propietarios de aplicaciones y a los administradores de plataformas que ejecutan Google Distributed Cloud. En este documento se explica cómo usar configuraciones de programación, como la afinidad y la antiafinidad, en las VMs que usan VM Runtime en GDC.
Antes de empezar
Para completar este documento, necesitas tener acceso a los siguientes recursos:
- Acceso a un clúster de Google Distributed Cloud versión 1.12.0 (
anthosBareMetalVersion: 1.12.0
) o posterior. Puedes usar cualquier tipo de clúster que pueda ejecutar cargas de trabajo. Si es necesario, prueba Google Distributed Cloud en Compute Engine o consulta la descripción general de la creación de clústeres. - La herramienta de cliente
virtctl
instalada como complemento dekubectl
. Si es necesario, instala la herramienta de cliente virtctl.
Información general sobre las configuraciones de programación
Las configuraciones de programación son valores opcionales en el entorno de ejecución de máquinas virtuales de GDC. Si no se especifica ninguna configuración de programación, la VM se ajustará al comportamiento de programación predeterminado de Kubernetes.
Con el comportamiento de programación predeterminado, las VMs se distribuyen por todo el clúster. El programador analiza la disponibilidad de recursos de los nodos actuales, como la CPU y la memoria, y programa las VMs en los nodos para distribuir las demandas de computación. Si no tiene ningún requisito específico, no es necesario que defina ninguna configuración de programación.
Los siguientes tres campos están disponibles para programar las VMs:
nodeSelector
: especifica las etiquetas de nodo que debe tener el nodo host de una VM. El tiempo de ejecución de máquinas virtuales en GDC programa la VM solo en los nodos que tienen una etiqueta específica.- Afinidad: especifica las reglas de afinidad de la VM. Incluye la afinidad de nodos y la afinidad o antiafinidad entre máquinas virtuales. Puedes definir un requisito flexible o estricto para el programador:
preferredDuringSchedulingIgnoredDuringExecution
: es un requisito flexible. El programador intenta cumplir tu solicitud. Si el programador no puede atender la solicitud, es posible que la VM se programe en un nodo no preferido.requiredDuringSchedulingIgnoredDuringExecution
: es un requisito obligatorio. El programador intenta cumplir tu solicitud. Si no hay nodos disponibles que cumplan tus requisitos, la VM no se programa.
Tolerations
: permite que la VM se programe en nodos con intolerancias coincidentes.
Puedes definir cualquiera de estas configuraciones de programación para admitir tus cargas de trabajo de computación y tus necesidades de programación. Además de las configuraciones de programación, la programación de VMs depende de los recursos disponibles.
El entorno de ejecución de máquinas virtuales en GDC usa la misma lógica de programación de máquinas virtuales y la misma estructura de manifiesto que Kubernetes para asignar pods a nodos. Para obtener más información sobre estas configuraciones de programación, consulta los siguientes enlaces:
Colocar VMs en un nodo específico
Si tienes nodos con configuraciones de hardware específicas, puedes programar máquinas virtuales para que solo se ejecuten en esos nodos. Por ejemplo, tu VM puede necesitar un chipset de CPU concreto o compatibilidad con GPU. Puedes usar un nodeSelector
básico o reglas de afinidad más flexibles para programar la ejecución de las VMs en estos nodos.
nodeSelector
El siguiente manifiesto VirtualMachine
usa un nodeSelector
para un requisito de programación estricto. Si no hay ningún nodo disponible que cumpla los requisitos de la configuración de programación, no se podrá programar la máquina virtual.
Crea un manifiesto
VirtualMachine
, como my-scheduled-vm.yaml,en el editor que prefieras:nano my-scheduled-vm.yaml
Copia y pega el siguiente manifiesto 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
Sustituye los siguientes valores:
VM_NAME
: el nombre de tu VM.NODE_NAME
: los nodos en los que quieres programar tu VM.
El disco de arranque llamado
VM_NAME-boot-dv
ya debe existir. Para obtener más información, consulta Crear un disco de arranque de VM.Guarda y cierra el manifiesto de la VM en tu editor.
Crea la máquina virtual y programa la configuración con
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Afinidad
El siguiente manifiesto de VirtualMachine
usa la afinidad para un requisito de programación flexible. El programador intenta cumplir tu solicitud. Si el programador no puede atender la solicitud, la VM se programa en un nodo no preferido.
Crea un manifiesto
VirtualMachine
, como my-scheduled-vm.yaml,en el editor que prefieras:nano my-scheduled-vm.yaml
Copia y pega el siguiente manifiesto 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
Sustituye los siguientes valores:
VM_NAME
: el nombre de tu VM.NODE_NAME
: los nodos en los que quieres programar tu VM.
El disco de arranque llamado
VM_NAME-boot-dv
ya debe existir. Para obtener más información, consulta Crear un disco de arranque de VM.Guarda y cierra el manifiesto de la VM en tu editor.
Crea la máquina virtual y programa la configuración con
kubectl
:kubectl apply -f my-scheduled-vm.yaml
No colocar VMs en un nodo específico
Es posible que algunas máquinas virtuales tengan cargas de trabajo que no se ejecuten en un nodo concreto. Puedes usar reglas de antiafinidad para evitar que se programen VMs en estos nodos.
El siguiente manifiesto de VirtualMachine
usa la afinidad para un requisito de programación flexible. El programador intenta cumplir tu solicitud. Si el programador no puede
cumplir la solicitud, la VM se puede programar en un nodo inadecuado.
Crea un manifiesto
VirtualMachine
, como my-scheduled-vm.yaml,en el editor que prefieras:nano my-scheduled-vm.yaml
Copia y pega el siguiente manifiesto 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
Sustituye los siguientes valores:
VM_NAME
: el nombre de tu VM.NODE_NAME
: el nodo en el que quieres programar tu VM.
El disco de arranque llamado
VM_NAME-boot-dv
ya debe existir. Para obtener más información, consulta Crear un disco de arranque de VM.Guarda y cierra el manifiesto de la VM en tu editor.
Crea la máquina virtual y programa la configuración con
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Mantener las VMs separadas
Es posible que tus cargas de trabajo de computación tengan VMs que deban distribuirse entre nodos para ofrecer alta disponibilidad, como un grupo de VMs de frontend. Puedes usar reglas de antiafinidad entre VMs para evitar que se programen VMs juntas en nodos.
El siguiente manifiesto de VirtualMachine
usa la afinidad para un requisito de programación flexible. El programador intenta cumplir tu solicitud. Si el programador no puede
cumplir la solicitud, la VM se puede programar en un nodo inadecuado.
Crea un manifiesto
VirtualMachine
, como my-scheduled-vm.yaml,en el editor que prefieras:nano my-scheduled-vm.yaml
Copia y pega el siguiente manifiesto 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
Sustituye los siguientes valores:
VM_NAME
: el nombre de tu VM.KEY:VALUE
: la etiquetakey:value
que se aplicará a las VMs que quieras programar en diferentes nodos. Para obtener más información, consulta Etiquetas y selectores.
El disco de arranque llamado
VM_NAME-boot-dv
ya debe existir. Para obtener más información, consulta Crear un disco de arranque de VM.Guarda y cierra el manifiesto de la VM en tu editor.
Crea la máquina virtual y programa la configuración con
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Mantener las VMs juntas
Es posible que tus cargas de trabajo de computación tengan VMs que deban mantenerse juntas en los nodos para reducir la latencia, como un nivel de middleware y de base de datos. Puedes usar reglas de afinidad entre VMs para programar VMs juntas en nodos.
El siguiente manifiesto de VirtualMachine
usa la afinidad para un requisito de programación flexible. El programador intenta cumplir tu solicitud. Si el programador no puede
cumplir la solicitud, la VM se puede programar en un nodo inadecuado.
Crea un manifiesto
VirtualMachine
, como my-scheduled-vm.yaml,en el editor que prefieras:nano my-scheduled-vm.yaml
Copia y pega el siguiente manifiesto 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
Sustituye los siguientes valores:
VM_NAME
: el nombre de tu VM.KEY:VALUE
: el par de etiquetaskey:value
que se aplicará a las VMs que quieras programar en diferentes nodos. Para obtener más información, consulta Etiquetas y selectores.
El disco de arranque llamado
VM_NAME-boot-dv
ya debe existir. Para obtener más información, consulta Crear un disco de arranque de VM.Guarda y cierra el manifiesto de la VM en tu editor.
Crea la máquina virtual y programa la configuración con
kubectl
:kubectl apply -f my-scheduled-vm.yaml
Programar VMs en nodos con intolerancias
Los taints son una propiedad de programación que permite que los nodos solo admitan que se programen en ellos las VMs con tolerancias especificadas. Puedes aplicar un taint a un nodo y, a continuación, definir una tolerancia en el manifiesto VirtualMachine
para permitir que la VM se ejecute en el nodo. Para obtener más información, consulta Taints y tolerancias.
Crea un manifiesto
VirtualMachine
, como my-scheduled-vm.yaml,en el editor que prefieras:nano my-scheduled-vm.yaml
Copia y pega el siguiente manifiesto 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"
Sustituye los siguientes valores:
VM_NAME
: el nombre de tu VM.KEY_NAME
: el nombre de la clave de tu tolerancia que coincide con el taint del nodo.KEY_VALUE
: el valor de la clave de tu tolerancia que coincide con el taint del nodo.
El disco de arranque llamado
VM_NAME-boot-dv
ya debe existir. Para obtener más información, consulta Crear un disco de arranque de VM.Guarda y cierra el manifiesto de la VM en tu editor.
Crea la máquina virtual y programa la configuración con
kubectl
:kubectl apply -f my-scheduled-vm.yaml