Contêineres no Compute Engine


Os contêineres de software são uma maneira conveniente de executar seus apps em várias instâncias isoladas do espaço do usuário. Execute contêineres em imagens públicas de VM do Linux ou Windows Server ou em uma imagem do Container-Optimized OS. Os contêineres permitem que os apps funcionem com menos dependências na máquina virtual (VM) do host e sejam executados independentemente de outros apps em contêineres que você implantou na mesma instância de VM. Com essas características, os apps em contêineres são mais portáteis, fáceis de implantar e mais simples de manter em grande escala.

Este documento descreve algumas das tecnologias de contêineres mais comuns que você pode usar para executar contêineres em instâncias do Compute Engine. É possível usar essas tecnologias na maioria das imagens de VM públicas fornecidas pelo Compute Engine.

Execute contêineres no Compute Engine quando for preciso controle completo sobre o ambiente de contêineres e as ferramentas de orquestração de contêineres.

Se preferir, use o Google Kubernetes Engine para simplificar o gerenciamento de cluster e as tarefas de orquestração de contêineres para que você não precise gerenciar as instâncias de VM subjacentes. O GKE oferece um ambiente gerenciado para implantação, gerenciamento e escalonamento dos aplicativos conteinerizados usando a infraestrutura do Google.

O ambiente do GKE consiste em várias máquinas (especificamente, instâncias do Compute Engine) agrupadas para formar um cluster. Quando você executa um cluster do GKE, recebe os benefícios de recursos avançados de gerenciamento de clusters, como balanceamento de carga, pools de nós, reparo automático de nós, escalonamento e upgrades automáticos, além de geração de registros e monitoramento do Google o Cloud oferece.

Saiba como criar um cluster do GKE com pools de nós executando o Microsoft Windows Server.

Faça um teste

Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho do Compute Engine em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.

Faça uma avaliação gratuita do Compute Engine

Tecnologias de contêiner executadas no Compute Engine

Em geral, as instâncias do Compute Engine podem executar qualquer tecnologia ou ferramenta de contêiner. Você pode executar diversos tipos de contêineres em sistemas operacionais Linux modernos. Também é possível executar o Docker no Windows Server 2016 ou posterior. A lista a seguir inclui várias ferramentas comuns que servem para executar e gerenciar apps em contêiner:

  • Docker e Podman são duas tecnologias de contêiner muito conhecidas que permitem executar aplicativos conteinerizados.
  • Kubernetes é uma plataforma de orquestração de contêineres que pode ser usada para gerenciar e escalonar os contêineres em execução em várias instâncias ou em um ambiente de nuvem híbrida.
  • Os contêineres no Compute Engine fornecem uma maneira fácil de implantar contêineres em instâncias de VM do Compute Engine ou em grupos de instâncias gerenciadas.
  • É possível converter os sistemas atuais em imagens LXD (em inglês) e executá-los nas instâncias de VM do Compute Engine para uma solução de migração lift-and-shift. O LXD é executado em imagens do Ubuntu.

Além disso, você pode usar o Artifact Registry para gerenciar versões de imagens de contêiner. O Artifact Registry funciona como local central de armazenamento e gerenciamento de suas imagens de contêiner antes de implantá-las no Kubernetes do Compute Engine ou nos clusters do Google Kubernetes Engine.

Imagens de VM otimizadas para contêineres

O Compute Engine fornece várias imagens de VM públicas que podem ser usadas para criar instâncias e executar as cargas de trabalho de contêineres. Algumas dessas imagens de VM públicas têm um sistema operacional minimalista otimizado para contêineres que inclui versões mais recentes pré-instaladas do Docker, do Podman ou do Kubernetes. As seguintes famílias de imagens públicas são projetadas especificamente para executar contêineres:

  • Container-Optimized OS do Google
    • Inclui: Docker, Kubernetes
    • Projeto de imagem: cos-cloud
    • Família de imagens: cos-stable
  • Fedora CoreOS
    • Inclui: Podman, Docker
    • Projeto de imagem: fedora-coreos-cloud
    • Família de imagens: fedora-coreos-stable
  • Ubuntu (em inglês)
    • Inclui: LXD
    • Projeto de imagem: ubuntu-os-cloud
    • Família de imagens: ubuntu-2004-lts

Se for necessário executar ferramentas e tecnologias de contêiner específicas em imagens que não as incluem por padrão, instale-as manualmente.

Como instalar tecnologias de contêiner nas instâncias

