Agende VMs que usam o tempo de execução de VMs no GDC

Este documento destina-se a proprietários de aplicações e administradores de plataformas que executam o Google Distributed Cloud. Este documento mostra como usar configurações de agendamento, como afinidade e antiafinidade, para VMs que usam o VM Runtime no GDC.

Antes de começar

Para preencher este documento, precisa de ter acesso aos seguintes recursos:

Vista geral das configurações de programação

As configurações de agendamento são valores opcionais no tempo de execução da VM no GDC. Se não for especificada nenhuma configuração de agendamento, a VM usa o comportamento de agendamento predefinido do Kubernetes.

Com o comportamento de agendamento predefinido, as VMs são distribuídas pelo cluster. O programador analisa a disponibilidade de recursos do nó atual, como a CPU e a memória, e programa as VMs nos nós para distribuir as exigências de computação. Se não tiver requisitos específicos, não precisa de definir configurações de horários.

Os seguintes três campos estão disponíveis para agendar VMs:

  • nodeSelector: especifica as etiquetas de nós que o nó anfitrião de uma VM tem de ter. O tempo de execução da VM no GDC agenda a VM apenas nos nós que têm uma etiqueta especificada.
  • Afinidade: especifica as regras de afinidade da VM. Inclui afinidade de nós e afinidade ou antiafinidade entre VMs. Define um requisito flexível ou rígido para o programador:
    • preferredDuringSchedulingIgnoredDuringExecution: é um requisito flexível. O agendador tenta dar seguimento ao seu pedido. Se o programador não puder aceitar o pedido, a VM pode ser agendada num nó não preferencial.
    • requiredDuringSchedulingIgnoredDuringExecution: é um requisito obrigatório. O agendador tenta dar seguimento ao seu pedido. Se não estiverem disponíveis nós que correspondam ao seu requisito, a VM não é agendada.
  • Tolerations: permite que a VM seja agendada em nós com taints correspondentes.

Pode definir qualquer uma destas configurações de agendamento para suportar as suas cargas de trabalho de computação e necessidades de agendamento. Além das configurações de agendamento, o agendamento de VMs depende dos recursos disponíveis.

O VM Runtime no GDC usa a mesma lógica de agendamento de VMs e estrutura de manifesto que o Kubernetes para atribuir pods a nós. Para mais informações sobre estas configurações de agendamento, consulte os seguintes links:

Coloque VMs num nó específico

Se tiver nós com configurações de hardware específicas, pode agendar VMs para serem executadas apenas nestes nós. Por exemplo, a sua VM pode querer um chipset de CPU específico ou precisar de suporte de GPU. Pode usar uma regra de afinidade básica nodeSelector ou regras de afinidade mais flexíveis para agendar a execução de VMs nestes nós.

nodeSelector

O seguinte manifesto VirtualMachine usa um nodeSelector para um requisito de agendamento rígido. Se não estiver disponível nenhum nó que cumpra a configuração de agendamento, não é possível agendar a VM.

  1. Crie um VirtualMachine manifesto, como my-scheduled-vm.yaml,no editor da sua escolha:

    nano my-scheduled-vm.yaml
    
  2. Copie e cole o seguinte manifesto 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
    

    Substitua os seguintes valores:

    • VM_NAME: o nome da sua VM.
    • NODE_NAME: os nós nos quais quer agendar a sua VM.

    O disco de arranque com o nome VM_NAME-boot-dv já tem de existir. Para mais informações, consulte o artigo Crie um disco de arranque de VM.

  3. Guarde e feche o manifesto da VM no editor.

  4. Crie a configuração da VM e do agendamento através do comando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Afinidade

O manifesto VirtualMachine seguinte usa a afinidade para um requisito de agendamento flexível. O agendador tenta dar seguimento ao seu pedido. Se o agendador não conseguir satisfazer o pedido, a VM é agendada num nó não preferencial.

  1. Crie um manifesto VirtualMachine, como my-scheduled-vm.yaml,no editor à sua escolha:

    nano my-scheduled-vm.yaml
    
  2. Copie e cole o seguinte manifesto 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
    

    Substitua os seguintes valores:

    • VM_NAME: o nome da sua VM.
    • NODE_NAME: os nós nos quais quer agendar a sua VM.

    O disco de arranque com o nome VM_NAME-boot-dv já tem de existir. Para mais informações, consulte o artigo Crie um disco de arranque de VM.

  3. Guarde e feche o manifesto da VM no editor.

  4. Crie a configuração da VM e do agendamento através do comando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Não coloque VMs num nó específico

Determinadas VMs podem ter cargas de trabalho que não são executadas num nó específico. Pode usar regras de antiafinidade para evitar agendar VMs nestes nós.

