Compartilhar via


Habilitar um registro de contêiner do Edge no seu dispositivo GPU do Azure Stack Edge Pro

APLICA-SE A:Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro 2 SKUAzure Stack Edge Pro 2Yes for Pro R SKUAzure Stack Edge Pro R Azure Stack Edge Mini RYes for Mini R SKU

Este artigo descreve como habilitar o registro de contêiner de borda e usá-lo de dentro do cluster Kubernetes em seu dispositivo Azure Stack Edge Pro. O exemplo usado no artigo fornece detalhes sobre como enviar por push uma imagem de um registro de origem, nesse caso, o registro de contêiner da Microsoft, para o registro no dispositivo Azure Stack Edge, o registro de contêiner do Edge.

Sobre o Registro de contêiner do Edge

Os aplicativos de computação em contêineres são executados em imagens de contêiner e essas imagens são armazenadas em registros. Os registros podem ser públicos, como o Docker Hub, privado ou o provedor de nuvem gerenciado, como o Registro de Contêiner do Azure. Para obter mais informações, confira Sobre registros, repositórios e imagens.

Um registro de contêiner de borda fornece um repositório no Edge, em seu dispositivo Azure Stack Edge Pro. Você pode usar esse registro para armazenar e gerenciar suas imagens de contêiner privadas.

Em um ambiente de vários nós, as imagens de contêiner podem ser baixadas e enviadas por push para o registro de contêiner do Edge uma vez. Todos os aplicativos de borda podem usar o registro de contêiner do Edge para implantações subsequentes.

Pré-requisitos

Antes de começar, verifique se:

  1. Você tem acesso a um dispositivo Azure Stack Edge Pro.

  2. Você ativou o dispositivo Azure Stack Edge Pro conforme descrito em Ativar o Azure Stack Edge Pro.

  3. Você habilitou a função de computação no dispositivo. Um cluster Kubernetes também foi criado ao configurar a função de computação no dispositivo, conforme as instruções em Configurar a função de Computação no Azure Stack Edge Pro.

  4. O ponto de extremidade da API do Kubernetes é da página do Dispositivo da IU da Web local. Para obter mais informações, confira as instruções em Obter pontos de extremidade da API do Kubernetes.

  5. Você tem acesso a um sistema cliente com um Sistema operacional com suporte. Se estiver usando um cliente Windows, o sistema deverá executar o PowerShell 5.0 ou posterior para acessar o dispositivo.

    1. Se você quiser efetuar pull e enviar por push suas próprias imagens de contêiner, verifique se o sistema tem o cliente Docker instalado. Se estiver usando um cliente Windows, Instale o Docker Desktop no Windows.

Habilitar o registro de contêiner como complemento

A primeira etapa é habilitar o registro de contêiner do Edge como um complemento.

  1. Conecte-se à interface do PowerShell do dispositivo.

  2. Para habilitar o registro de contêiner como um complemento, digite:

    Set-HcsKubernetesContainerRegistry

    Essa operação pode levar vários minutos para ser concluída.

    Aqui está a amostra de saída deste comando:

    [10.128.44.40]: PS>Set-HcsKubernetesContainerRegistry
    Operation completed successfully. Use Get-HcsKubernetesContainerRegistryInfo for credentials    
    
  3. Para obter os detalhes do registro de contêiner, digite:

    Get-HcsKubernetesContainerRegistryInfo

    Aqui está a amostra fora deste comando:

    [10.128.44.40]: PS> Get-HcsKubernetesContainerRegistryInfo
    
    Endpoint                                   IPAddress    Username     Password
    --------                                   ---------    --------     --------
    ecr.dbe-hw6h1t2.microsoftdatabox.com:31001 10.128.44.41 ase-ecr-user i3eTsU4zGYyIgxV
    
  4. Anote o nome de usuário e a senha da saída de Get-HcsKubernetesContainerRegistryInfo. Essas credenciais são usadas para entrar no registro de contêiner do Edge ao enviar imagens por push.