Para iniciar um único contêiner em uma instância, especifique uma imagem de contêiner ao criar uma instância. O Compute Engine fornece automaticamente uma imagem atualizada do Container-Optimized OS com o Docker instalado e inicia o contêiner quando a VM é inicializada. Para mais informações, consulte Como implantar contêineres em VMs.

Como alternativa, execute as cargas de trabalho de contêiner no Compute Engine usando as tecnologias de contêiner e as ferramentas de orquestração necessárias. É possível criar uma instância a partir de uma imagem pública de VM e, em seguida, instalar as tecnologias de contêiner desejadas. Por exemplo:

Em algumas situações, talvez sejam necessárias versões específicas dessas tecnologias para garantir que operem corretamente em conjunto. Por exemplo, o Kubernetes normalmente é executado de forma melhor com versões específicas do Docker. Normalmente, é possível instalar as versões mais recentes destas tecnologias para conseguir o melhor resultado.

Como instalar o Docker em imagens do Windows Server

O Windows Server 2016 e as versões posteriores são compatíveis com os contêineres. Se você planeja executar contêineres do Docker em uma instância do Windows Server, instale o Docker em uma imagem base do Windows Server ou use imagens do marketplace do Mirantis.

Se você quiser instalar o Docker CE na imagem base do Windows Server, siga as etapas descritas abaixo.

Comece criando uma instância do Windows Server usando uma imagem pública do Windows Server 2016 ou posterior. Para a melhor compatibilidade de contêineres, recomendamos usar a versão mais recente de LTSC ou SAC do Windows Server (em inglês). Para mais informações sobre o LTSC, consulte Canais de manutenção do Windows Server.

Instalar o Docker

Instalar o Docker no Windows. Para mais informações, consulte Preparar o Windows para contêineres. Reinicie a instância após a conclusão da instalação.

Mais etapas de configuração

Neste ponto, é possível usar o Docker para executar contêineres na instância. Por exemplo, o comando a seguir faz o download da imagem de contêiner nanoserver do Windows e executa um prompt de comando em um contêiner nanoserver:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe

A MTU de rede padrão do Docker é de 1.500 bytes. Se você também configurou a MTU de rede VPC para 1.500 bytes, ignore o restante desta seção. No entanto, se estiver usando a MTU de VPC padrão de 1.460 bytes na sua rede, será necessário fazer outras configurações em cada instância.

Defina a MTU para todas as interfaces de rede (Ethernet e vEthernet) como 1460 executando os seguintes comandos em um terminal do PowerShell em cada instância:

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}
PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295            1          0          0  Loopback Pseudo-Interface 1
  1460                1     306804     668688  Ethernet
  1460                1          0       1282  vEthernet (nat)

Mesmo após alterar a MTU da instância, a conectividade dos contêineres com a Internet pode ser instável porque, por padrão, a interface de rede do contêiner também usa uma MTU de 1500. Para que os comandos definam a MTU corretamente para cada contêiner, consulte a seção de MTU do contêiner.

Talvez seja necessário executar esses comandos da MTU periodicamente ao configurar a rede do Docker. Para mais detalhes, consulte a seção de problemas conhecidos.

Como executar contêineres do Windows

Há muitos recursos disponíveis para dar os primeiros passos nos contêineres do Windows:

  • A Microsoft oferece uma extensa documentação de contêineres do Windows.
  • O Docker Hub pode ser usado como um repositório para armazenar e enviar contêineres do Windows.

Problemas conhecidos nos contêineres do Windows

Descontinuação do Windows Server 2019 para imagens de contêineres

O Google ofereceu uma família de imagens do Windows Server com o Mirantis Container Runtime (anteriormente Docker EE) pré-instalado:

  • Windows
    • Inclui: Docker
    • Projeto de imagem: windows-cloud
    • Família de imagens: windows-2019-core-for-containers

No início de 2023, a Microsoft parou de distribuir e oferecer suporte ao Mirantis Container Runtime para Windows Server. Embora o Google conseguisse continuar publicando essa família de imagens até 30 de outubro de 2023, a família de imagens foi descontinuada e todas as imagens dentro da família foram marcadas como obsoletas.

As máquinas virtuais baseadas nessas imagens criadas antes de 30 de outubro de 2023 continuarão funcionando sem interrupções. No entanto, a criação de novas instâncias com base nessas imagens falhará após essa data.

As imagens personalizadas derivadas dessas imagens antes de 30 de outubro de 2023 continuarão funcionando. No entanto, as imagens personalizadas não receberão automaticamente as atualizações de patch do Windows na terça-feira, nem as versões atualizadas do Mirantis Container Runtime.

