Criar e anexar um cluster Azure Kubernetes Service com v1

APLICA-SE A:SDK python azureml v1

APLICA-SE A:Extensão de ml da CLI do Azure v1

Importante

Este artigo mostra como utilizar a CLI e o SDK v1 para criar ou anexar um cluster Azure Kubernetes Service, que agora é considerado uma funcionalidade legada. Para anexar Azure Kubernetes Service cluster com a abordagem recomendada para v2, veja Introdução ao destino de computação do Kubernetes na v2.

O Azure Machine Learning pode implementar modelos de machine learning preparados para Azure Kubernetes Service. No entanto, primeiro tem de criar um cluster de Azure Kubernetes Service (AKS) a partir da área de trabalho do Azure Machine Learning ou anexar um cluster do AKS existente. Este artigo fornece informações sobre como criar e anexar um cluster.

Pré-requisitos

Limitações

  • Só é possível criar ou anexar um AKS como um destino de computação individual na área de trabalho do Azure Machine Learning. Não são suportados vários anexos para um AKS.

  • Se precisar de um Balanceador de Carga Standard (SLB) implementado no cluster em vez de um Balanceador de Carga Básico (BLB), crie um cluster no portal do AKS/CLI/SDK e, em seguida, anexe-o à área de trabalho do Azure Machine Learning.

  • Se tiver uma política do Azure Policy que restrinja a criação de endereços IP públicos, a criação do cluster do AKS falhará. O AKS requer um IP Público para o tráfego de saída. O artigo relativo ao tráfego de saída também disponibiliza orientações para bloquear o tráfego de saída do cluster através do IP Público, exceto alguns nomes de domínio completamente qualificados. Existem duas formas de ativar um IP Público:

    O plano de controlo do Azure Machine Learning não comunica com este IP Público. Comunica com o plano de controlo do AKS para implementações.

  • Para anexar um cluster do AKS, o principal de serviço/utilizador que executa a operação tem de ter atribuída a função de Controlo de acesso baseado em funções (RBAC do Azure) do Proprietário ou contribuidor no grupo de recursos do Azure que contém o cluster. O principal de serviço/utilizador também tem de ser atribuído Azure Kubernetes Service Função de Administração de Cluster no cluster.

  • Se anexar um cluster do AKS, que tem um intervalo de IP autorizado ativado para aceder ao servidor de API, ative os intervalos de IP do plano de controlo do Azure Machine Learning para o cluster do AKS. O plano de controlo do Azure Machine Learning é implementado transversalmente em regiões emparelhadas e implementa pods de inferência no cluster do AKS. Sem acesso ao servidor de API, os pods de inferência não podem ser implementados. Utilize os intervalos de IP para ambas as regiões emparelhadas quando ativar os intervalos de IP num cluster do AKS.

    Os intervalos de IP autorizados só funcionam com o Balanceador de Carga Standard.

  • Se quiser utilizar um cluster privado do AKS (mediante a utilização do Azure Private Link), primeiro tem de criar o cluster e, em seguida, anexá-lo à área de trabalho. Para obter mais informações, veja Criar um cluster do Azure Kubernetes Service privado.

  • A utilização de um nome de domínio completamente qualificado (FQDN) com um cluster do AKS privadonão é suportada com o Azure Machine Learning.

  • O nome de computação do cluster do AKS TEM DE ser exclusivo na área de trabalho do Azure Machine Learning. Pode incluir letras, dígitos e traços. Tem de começar com uma letra, terminar com uma letra ou dígito e ter entre 3 e 24 carateres de comprimento.

  • Se quiser implementar modelos em nós de GPU ou nós FPGA (ou em qualquer SKU específico), tem de criar um cluster com o SKU específico. Não existe suporte para criar um conjunto de nós secundário num cluster existente e implementar modelos no conjunto de nós secundário.

  • Ao criar ou anexar um cluster, pode selecionar se pretende criar o cluster para dev/test ou produção. Se pretender criar um cluster do AKS para desenvolvimento, validação e testes em vez de produção, defina o objetivo do cluster como dev/test. Se não especificar a finalidade do cluster, é criado um cluster de produção.

    Importante

    Um cluster de dev-test não é adequado para tráfego ao nível de produção e pode aumentar os tempos de inferência. Os clusters de desenvolvimento/teste também não garantem tolerância a falhas.

  • Ao criar ou anexar um cluster, se o cluster for utilizado para produção, tem de conter, pelo menos, 3 nós. Os clusters de dev/test têm de conter, pelo menos, um nó.

  • O SDK do Azure Machine Learning não oferece suporte para o dimensionamento de clusters do AKS. Para dimensionar os nós no cluster, utilize a IU do cluster do AKS no estúdio do Azure Machine Learning. Só pode alterar a contagem de nós e não o tamanho da VM do cluster. Para obter mais informações sobre como dimensionar os nós num cluster do AKS, veja os seguintes artigos:

  • Não atualize diretamente o cluster mediante a utilização de uma configuração do YAML. Embora o Azure Kubernetes Service suporte atualizações através da configuração do YAML, as implementações do Azure Machine Learning irão substituir as suas alterações. Os únicos dois campos do YAML que não serão substituídos são os limites de pedidos e a CPU e a memória.

  • A criação de um cluster do AKS com a IU estúdio do Azure Machine Learning, o SDK ou a extensão da CLI não é idempotente. Tentar criar o recurso novamente resultará num erro de que já existe um cluster com o mesmo nome.

    • A utilização de um modelo do Azure Resource Manager e o recurso Microsoft.MachineLearningServices/workspaces/computes para criar um cluster do AKS também não é idempotente. Se tentar utilizar o modelo novamente para atualizar um recurso já existente, receberá o mesmo erro.

