|
| 1 | +--- |
| 2 | +reviewers: |
| 3 | +- femrtnz |
| 4 | +- jcjesus |
| 5 | +- hugopfeffer |
| 6 | +title: Imagens |
| 7 | +content_type: concept |
| 8 | +weight: 10 |
| 9 | +--- |
| 10 | + |
| 11 | +<!-- overview --> |
| 12 | + |
| 13 | +Uma imagem de contêiner representa dados binários que encapsulam uma aplicação e todas as suas dependências de software. As imagens de contêiner são pacotes de software executáveis que podem ser executados de forma autônoma e que fazem suposições muito bem definidas sobre seu agente de execução do ambiente. |
| 14 | + |
| 15 | +Normalmente, você cria uma imagem de contêiner da sua aplicação e a envia para um registro antes de fazer referência a ela em um {{< glossary_tooltip text="Pod" term_id="pod" >}} |
| 16 | + |
| 17 | +Esta página fornece um resumo sobre o conceito de imagem de contêiner. |
| 18 | + |
| 19 | +<!-- body --> |
| 20 | + |
| 21 | +## Nomes das imagens |
| 22 | + |
| 23 | +As imagens de contêiner geralmente recebem um nome como `pause`, `exemplo/meuconteiner`, ou `kube-apiserver`. |
| 24 | +As imagens também podem incluir um hostname de algum registro; por exemplo: `exemplo.registro.ficticio/nomeimagem`, |
| 25 | +e um possível número de porta; por exemplo: `exemplo.registro.ficticio:10443/nomeimagem`. |
| 26 | + |
| 27 | +Se você não especificar um hostname de registro, o Kubernetes presumirá que você se refere ao registro público do Docker. |
| 28 | + |
| 29 | +Após a parte do nome da imagem, você pode adicionar uma _tag_ (como também usar com comandos como `docker` e` podman`). |
| 30 | +As tags permitem identificar diferentes versões da mesma série de imagens. |
| 31 | + |
| 32 | +Tags de imagem consistem em letras maiúsculas e minúsculas, dígitos, sublinhados (`_`), |
| 33 | +pontos (`.`) e travessões (` -`). |
| 34 | +Existem regras adicionais sobre onde você pode colocar o separador |
| 35 | +caracteres (`_`,`-` e `.`) dentro de uma tag de imagem. |
| 36 | +Se você não especificar uma tag, o Kubernetes presumirá que você se refere à tag `latest` (mais recente). |
| 37 | + |
| 38 | +{{< caution >}} |
| 39 | +Você deve evitar usar a tag `latest` quando estiver realizando o deploy de contêineres em produção, |
| 40 | +pois é mais difícil rastrear qual versão da imagem está sendo executada, além de tornar mais difícil o processo de reversão para uma versão funcional. |
| 41 | + |
| 42 | +Em vez disso, especifique uma tag significativa, como `v1.42.0`. |
| 43 | +{{< /caution >}} |
| 44 | + |
| 45 | +## Atualizando imagens |
| 46 | + |
| 47 | +A política padrão de pull é `IfNotPresent` a qual faz com que o |
| 48 | +{{<glossary_tooltip text = "kubelet" term_id = "kubelet">}} ignore |
| 49 | +o processo de *pull* da imagem, caso a mesma já exista. Se você prefere sempre forçar o processo de *pull*, |
| 50 | +você pode seguir uma das opções abaixo: |
| 51 | + |
| 52 | +- defina a `imagePullPolicy` do contêiner para` Always`. |
| 53 | +- omita `imagePullPolicy` e use`: latest` como a tag para a imagem a ser usada. |
| 54 | +- omita o `imagePullPolicy` e a tag da imagem a ser usada. |
| 55 | +- habilite o [AlwaysPullImages](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages) controlador de admissão. |
| 56 | + |
| 57 | +Quando `imagePullPolicy` é definido sem um valor específico, ele também é definido como` Always`. |
| 58 | + |
| 59 | +## Multiarquitetura de imagens com índice de imagens |
| 60 | + |
| 61 | +Além de fornecer o binário das imagens, um registro de contêiner também pode servir um [índice de imagem do contêiner](https://github.com/opencontainers/image-spec/blob/master/image-index.md). Um índice de imagem pode apontar para múltiplos [manifestos da imagem](https://github.com/opencontainers/image-spec/blob/master/manifest.md) para versões específicas de arquitetura de um contêiner. A ideia é que você possa ter um nome para uma imagem (por exemplo: `pause`, `exemple/meuconteiner`, `kube-apiserver`) e permitir que diferentes sistemas busquem o binário da imagem correta para a arquitetura de máquina que estão usando. |
| 62 | + |
| 63 | +O próprio Kubernetes normalmente nomeia as imagens de contêiner com o sufixo `-$(ARCH)`. Para retrocompatibilidade, gere as imagens mais antigas com sufixos. A ideia é gerar a imagem `pause` que tem o manifesto para todas as arquiteturas e `pause-amd64` que é retrocompatível com as configurações anteriores ou arquivos YAML que podem ter codificado as imagens com sufixos. |
| 64 | + |
| 65 | +## Usando um registro privado |
| 66 | + |
| 67 | +Os registros privados podem exigir chaves para acessar as imagens deles. |
| 68 | +As credenciais podem ser fornecidas de várias maneiras: |
| 69 | + - Configurando nós para autenticação em um registro privado |
| 70 | + - todos os pods podem ler qualquer registro privado configurado |
| 71 | + - requer configuração de nó pelo administrador do cluster |
| 72 | + - Imagens pré-obtidas |
| 73 | + - todos os pods podem usar qualquer imagem armazenada em cache em um nó |
| 74 | + - requer acesso root a todos os nós para configurar |
| 75 | + - Especificando ImagePullSecrets em um Pod |
| 76 | + - apenas pods que fornecem chaves próprias podem acessar o registro privado |
| 77 | + - Extensões locais ou específicas do fornecedor |
| 78 | + - se estiver usando uma configuração de nó personalizado, você (ou seu provedor de nuvem) pode implementar seu mecanismo para autenticar o nó ao registro do contêiner. |
| 79 | + |
| 80 | +Essas opções são explicadas com mais detalhes abaixo. |
| 81 | + |
| 82 | +### Configurando nós para autenticação em um registro privado |
| 83 | + |
| 84 | +Se você executar o Docker em seus nós, poderá configurar o contêiner runtime do Docker |
| 85 | +para autenticação em um registro de contêiner privado. |
| 86 | + |
| 87 | +Essa abordagem é adequada se você puder controlar a configuração do nó. |
| 88 | + |
| 89 | +{{< note >}} |
| 90 | +O Kubernetes padrão é compatível apenas com as seções `auths` e` HttpHeaders` na configuração do Docker. |
| 91 | +Auxiliares de credencial do Docker (`credHelpers` ou` credsStore`) não são suportados. |
| 92 | +{{< /note >}} |
| 93 | + |
| 94 | +Docker armazena chaves de registros privados no arquivo `$HOME/.dockercfg` ou `$HOME/.docker/config.json`. Se você colocar o mesmo arquivo na lista de caminhos de pesquisa abaixo, o kubelet o usa como provedor de credenciais ao obter imagens. |
| 95 | + |
| 96 | +* `{--root-dir:-/var/lib/kubelet}/config.json` |
| 97 | +* `{cwd of kubelet}/config.json` |
| 98 | +* `${HOME}/.docker/config.json` |
| 99 | +* `/.docker/config.json` |
| 100 | +* `{--root-dir:-/var/lib/kubelet}/.dockercfg` |
| 101 | +* `{cwd of kubelet}/.dockercfg` |
| 102 | +* `${HOME}/.dockercfg` |
| 103 | +* `/.dockercfg` |
| 104 | + |
| 105 | +{{< note >}} |
| 106 | +Você talvez tenha que definir `HOME=/root` explicitamente no ambiente do processo kubelet. |
| 107 | +{{< /note >}} |
| 108 | + |
| 109 | +Aqui estão as etapas recomendadas para configurar seus nós para usar um registro privado. Neste |
| 110 | +exemplo, execute-os em seu desktop/laptop: |
| 111 | + |
| 112 | + 1. Execute `docker login [servidor]` para cada conjunto de credenciais que deseja usar. Isso atualiza o `$HOME/.docker/config.json` em seu PC. |
| 113 | + 1. Visualize `$HOME/.docker/config.json` em um editor para garantir que contém apenas as credenciais que você deseja usar. |
| 114 | + 1. Obtenha uma lista de seus nós; por exemplo: |
| 115 | + - se você quiser os nomes: `nodes=$( kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}' )` |
| 116 | + - se você deseja obter os endereços IP: `nodes=$( kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}' )` |
| 117 | + 1. Copie seu `.docker/config.json` local para uma das listas de caminhos de busca acima. |
| 118 | + - por exemplo, para testar isso: `for n in $nodes; do scp ~/.docker/config.json root@"$n":/var/lib/kubelet/config.json; done` |
| 119 | + |
| 120 | +{{< note >}} |
| 121 | +Para clusters de produção, use uma ferramenta de gerenciamento de configuração para que você possa aplicar esta |
| 122 | +configuração em todos os nós que você precisar. |
| 123 | +{{< /note >}} |
| 124 | + |
| 125 | +Verifique se está funcionando criando um pod que usa uma imagem privada; por exemplo: |
| 126 | + |
| 127 | +```shell |
| 128 | +kubectl apply -f - <<EOF |
| 129 | +apiVersion: v1 |
| 130 | +kind: Pod |
| 131 | +metadata: |
| 132 | + name: private-image-test-1 |
| 133 | +spec: |
| 134 | + containers: |
| 135 | + - name: uses-private-image |
| 136 | + image: $PRIVATE_IMAGE_NAME |
| 137 | + imagePullPolicy: Always |
| 138 | + command: [ "echo", "SUCCESS" ] |
| 139 | +EOF |
| 140 | +``` |
| 141 | +``` |
| 142 | +pod/private-image-test-1 created |
| 143 | +``` |
| 144 | + |
| 145 | +Se tudo estiver funcionando, então, após algum tempo, você pode executar: |
| 146 | + |
| 147 | +```shell |
| 148 | +kubectl logs private-image-test-1 |
| 149 | +``` |
| 150 | +e veja o resultado do comando: |
| 151 | +``` |
| 152 | +SUCCESS |
| 153 | +``` |
| 154 | + |
| 155 | +Se você suspeitar que o comando falhou, você pode executar: |
| 156 | +```shell |
| 157 | +kubectl describe pods/private-image-test-1 | grep 'Failed' |
| 158 | +``` |
| 159 | +Em caso de falha, a saída é semelhante a: |
| 160 | +``` |
| 161 | + Fri, 26 Jun 2015 15:36:13 -0700 Fri, 26 Jun 2015 15:39:13 -0700 19 {kubelet node-i2hq} spec.containers{uses-private-image} failed Failed to pull image "user/privaterepo:v1": Error: image user/privaterepo:v1 not found |
| 162 | +``` |
| 163 | + |
| 164 | + |
| 165 | +Você deve garantir que todos os nós no cluster tenham o mesmo `.docker/config.json`. Caso contrário, os pods serão executados com sucesso em alguns nós e falharão em outros. Por exemplo, se você usar o escalonamento automático de nós, cada modelo de instância precisa incluir o `.docker/config.json` ou montar um drive que o contenha. |
| 166 | + |
| 167 | +Todos os pods terão premissão de leitura às imagens em qualquer registro privado, uma vez que |
| 168 | +as chaves privadas do registro são adicionadas ao `.docker/config.json`. |
| 169 | + |
| 170 | +### Imagens pré-obtidas |
| 171 | + |
| 172 | +{{< note >}} |
| 173 | +Essa abordagem é adequada se você puder controlar a configuração do nó. Isto |
| 174 | +não funcionará de forma confiável se o seu provedor de nuvem for responsável pelo gerenciamento de nós e os substituir |
| 175 | +automaticamente. |
| 176 | +{{< /note >}} |
| 177 | + |
| 178 | +Por padrão, o kubelet tenta realizar um "pull" para cada imagem do registro especificado. |
| 179 | +No entanto, se a propriedade `imagePullPolicy` do contêiner for definida como` IfNotPresent` ou `Never`, |
| 180 | +em seguida, uma imagem local é usada (preferencial ou exclusivamente, respectivamente). |
| 181 | + |
| 182 | +Se você quiser usar imagens pré-obtidas como um substituto para a autenticação do registro, |
| 183 | +você deve garantir que todos os nós no cluster tenham as mesmas imagens pré-obtidas. |
| 184 | + |
| 185 | +Isso pode ser usado para pré-carregar certas imagens com o intuíto de aumentar a velocidade ou como uma alternativa para autenticação em um registro privado. |
| 186 | + |
| 187 | +Todos os pods terão permissão de leitura a quaisquer imagens pré-obtidas. |
| 188 | + |
| 189 | +### Especificando imagePullSecrets em um pod |
| 190 | + |
| 191 | +{{< note >}} |
| 192 | +Esta é a abordagem recomendada para executar contêineres com base em imagens |
| 193 | +de registros privados. |
| 194 | +{{< /note >}} |
| 195 | + |
| 196 | +O Kubernetes oferece suporte à especificação de chaves de registro de imagem de contêiner em um pod. |
| 197 | + |
| 198 | +#### Criando um segredo com Docker config |
| 199 | + |
| 200 | +Execute o seguinte comando, substituindo as palavras em maiúsculas com os valores apropriados: |
| 201 | + |
| 202 | +```shell |
| 203 | +kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL |
| 204 | +``` |
| 205 | + |
| 206 | +Se você já tem um arquivo de credenciais do Docker, em vez de usar o |
| 207 | +comando acima, você pode importar o arquivo de credenciais como um Kubernetes |
| 208 | +{{< glossary_tooltip text="Secrets" term_id="secret" >}}. |
| 209 | +[Criar um segredo com base nas credenciais Docker existentes](/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials) explica como configurar isso. |
| 210 | + |
| 211 | +Isso é particularmente útil se você estiver usando vários registros privados de contêineres, como `kubectl create secret docker-registry` cria um Segredo que |
| 212 | +só funciona com um único registro privado. |
| 213 | + |
| 214 | +{{< note >}} |
| 215 | +Os pods só podem fazer referência a *pull secrets* de imagem em seu próprio namespace, |
| 216 | +portanto, esse processo precisa ser feito uma vez por namespace. |
| 217 | +{{< /note >}} |
| 218 | + |
| 219 | +#### Referenciando um imagePullSecrets em um pod |
| 220 | + |
| 221 | +Agora, você pode criar pods que fazem referência a esse segredo adicionando uma seção `imagePullSecrets` |
| 222 | +na definição de Pod. |
| 223 | + |
| 224 | +Por exemplo: |
| 225 | + |
| 226 | +```shell |
| 227 | +cat <<EOF > pod.yaml |
| 228 | +apiVersion: v1 |
| 229 | +kind: Pod |
| 230 | +metadata: |
| 231 | + name: foo |
| 232 | + namespace: awesomeapps |
| 233 | +spec: |
| 234 | + containers: |
| 235 | + - name: foo |
| 236 | + image: janedoe/awesomeapp:v1 |
| 237 | + imagePullSecrets: |
| 238 | + - name: myregistrykey |
| 239 | +EOF |
| 240 | +cat <<EOF >> ./kustomization.yaml |
| 241 | +resources: |
| 242 | +- pod.yaml |
| 243 | +EOF |
| 244 | +``` |
| 245 | + |
| 246 | +Isso precisa ser feito para cada pod que está usando um registro privado. |
| 247 | + |
| 248 | +No entanto, a configuração deste campo pode ser automatizada definindo o imagePullSecrets |
| 249 | +em um recurso de [ServiceAccount](/docs/tasks/configure-pod-container/configure-service-account/). |
| 250 | + |
| 251 | +Verifique [Adicionar ImagePullSecrets a uma conta de serviço](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account) para obter instruções detalhadas. |
| 252 | + |
| 253 | +Você pode usar isso em conjunto com um `.docker / config.json` por nó. As credenciais |
| 254 | +serão mescladas. |
| 255 | + |
| 256 | +## Casos de uso |
| 257 | + |
| 258 | +Existem várias soluções para configurar registros privados. Aqui estão alguns |
| 259 | +casos de uso comuns e soluções sugeridas. |
| 260 | + |
| 261 | +1. Cluster executando apenas imagens não proprietárias (por exemplo, código aberto). Não há necessidade de ocultar imagens. |
| 262 | + - Use imagens públicas no Docker hub. |
| 263 | + - Nenhuma configuração necessária. |
| 264 | + - Alguns provedores de nuvem armazenam em cache ou espelham automaticamente imagens públicas, o que melhora a disponibilidade e reduz o tempo para extrair imagens. |
| 265 | +1. Cluster executando algumas imagens proprietárias que devem ser ocultadas para quem está fora da empresa, mas |
| 266 | + visível para todos os usuários do cluster. |
| 267 | + - Use um [registro Docker](https://docs.docker.com/registry/) privado hospedado. |
| 268 | + - Pode ser hospedado no [Docker Hub](https://hub.docker.com/signup) ou em outro lugar. |
| 269 | + - Configure manualmente .docker/config.json em cada nó conforme descrito acima. |
| 270 | + - Ou execute um registro privado interno atrás de seu firewall com permissão de leitura. |
| 271 | + - Nenhuma configuração do Kubernetes é necessária. |
| 272 | + - Use um serviço de registro de imagem de contêiner que controla o acesso à imagem |
| 273 | + - Funcionará melhor com o escalonamento automático do cluster do que com a configuração manual de nós. |
| 274 | + - Ou, em um cluster onde alterar a configuração do nó é inconveniente, use `imagePullSecrets`. |
| 275 | +1. Cluster com imagens proprietárias, algumas das quais requerem controle de acesso mais rígido. |
| 276 | + - Certifique-se de que o [controlador de admissão AlwaysPullImages](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages) está ativo. Caso contrário, todos os pods têm potencialmente acesso a todas as imagens. |
| 277 | + - Mova dados confidenciais para um recurso "secreto", em vez de empacotá-los em uma imagem. |
| 278 | +1. Um cluster multilocatário em que cada locatário precisa de seu próprio registro privado. |
| 279 | + - Certifique-se de que o [controlador de admissão AlwaysPullImages](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages) está ativo. Caso contrário, todos os Pods de todos os locatários terão potencialmente acesso a todas as imagens. |
| 280 | + - Execute um registro privado com autorização necessária. |
| 281 | + - Gere credenciais de registro para cada locatário, coloque em segredo e preencha o segredo para cada namespace de locatário. |
| 282 | + - O locatário adiciona esse segredo a imagePullSecrets de cada namespace. |
| 283 | + |
| 284 | + |
| 285 | +Se precisar de acesso a vários registros, você pode criar um segredo para cada registro. |
| 286 | +O Kubelet mesclará qualquer `imagePullSecrets` em um único `.docker/config.json` virtual |
| 287 | + |
| 288 | +## {{% heading "whatsnext" %}} |
| 289 | + |
| 290 | +* Leia a [OCI Image Manifest Specification](https://github.com/opencontainers/image-spec/blob/master/manifest.md) |
0 commit comments