Se você quiser continuar usando imagens com o Mirantis Container Runtime pré-instalado, o Mirantis Inc oferece imagens no Google Cloud Marketplace. O custo dessas imagens de VM inclui suporte e licenciamento para o Mirantis Container Runtime diretamente do Mirantis. Os clientes que tiverem interesse em usar o Mirantis Container Runtime avulso poderão fazer o download diretamente no site do Mirantis.

Se você quiser migrar para um ambiente de execução de contêiner alternativo, como o Docker CE, siga as instruções acima.

Os contêineres são incompatíveis com versões do Windows

Os contêineres criados em versões anteriores do Windows não funcionam em instâncias do Compute Engine que executam versões mais recentes do Windows. Por padrão, o Docker extrai a versão do Windows Server 2016 de um contêiner. Isso significa que a execução do seguinte comando em uma instância que executa o Windows Server versão 1709 ou mais recente gera erros

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver cmd.exe
docker: Error response from daemon: container
9a1eb8bbcba4e91792be65f3c40b5a1aee062f02fbc60a78444b47d043438069 encountered an
error during CreateContainer: failure in a Windows system call: The operating
system of the container does not match the operating system of the host.
(0xc0370101)

A página Compatibilidade de versão do contêiner do Windows (em inglês) da Microsoft contém mais informações. Para contornar as incompatibilidades da versão do contêiner do Windows, especifique a tag correspondente à sua versão do Windows ao extrair e executar contêineres. Por exemplo, em uma instância do Windows Server versão 20H2, use o comando a seguir para executar um prompt de comando no contêiner nanoserver da versão 20H2 em vez do contêiner padrão 2019 LTSC (1809):

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe

As incompatibilidades de MTU afetam a conectividade com a instância e o contêiner

Quando você cria uma rede de contêineres em uma instância do Windows usando os comandos docker network create ou New-VMSwitch, a MTU da interface de rede da instância costuma ser forçada para 1500 (em inglês). A interface de rede padrão em um novo contêiner do Docker também costuma usar uma MTU 1500 (em inglês). Se sua rede VPC tiver uma MTU de 1460, você poderá ter os seguintes problemas:

  • A sessão RDP pode parar e talvez você não consiga se reconectar. Isso costuma acontecer ao criar uma rede de contêiner transparente.

  • A resolução DNS no contêiner pode falhar.

  • A resolução DNS ocorre, mas o estabelecimento de uma conexão HTTP do contêiner com a Internet pode falhar.

A solução recomendada para essas limitações requer duas etapas: definir a MTU para as interfaces de rede da instância como 1460 e definir a MTU para as interfaces de rede do contêiner para 1460. Como alternativa, é possível definir a MTU da VPC como 1500, mas isso exige a interrupção ou migração de todas as VMs.

1. Como configurar a MTU para as interfaces de rede da instância do Windows

Execute o seguinte comando em um terminal do PowerShell na instância do Windows para definir a MTU para todas as interfaces de rede (Ethernet e vEthernet):

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

Verifique se as MTUs da interface Ethernet e vEthernet da instância estão definidas como 1460 usando este comando:

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295            1          0          0  Loopback Pseudo-Interface 1
  1460                1  628295912    2613170  Ethernet
  1460                1      37793     223909  vEthernet (nat)

Se não for possível executar esses comandos porque você não consegue mais se conectar a uma instância usando o RDP, conecte-se à instância por meio do console serial, inicie um cmd e execute os comandos netsh para reparar a MTU. Para não ter que fazer isso, recomendamos executar qualquer comando docker network ... ou New-VMSwitch como parte de um script que também executa o comando de reparo de MTU.

2. Como configurar a MTU para as interfaces de rede do contêiner do Windows

A MTU de um contêiner do Windows precisa ser configurada enquanto o contêiner está em execução, seja dentro do contêiner ou da instância que hospeda o contêiner. Se o PowerShell estiver disponível em seu contêiner, será possível executar este comando interativamente ou a partir de um script no contêiner para definir corretamente a MTU:

PS C:\> Get-NetAdapter | Where-Object Name -like "vEthernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

Ou execute este comando na instância do Windows para definir a MTU para todos os contêineres em execução:

PS C:\> Get-NetIPInterface -IncludeAllCompartments |
  Where-Object InterfaceAlias -like "vEthernet*" |
  Set-NetIPInterface -IncludeAllCompartments -NlMtuBytes 1460

Falha ao iniciar contêineres do Hyper-V

Os contêineres do Hyper-V não são compatíveis no Compute Engine no momento.

A seguir