Versão do Azure Kubernetes Service

Azure Kubernetes Service permite-lhe criar um cluster com uma variedade de versões do Kubernetes. Para obter mais informações sobre as versões disponíveis, veja Versões suportadas do Kubernetes no Azure Kubernetes Service.

Ao criar um cluster Azure Kubernetes Service com um dos seguintes métodos, não tem escolha na versão do cluster que é criada:

  • estúdio do Azure Machine Learning ou a secção Azure Machine Learning do portal do Azure.
  • Extensão de Machine Learning para a CLI do Azure.
  • SDK do Azure Machine Learning.

Estes métodos de criação de um cluster do AKS utilizam a versão predefinida do cluster. A versão predefinida muda ao longo do tempo à medida que as novas versões do Kubernetes ficam disponíveis.

Ao anexar um cluster do AKS existente, suportamos todas as versões do AKS atualmente suportadas.

Importante

Azure Kubernetes Service utiliza o controlador Blobfuse FlexVolume para as versões <=1.16 e controlador CSI de Blob para as versões >=1.17. Por conseguinte, é importante voltar a implementar ou atualizar o serviço Web após a atualização do cluster para implementar para corrigir o método blobfuse para a versão do cluster.

Nota

Podem existir casos extremos em que tem um cluster mais antigo que já não é suportado. Neste caso, a operação de anexação devolverá um erro e listará as versões atualmente suportadas.

Pode anexar versões de pré-visualização . A funcionalidade de pré-visualização é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. O suporte para utilizar versões de pré-visualização pode ser limitado. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Versões disponíveis e predefinidas

Para encontrar as versões do AKS disponíveis e predefinidas, utilize o comando az aks get-versions da CLI do Azure. Por exemplo, o comando seguinte devolve as versões disponíveis na região E.U.A. Oeste:

az aks get-versions -l westus -o table

O resultado deste comando é semelhante ao seguinte texto:

KubernetesVersion    Upgrades
-------------------  ----------------------------------------
1.18.6(preview)      None available
1.18.4(preview)      1.18.6(preview)
1.17.9               1.18.4(preview), 1.18.6(preview)
1.17.7               1.17.9, 1.18.4(preview), 1.18.6(preview)
1.16.13              1.17.7, 1.17.9
1.16.10              1.16.13, 1.17.7, 1.17.9
1.15.12              1.16.10, 1.16.13
1.15.11              1.15.12, 1.16.10, 1.16.13

Para encontrar a versão predefinida utilizada ao criar um cluster através do Azure Machine Learning, pode utilizar o --query parâmetro para selecionar a versão predefinida:

az aks get-versions -l westus --query "orchestrators[?default == `true`].orchestratorVersion" -o table

O resultado deste comando é semelhante ao seguinte texto:

Result
--------
1.16.13

Se quiser verificar programaticamente as versões disponíveis, utilize a API REST Cliente do Container Service – List Orchestrators. Para encontrar as versões disponíveis, veja as entradas onde orchestratorType está Kubernetes. As entradas associadas orchestrationVersion contêm as versões disponíveis que podem ser anexadas à sua área de trabalho.

Para encontrar a versão predefinida que é utilizada ao criar um cluster através do Azure Machine Learning, localize a entrada onde orchestratorType está Kubernetes e default é true. O valor associado orchestratorVersion é a versão predefinida. O fragmento JSON seguinte mostra uma entrada de exemplo:

...
 {
        "orchestratorType": "Kubernetes",
        "orchestratorVersion": "1.16.13",
        "default": true,
        "upgrades": [
          {
            "orchestratorType": "",
            "orchestratorVersion": "1.17.7",
            "isPreview": false
          }
        ]
      },
...

Criar um novo cluster do AKS

Estimativa de tempo: aproximadamente 10 minutos.

Criar ou anexar um cluster do AKS é um processo único para a área de trabalho. Pode reutilizar este cluster para várias implementações. Se eliminar o cluster ou o grupo de recursos que o contém, terá de criar um novo cluster da próxima vez que precisar de implementar. Pode ter vários clusters do AKS ligados à área de trabalho.

O exemplo seguinte demonstra como criar um novo cluster do AKS com o SDK e a CLI:

APLICA-SE A:Python SDK azureml v1

from azureml.core.compute import AksCompute, ComputeTarget

# Use the default configuration (you can also provide parameters to customize this).
# For example, to create a dev/test cluster, use:
# prov_config = AksCompute.provisioning_configuration(cluster_purpose = AksCompute.ClusterPurpose.DEV_TEST)
prov_config = AksCompute.provisioning_configuration()

# Example configuration to use an existing virtual network
# prov_config.vnet_name = "mynetwork"
# prov_config.vnet_resourcegroup_name = "mygroup"
# prov_config.subnet_name = "default"
# prov_config.service_cidr = "10.0.0.0/16"
# prov_config.dns_service_ip = "10.0.0.10"
# prov_config.docker_bridge_cidr = "172.17.0.1/16"

aks_name = 'myaks'
# Create the cluster
aks_target = ComputeTarget.create(workspace = ws,
                                    name = aks_name,
                                    provisioning_configuration = prov_config)

# Wait for the create process to complete
aks_target.wait_for_completion(show_output = True)

Para obter mais informações sobre as classes, métodos e parâmetros utilizados neste exemplo, veja os seguintes documentos de referência:

Anexar um cluster do AKS existente

Estimativa de tempo: Aproximadamente 5 minutos.

Se já tiver um cluster do AKS na sua subscrição do Azure, pode utilizá-lo com a sua área de trabalho.

Dica

O cluster do AKS existente pode estar numa região do Azure diferente da área de trabalho do Azure Machine Learning.

Aviso

Não crie vários anexos simultâneos para o mesmo cluster do AKS. Por exemplo, anexar um cluster do AKS a uma área de trabalho com dois nomes diferentes ou anexar um cluster do AKS a uma área de trabalho diferente. Cada novo anexo irá quebrar os anexos existentes anteriores e causar um erro imprevisível.

Se quiser voltar a anexar um cluster do AKS, por exemplo, para alterar o TLS ou outra definição de configuração do cluster, primeiro tem de remover o anexo existente utilizando AksCompute.detach().

Para obter mais informações sobre como criar um cluster do AKS com a CLI ou portal do Azure, veja os seguintes artigos:

O exemplo seguinte demonstra como anexar um cluster do AKS existente à área de trabalho:

APLICA-SE A:Python SDK azureml v1

from azureml.core.compute import AksCompute, ComputeTarget
# Set the resource group that contains the AKS cluster and the cluster name
resource_group = 'myresourcegroup'
cluster_name = 'myexistingcluster'