O manifesto VirtualMachine seguinte usa a afinidade para um requisito de agendamento flexível. O agendador tenta dar seguimento ao seu pedido. Se o agendador não conseguir honrar o pedido, a VM pode ser agendada num nó inadequado.

  1. Crie um manifesto VirtualMachine, como my-scheduled-vm.yaml,no editor à sua escolha:

    nano my-scheduled-vm.yaml
    
  2. Copie e cole o seguinte manifesto 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
    

    Substitua os seguintes valores:

    • VM_NAME: o nome da sua VM.
    • NODE_NAME: o nó no qual quer agendar a sua VM.

    O disco de arranque com o nome VM_NAME-boot-dv já tem de existir. Para mais informações, consulte o artigo Crie um disco de arranque de VM.

  3. Guarde e feche o manifesto da VM no editor.

  4. Crie a configuração da VM e do agendamento através do comando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Mantenha as VMs separadas

As suas cargas de trabalho de computação podem ter VMs que devem ser distribuídas por nós para alta disponibilidade, como um conjunto de VMs de front-end. Pode usar regras de antiafinidade entre VMs para evitar agendar VMs em conjunto nos nós.

O manifesto VirtualMachine seguinte usa a afinidade para um requisito de agendamento flexível. O agendador tenta dar seguimento ao seu pedido. Se o agendador não conseguir honrar o pedido, a VM pode ser agendada num nó inadequado.

  1. Crie um manifesto VirtualMachine, como my-scheduled-vm.yaml,no editor à sua escolha:

    nano my-scheduled-vm.yaml
    
  2. Copie e cole o seguinte manifesto 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
    

    Substitua os seguintes valores:

    • VM_NAME: o nome da sua VM.
    • KEY:VALUE: a etiqueta key:value a aplicar às VMs que quer agendar em diferentes nós. Para mais informações, consulte o artigo Etiquetas e seletores.

    O disco de arranque com o nome VM_NAME-boot-dv já tem de existir. Para mais informações, consulte o artigo Crie um disco de arranque de VM.

  3. Guarde e feche o manifesto da VM no editor.

  4. Crie a configuração da VM e do agendamento através do comando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Manter VMs juntas

As suas cargas de trabalho de computação podem ter VMs que devem ser mantidas juntas em nós para reduzir a latência, como uma camada de middleware e base de dados. Pode usar regras de afinidade entre VMs para agendar VMs em conjunto nos nós.

O manifesto VirtualMachine seguinte usa a afinidade para um requisito de agendamento flexível. O agendador tenta dar seguimento ao seu pedido. Se o agendador não conseguir honrar o pedido, a VM pode ser agendada num nó inadequado.

  1. Crie um manifesto VirtualMachine, como my-scheduled-vm.yaml,no editor à sua escolha:

    nano my-scheduled-vm.yaml
    
  2. Copie e cole o seguinte manifesto 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
    

    Substitua os seguintes valores:

    • VM_NAME: o nome da sua VM.
    • KEY:VALUE: o par de etiquetas key:value a aplicar às VMs que quer agendar em diferentes nós. Para mais informações, consulte Etiquetas e seletores.

    O disco de arranque com o nome VM_NAME-boot-dv já tem de existir. Para mais informações, consulte o artigo Crie um disco de arranque de VM.

  3. Guarde e feche o manifesto da VM no editor.

  4. Crie a configuração da VM e do agendamento através do comando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

Agende VMs em nós com restrições

As restrições são uma propriedade de agendamento que permite que os nós só permitam que as VMs com tolerâncias especificadas sejam agendadas para execução nos mesmos. Pode aplicar uma contaminação a um nó e, em seguida, no manifesto VirtualMachine, definir uma tolerância para permitir que a VM seja executada no nó. Para mais informações, consulte o artigo Restrições e tolerâncias.

  1. Crie um manifesto VirtualMachine, como my-scheduled-vm.yaml,no editor à sua escolha:

    nano my-scheduled-vm.yaml
    
  2. Copie e cole o seguinte manifesto 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"
    

    Substitua os seguintes valores:

    • VM_NAME: o nome da sua VM.
    • KEY_NAME: o nome da chave da sua tolerância que corresponde à mancha no nó.
    • KEY_VALUE: o valor da chave para a sua tolerância que corresponde à mancha no nó.

    O disco de arranque com o nome VM_NAME-boot-dv já tem de existir. Para mais informações, consulte o artigo Crie um disco de arranque de VM.

  3. Guarde e feche o manifesto da VM no editor.

  4. Crie a configuração da VM e do agendamento através do comando kubectl:

    kubectl apply -f my-scheduled-vm.yaml
    

O que se segue?