Gerenciar imagens do registro de contêiner

Talvez você queira acessar o registro de contêiner fora do seu dispositivo Azure Stack Edge. Você também poderá querer enviar por push ou efetuar pull de imagens no registro.

Siga estas etapas para acessar o registro de contêiner do Edge:

  1. Obtenha os detalhes do ponto de extremidade para o registro de contêiner do Edge.

    1. Na IU local do dispositivo, acesse a página Dispositivo.

    2. Localize o ponto de extremidade do registro de contêiner do Edge. Edge container registry endpoint on Device page

    3. Copie esse ponto de extremidade e crie uma entrada DNS correspondente no arquivo C:\Windows\System32\Drivers\etc\hosts do cliente para se conectar ao ponto de extremidade do registro de contêiner do Edge.

      <Endereço IP do nó principal do Kubernetes><Ponto de extremidade do registro de contêiner do Edge>

      Add DNS entry for Edge container registry endpoint

  2. Baixe o certificado de registro de contêiner do Edge da interface do usuário local.

    1. Na IU local do dispositivo, acesse a página Certificados.

    2. Localize a entrada para o Certificado de registro de contêiner do Edge. À direita dessa entrada, selecione o Download para baixar o certificado de registro de contêiner do Edge no sistema cliente que você usará para acessar seu dispositivo.

      Download Edge container registry endpoint certificate

  3. Instale o certificado baixado no cliente. Se estiver usando um cliente Windows, siga estas etapas:

    1. Selecione o certificado e, no Assistente para importação de certificados, selecione o local de armazenamento como Computador local.

      Install certificate 1

    2. Instale o certificado em seu computador local no repositório de raiz confiável.

      Install certificate 2

  4. Depois que o certificado for instalado, reinicie o cliente do Docker no sistema.

  5. Entre no registro de contêiner do Edge. Tipo:

    docker login <Edge container registry endpoint> -u <username> -p <password>

    Forneça o ponto de extremidade do registro de contêiner do Edge na página Dispositivos e o nome de usuário e a senha obtidos da saída de Get-HcsKubernetesContainerRegistryInfo.

  6. Use os comandos push ou pull do Docker para efetuar push ou pull de imagens de contêiner do registro de contêiner.

    1. Efetuar pull de uma imagem a partir da imagem do Microsoft Container Registry. Tipo:

      docker pull <Full path to the container image in the Microsoft Container Registry>

    2. Crie um alias da imagem da qual você efetuou pull com o caminho totalmente qualificado para o registro.

      docker tag <Path to the image in the Microsoft container registry> <Path to the image in the Edge container registry/Image name with tag>

    3. Envie a imagem por push ao registro.

      docker push <Path to the image in the Edge container registry/Image name with tag>

    4. Execute a imagem enviada por push ao registro.

      docker run -it --rm -p 8080:80 <Path to the image in the Edge container registry/Image name with tag>

      Aqui está um exemplo de saída dos comandos pull e push:

      PS C:\WINDOWS\system32> docker login ecr.dbe-hw6h1t2.microsoftdatabox.com:31001 -u ase-ecr-user -p 3bbo2sOtDe8FouD
      WARNING! Using --password via the CLI is insecure. Use --password-stdin.
      Login Succeeded
      PS C:\WINDOWS\system32> docker pull mcr.microsoft.com/oss/nginx/nginx:1.17.5-alpine
      1.17.5-alpine: Pulling from oss/nginx/nginx
      Digest: sha256:5466bbc0a989bd1cd283c0ba86d9c2fc133491ccfaea63160089f47b32ae973b
      Status: Image is up to date for mcr.microsoft.com/oss/nginx/nginx:1.17.5-alpine
      mcr.microsoft.com/oss/nginx/nginx:1.17.5-alpine
      PS C:\WINDOWS\system32> docker tag mcr.microsoft.com/oss/nginx/nginx:1.17.5-alpine ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/nginx:2.0
      PS C:\WINDOWS\system32> docker push ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/nginx:2.0
      The push refers to repository [ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/nginx]
      bba7d2385bc1: Pushed
      77cae8ab23bf: Pushed
      2.0: digest: sha256:b4c0378c841cd76f0b75bc63454bfc6fe194a5220d4eab0d75963bccdbc327ff size: 739
      PS C:\WINDOWS\system32> docker run -it --rm -p 8080:80 ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/nginx:2.0
      2020/11/10 00:00:49 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8080", referrer: "http://localhost:8080/"
      172.17.0.1 - - [10/Nov/2020:00:00:49 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36" "-"
      ^C
      PS C:\WINDOWS\system32>    
      
  7. Navegue até http://localhost:8080 para exibir o contêiner em execução. Nesse caso, você verá o servidor web nginx em execução.

    View the running container

    Para parar e remover o contêiner, pressione Control+C.

Usar imagens do registro de contêiner do Edge via pods do Kubernetes

Agora você pode implantar a imagem enviada por push no registro de contêiner do Edge de dentro dos pods Kubernetes.

  1. Para implantar a imagem, você precisa configurar o acesso ao cluster via kubectl. Crie um namespace, um usuário, conceda acesso de usuário ao namespace e obtenha um arquivo de configuração. Verifique se você pode se conectar aos pods do Kubernetes.

    Siga todas as etapas em Conectar-se a um cluster do Kubernetes e gerenciá-lo por meio do kubectl em seu dispositivo de GPU do Azure Stack Edge Pro.

    Aqui está um exemplo de saída para um namespace em seu dispositivo de onde o usuário pode acessar o cluster do Kubernetes.

    [10.128.44.40]: PS>New-HcsKubernetesNamespace -Namespace myecr
    [10.128.44.40]: PS>New-HcsKubernetesUser -UserName ecruser
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01URXdOVEF6TkRJek1Gb1hEVE13TVRFd016QXpOREl6TUZvd0ZURVRNQkVnNjOVRLWndCQ042cm1XQms2eXFwcXI1MUx6bApTaXMyTy91UEJ2YXNSSUUzdzgrbmEwdG1aTERZZ2F6MkQwMm42Q29mUmtyUTR2d1lLTnR1MlpzR3pUdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
        server: https://compute.dbe-hw6h1t2.microsoftdatabox.com:6443
        name: kubernetes
        ===================CUT=========================================CUT==============
        client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMwRENDQWJpZ0F3SUJBZ0lJYmVWRGJSTzZ3ell3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURFeE1EVXdNelF5TXpCYUZ3MHlNVEV4TURreU16UTRNal
        ===================CUT=========================================CUT==============
        DMVUvN3lFOG5UU3k3b2VPWitUeHdzCjF1UDByMjhDZ1lCdHdRY0ZpcFh1blN5ak16dTNIYjhveFI2V3VWWmZldFFKNElKWEFXOStVWGhKTFhyQ2x4bUcKWHRtbCt4UU5UTzFjQVNKRVZWVDd6Tjg2ay9kSU43S3JIVkdUdUxlUDd4eGVjV2VRcWJrZEVScUsxN0liTXpiVApmbnNxc0dobEdmLzdmM21kTGtyOENrcWs5TU5aM3MvUVIwRlFCdk94ZVpuUlpTeDVGbUR5S1E9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
    
    [10.128.44.40]: PS>Grant-HcsKubernetesNamespaceAccess -Namespace myecr -UserName ecruser
    [10.128.44.40]: PS>kubectl get pods -n "myecr"
    No resources found.
    PS C:\WINDOWS\system32>
    
  2. Os segredos de pull de imagem já estão definidos em todos os namespaces do Kubernetes em seu dispositivo. Você pode criar um usando o comando get secrets. Aqui está uma amostra de saída:

    PS C:\WINDOWS\system32> .\kubectl.exe get secrets -n myecr
    NAME                  TYPE                                  DATA   AGE
    ase-ecr-credentials   kubernetes.io/dockerconfigjson        1      99m
    default-token-c7kww   kubernetes.io/service-account-token   3      107m
    sec-smbcredentials    microsoft.com/smb                     2      99m
    PS C:\WINDOWS\system32>   
    
  3. Implante um pod em seu namespace usando kubectl. Use o seguinte yaml.

    Substitua a imagem: <image-name> pela imagem enviada por push ao registro de contêiner. Confira os segredos em seus namespaces usando imagePullSecrets com um nome: ase-ecr-credentials.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - name: nginx
        image: ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/nginx:2.0
        imagePullPolicy: Always
      imagePullSecrets:
      - name: ase-ecr-credentials
    
  4. Aplique a implantação no namespace que você criou usando o comando apply. Verifique se o contêiner está em execução. Aqui está uma amostra de saída:

    PS C:\Windows\System32> .\kubectl.exe apply -f .\deployment.yml -n myecr
    pod/nginx configured
    PS C:\Windows\System32> .\kubectl.exe get pods -n myecr
    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          27m
    PS C:\Windows\System32>
    

Excluir imagens do registro de contêiner

O armazenamento do registro de contêiner do Edge é hospedado em um compartilhamento local dentro de seu dispositivo Azure Stack Edge Pro, que é limitado pelo armazenamento disponível no dispositivo. É sua responsabilidade excluir imagens não utilizadas do Docker do registro de contêiner usando a API HTTP v2 do Docker (https://docs.docker.com/registry/spec/api/).

Para remover uma ou mais imagens de contêiner, siga estas etapas:

  1. Defina o nome da imagem para a imagem que você deseja excluir.

    PS C:\WINDOWS\system32> $imageName="nginx"    
    
  2. Definir o nome de usuário e a senha do registro de contêiner como uma credencial do PS

    PS C:\WINDOWS\system32> $username="ase-ecr-user"
    PS C:\WINDOWS\system32> $password="3bbo2sOtDe8FouD"
    PS C:\WINDOWS\system32> $securePassword = ConvertTo-SecureString $password -AsPlainText -Force
    PS C:\WINDOWS\system32> $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword)    
    
  3. Listar as marcas associadas à imagem

    PS C:\WINDOWS\system32> $tags = Invoke-RestMethod -Credential $credential -Uri "https://ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/v2/nginx/tags/list" | Select-Object -ExpandProperty tags
    PS C:\WINDOWS\system32> $tags
    2.0
    PS C:\WINDOWS\system32> $tags = Invoke-RestMethod -Credential $credential -Uri "https://ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/v2/$imageName/tags/list" | Select-Object -ExpandProperty tags
    PS C:\WINDOWS\system32> $tags
    2.0
    PS C:\WINDOWS\system32>    
    
  4. Liste o hash associado à marca que você deseja excluir. Isso usa $tags da saída do comando acima. Se você tiver várias marcas, selecione uma delas e use no próximo comando.

    PS C:\WINDOWS\system32> $response = Invoke-WebRequest -Method Head -Credential $credential -Uri "https://ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/v2/$imageName/manifests/$tags" -Headers @{ 'Accept' = 'application/vnd.docker.distribution.manifest.v2+json' }
    PS C:\WINDOWS\system32> $digest = $response.Headers['Docker-Content-Digest']
    PS C:\WINDOWS\system32> $digest
    sha256:b4c0378c841cd76f0b75bc63454bfc6fe194a5220d4eab0d75963bccdbc327ff
    PS C:\WINDOWS\system32>    
    
  5. Excluir a imagem usando o hash da imagem:marca

    PS C:\WINDOWS\system32> Invoke-WebRequest -Method Delete -Credential $credential -Uri "https://ecr.dbe-hw6h1t2.microsoftdatabox.com:31001/v2/$imageName/manifests/$digest" | Select-Object -ExpandProperty StatusDescription    
    

Depois de excluir as imagens não usadas, o espaço associado às imagens não referenciadas é automaticamente recuperado por um processo que é executado à noite.

Próximas etapas