# Attach the cluster to your workgroup. If the cluster has less than 12 virtual CPUs, use the following instead:
# attach_config = AksCompute.attach_configuration(resource_group = resource_group,
#                                         cluster_name = cluster_name,
#                                         cluster_purpose = AksCompute.ClusterPurpose.DEV_TEST)
attach_config = AksCompute.attach_configuration(resource_group = resource_group,
                                         cluster_name = cluster_name)
aks_target = ComputeTarget.attach(ws, 'myaks', attach_config)

# Wait for the attach process to complete
aks_target.wait_for_completion(show_output = True)

Para obter mais informações sobre as classes, métodos e parâmetros utilizados neste exemplo, veja os seguintes documentos de referência:

Criar ou anexar um cluster do AKS com terminação TLS

Quando cria ou anexa um cluster do AKS, pode ativar a terminação do TLS com objetos de configuração AksCompute.provisioning_configuration() e AksCompute.attach_configuration( ). Ambos os métodos devolvem um objeto de configuração que tem um método enable_ssl e pode utilizar enable_ssl método para ativar o TLS.

O exemplo seguinte mostra como ativar a terminação do TLS com a geração e configuração automáticas de certificados TLS com o certificado Microsoft no bastidor.

APLICA-SE A:Python SDK azureml v1

   from azureml.core.compute import AksCompute, ComputeTarget
   
   # Enable TLS termination when you create an AKS cluster by using provisioning_config object enable_ssl method

   # Leaf domain label generates a name using the formula
   # "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
   # where "######" is a random series of characters
   provisioning_config.enable_ssl(leaf_domain_label = "contoso")
   
   # Enable TLS termination when you attach an AKS cluster by using attach_config object enable_ssl method

   # Leaf domain label generates a name using the formula
   # "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
   # where "######" is a random series of characters
   attach_config.enable_ssl(leaf_domain_label = "contoso")


O exemplo seguinte mostra como ativar a terminação TLS com o certificado personalizado e o nome de domínio personalizado. Com o domínio e o certificado personalizados, tem de atualizar o registo DNS para apontar para o endereço IP do ponto final de classificação. Consulte Atualizar o DNS

APLICA-SE A:Python SDK azureml v1

   from azureml.core.compute import AksCompute, ComputeTarget

   # Enable TLS termination with custom certificate and custom domain when creating an AKS cluster
   
   provisioning_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")
    
   # Enable TLS termination with custom certificate and custom domain when attaching an AKS cluster

   attach_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")


Nota

Para obter mais informações sobre como proteger a implementação de modelos no cluster do AKS, veja Utilizar o TLS para proteger um serviço Web através do Azure Machine Learning

Criar ou anexar um cluster do AKS para utilizar Balanceador de Carga internos com IP privado

Quando cria ou anexa um cluster do AKS, pode configurar o cluster para utilizar uma Balanceador de Carga interna. Com uma Balanceador de Carga interna, a classificação de pontos finais para as suas implementações no AKS utilizará um IP privado na rede virtual. Os fragmentos de código seguintes mostram como configurar uma Balanceador de Carga Interna para um cluster do AKS.

APLICA-SE A:Python SDK azureml v1

Para criar um cluster do AKS que utiliza uma Balanceador de Carga interna, utilize os load_balancer_type parâmetros eload_balancer_subnet:

from azureml.core.compute.aks import AksUpdateConfiguration
from azureml.core.compute import AksCompute, ComputeTarget

# When you create an AKS cluster, you can specify Internal Load Balancer to be created with provisioning_config object
provisioning_config = AksCompute.provisioning_configuration(load_balancer_type = 'InternalLoadBalancer')

# Create the cluster
aks_target = ComputeTarget.create(workspace = ws,
                                name = aks_name,
                                provisioning_configuration = provisioning_config)

# Wait for the create process to complete
aks_target.wait_for_completion(show_output = True)

Importante

Se o cluster do AKS estiver configurado com uma Balanceador de Carga Interna, a utilização de um certificado fornecido pela Microsoft não é suportada e tem de utilizar um certificado personalizado para ativar o TLS.

Nota

Para obter mais informações sobre como proteger o ambiente de inferência, veja Proteger um Ambiente de Inferência do Azure Machine Learning

Desanexar um cluster do AKS

Para desanexar um cluster da área de trabalho, utilize um dos seguintes métodos:

Aviso

Utilizar o estúdio do Azure Machine Learning, o SDK ou a extensão da CLI do Azure para machine learning para desanexar um cluster do AKS não elimina o cluster do AKS. Para eliminar o cluster, veja Utilizar a CLI do Azure com o AKS.

APLICA-SE A:Python SDK azureml v1

aks_target.detach()

Resolução de problemas

Atualizar o cluster

Atualizações aos componentes do Azure Machine Learning instalados num cluster de Azure Kubernetes Service tem de ser aplicado manualmente.

Pode aplicar estas atualizações ao desanexar o cluster da área de trabalho do Azure Machine Learning e voltar a ligar o cluster à área de trabalho.

APLICA-SE A:SDK python azureml v1

compute_target = ComputeTarget(workspace=ws, name=clusterWorkspaceName)
compute_target.detach()
compute_target.wait_for_completion(show_output=True)

Antes de poder voltar a anexar o cluster à área de trabalho, primeiro tem de eliminar quaisquer azureml-fe recursos relacionados. Se não existir nenhum serviço ativo no cluster, pode eliminar os recursos azureml-fe relacionados com o seguinte código.

kubectl delete sa azureml-fe
kubectl delete clusterrole azureml-fe-role
kubectl delete clusterrolebinding azureml-fe-binding
kubectl delete svc azureml-fe
kubectl delete svc azureml-fe-int-http
kubectl delete deploy azureml-fe
kubectl delete secret azuremlfessl
kubectl delete cm azuremlfeconfig

Se o TLS estiver ativado no cluster, terá de fornecer o certificado TLS/SSL e a chave privada ao voltar a anexar o cluster.

APLICA-SE A:SDK python azureml v1

attach_config = AksCompute.attach_configuration(resource_group=resourceGroup, cluster_name=kubernetesClusterName)

# If SSL is enabled.
attach_config.enable_ssl(
    ssl_cert_pem_file="cert.pem",
    ssl_key_pem_file="key.pem",
    ssl_cname=sslCname)

attach_config.validate_configuration()

compute_target = ComputeTarget.attach(workspace=ws, name=args.clusterWorkspaceName, attach_configuration=attach_config)
compute_target.wait_for_completion(show_output=True)

Se já não tiver o certificado TLS/SSL e a chave privada ou estiver a utilizar um certificado gerado pelo Azure Machine Learning, pode obter os ficheiros antes de desanexar o cluster ao ligar ao cluster com kubectl e obter o segredo azuremlfessl.

kubectl get secret/azuremlfessl -o yaml

Nota

O Kubernetes armazena os segredos no formato codificado em Base64. Terá de descodificar base64 e os cert.pemkey.pem componentes dos segredos antes de os fornecer ao attach_config.enable_ssl.

Falhas de serviços Web

Muitas falhas de serviços Web no AKS podem ser depuradas ao ligar ao cluster com kubectl. Pode obter o para um cluster do kubeconfig.json AKS ao executar

APLICA-SE A:Extensão de ml da CLI do Azure v1

az aks get-credentials -g <rg> -n <aks cluster name>

Depois de desanexar o cluster, se não existir nenhum serviço ativo no cluster, elimine os azureml-fe recursos relacionados antes de anexar novamente:

kubectl delete sa azureml-fe
kubectl delete clusterrole azureml-fe-role
kubectl delete clusterrolebinding azureml-fe-binding
kubectl delete svc azureml-fe
kubectl delete svc azureml-fe-int-http
kubectl delete deploy azureml-fe
kubectl delete secret azuremlfessl
kubectl delete cm azuremlfeconfig

Os balanceadores de carga não devem ter IPs públicos

Ao tentar criar ou anexar um cluster do AKS, poderá receber uma mensagem a indicar que o pedido foi negado porque "Os Balanceadores de Carga não devem ter IPs públicos". Esta mensagem é devolvida quando um administrador aplica uma política que impede a utilização de um cluster do AKS com um endereço IP público.

Para resolver este problema, crie/anexe o cluster com os load_balancer_type parâmetros e load_balancer_subnet . Para obter mais informações, veja Internal Balanceador de Carga (PRIVATE IP).

Passos seguintes