Nesta página, explicamos como criar e fazer upgrade de clusters usando imagens extraídas de um
espelho de registro, em vez de um registro público, como gcr.io
. Esse
recurso pode ser ativado ou desativado a qualquer momento no ciclo de vida do cluster.
Esta página é destinada a operadores e especialistas em armazenamento que configuram e gerenciam o desempenho, o uso e os gastos de armazenamento. Para saber mais sobre papéis comuns e tarefas de exemplo referenciados no conteúdo do Google Cloud , consulte Tarefas e funções de usuário comuns do GKE.
Um espelho de registro é uma cópia local de um registro público que copia ou espelha
a estrutura do arquivo de registro público. Por exemplo, suponha que o caminho
para o espelho de registro local seja 172.18.0.20:5000
. Quando containerd
encontra uma solicitação para extrair uma imagem como
gcr.io/kubernetes-e2e-test-images/nautilus:1.0
, containerd
tenta extrair
essa imagem, não de gcr.io
, mas do seu registro local no seguinte
caminho: 172.18.0.20:5000/kubernetes-e2e-test-images/nautilus:1.0
. Se a imagem não estiver nesse caminho de registro local, ela será extraída automaticamente do registro público gcr.io
.
Usar um espelho de registro oferece os seguintes benefícios:
- Protege você contra falhas temporárias de registro público.
- Acelera a criação de pods.
- Permite que você faça a própria verificação de vulnerabilidades.
- Evita limites impostos por registros públicos sobre a frequência com que você pode emitir comandos para eles.
Antes de começar
- É preciso ter um servidor do Artifact Registry configurado na rede.
- Se o servidor de registro executar um certificado TLS particular, você precisará ter o arquivo de autoridade de certificação (CA, na sigla em inglês).
- Se o servidor de registros precisar de autenticação, você precisará ter as credenciais de login adequadas ou o arquivo de configuração do Docker.
- Se você estiver usando um registro do Red Hat Quay, talvez seja necessário criar manualmente a estrutura de diretórios do registro local.
- Para usar um espelho de registro, defina o ambiente de execução do contêiner como containerd.
- Verifique se você tem espaço em disco suficiente na estação de trabalho do administrador para fazer upload de imagens. O comando de upload de imagens,
bmctl push images
, descompacta o arquivo de pacote de imagens baixado e extrai todos os arquivos de imagem localmente antes de fazer o upload deles. Você precisa ter pelo menos três vezes mais espaço em disco do que o tamanho do arquivo de pacote de imagens baixadas para acomodar o upload de imagens. Por exemplo, o arquivo compactadobmpackages_1.31.200-gke.59.tar.xz
ocupa aproximadamente 8,5 GB de espaço em disco. Portanto, você precisa ter pelo menos 25,5 GB de espaço livre antes de fazer o download.
Faça o download de todas as imagens necessárias para o Google Distributed Cloud
Faça o download da versão mais recente da ferramenta bmctl
e do pacote de imagens na página
Downloads.
Fazer upload de imagens de contêiner no servidor de registro
Quando você usa bmctl push images
para fazer upload de imagens de contêiner no servidor
do repositório, o bmctl
executa as seguintes etapas em ordem:
Descompacte um pacote de imagens baixado compactado em um arquivo tar, como
bmpackages_1.32.200-gke.104.tar.xz
embmpackages_1.32.200-gke.104.tar
.Extraia todas as imagens do arquivo tar descompactado para um diretório chamado
bmpackages_1.32.200-gke.104
.Envie cada arquivo de imagem para o registro particular especificado.
O
bmctl
usa valores--username
e--password
para autenticação básica e envia as imagens para seu registro particular.
As seções a seguir ilustram algumas variações comuns do comando bmctl push
images
para fazer upload de imagens no servidor do repositório.
Autentique-se no seu registro e compartilhe o certificado TLS
O comando a seguir inclui as flags --username
e --password
para autenticação
do usuário com o servidor de registro. O comando também inclui a flag --cacert
para transmitir o certificado TLS (Transport Layer Security) da CA, que é usado para comunicação segura com o servidor de registro, incluindo pushes e pulls de imagens. Essas flags oferecem segurança básica para o servidor de registro.
Se o servidor de registro exigir autenticação e você não usar as flags
--username
e --password
, será necessário informar as credenciais ao
executar bmctl push images
. Você pode digitar sua senha ou escolher o
arquivo de configuração do Docker que contém as credenciais.
Para fazer upload de imagens com autenticação e um certificado de CA particular, use um comando como este:
bmctl push images \
--source IMAGES_TAR_FILE_PATH \
--private-registry REGISTRY_IP:PORT \
--username USERNAME \
--password PASSWORD \
--cacert CERT_PATH
Substitua:
IMAGES_TAR_FILE_PATH
: o caminho do arquivo tar do pacote de imagens baixadas, comobmpackages_1.32.200-gke.104.tar.xz
.REGISTRY_IP:PORT
: o endereço IP e a porta do servidor de registro privado.USERNAME
: o nome de usuário de um usuário com permissões de acesso para fazer upload de imagens no servidor de registro.PASSWORD
: a senha do usuário para autenticação com o servidor de registro.CERT_PATH
: o caminho do arquivo de certificado de CA, se o servidor de registro usar um certificado TLS particular.
Exemplo:
bmctl push images \
--source bmpackages_1.32.200-gke.104.tar.xz \
--private-registry 172.18.0.20:5000 \
--username alex --password pa55w0rd \
--cacert /etc/pki/tls/certs/ca-bundle.crt
Fazer upload de imagens sem autenticação ou certificados do usuário
Se o servidor de registro não exigir credenciais, como nome de usuário e senha, especifique --need-credential=false
no comando bmctl
. Se o servidor de registro usar um certificado TLS público, não será necessário usar a flag --cacert
. Esse tipo de comando de upload é mais adequado para ambientes de teste, em que a segurança é menos importante do que na produção.
Para fazer upload de imagens sem autenticação ou um certificado de CA particular, use um comando como este:
bmctl push images \
--source IMAGES_TAR_FILE_PATH \
--private-registry REGISTRY_IP:PORT \
--need-credential=false
Exemplo:
bmctl push images \
--source bmpackages_1.32.200-gke.104.tar.xz \
--private-registry 172.18.0.20:5000 \
--need-credential=false.
Ajustar o número de linhas de execução
O upload de imagens pode levar tempo devido ao tamanho e à quantidade de
imagens de contêiner no arquivo tar do pacote de imagens. Aumentar o número de linhas de execução paralelas faz com que a rotina seja executada mais rapidamente. Use a flag --threads
para mudar o número de linhas de execução paralelas usadas pelo bmctl push images
.
Por padrão, a rotina de upload de imagens usa quatro linhas de execução. Se os uploads de imagens levarem muito tempo, aumente esse valor. Como comparativo, em um ambiente de teste do Google, o upload de imagens de uma estação de trabalho com 4 CPUs leva aproximadamente 10 minutos com 8 linhas de execução paralelas.
bmctl push images \
--source IMAGES_TAR_FILE_PATH \
--private-registry REGISTRY_IP:PORT \
--cacert CERT_PATH \
--threads NUM_THREADS
Substitua NUM_THREADS
pelo número de linhas de execução paralelas
usadas para processar os envios de imagens. Por padrão, bmctl push images
usa quatro linhas de execução paralelas.
O comando a seguir aumenta o número de linhas de execução do upload de 4
para 8
e reduz o tempo de upload:
bmctl push images \
--source bmpackages_1.32.200-gke.104.tar.xz \
--private-registry 172.18.0.20:5000 \
--cacert ~/cert.pem \
--threads 8
Fazer upload pelo proxy
Se você precisar de um proxy para fazer upload das imagens da estação de trabalho para o servidor
de registro, adicione os detalhes do proxy antes do comando bmctl
:
HTTPS_PROXY=http://PROXY_IP:PORT bmctl push images \
--source=IMAGES_TAR_FILE_PATH \
--private-registry=REGISTRY_IP:PORT \
--cacert=CERT_PATH
Substitua:
PROXY_IP:PORT
: o endereço IP e a porta do proxy.IMAGES_TAR_FILE_PATH
: o caminho do arquivo tar do pacote de imagens baixadas, comobmpackages_1.32.200-gke.104.tar.xz
.REGISTRY_IP:PORT
: o endereço IP e a porta do servidor de registro privado.CERT_PATH
: o caminho do arquivo de certificado de CA, se o servidor de registro usar um certificado TLS particular.
Digite seu nome de usuário e senha quando solicitado ou selecione um arquivo de configuração do Docker.
O comando a seguir faz upload de imagens por um proxy:
HTTPS_PROXY=http://10.128.0.136:3128 bmctl push images \
--source bmpackages_1.32.200-gke.104.tar.xz \
--private-registry 172.18.0.20:5000 \
--cacert ~/cert.pem
Usar seu próprio namespace com bmctl push images
Se você quiser usar seu próprio namespace no servidor de registros em vez do
namespace raiz, containerd
poderá extrair desse namespace se você fornecer o endpoint da API
para seu registro particular no campo registryMirrors.endpoint
do
arquivo de configuração do cluster. O endpoint geralmente está no formato
<REGISTRY_IP:PORT>/v2/<NAMESPACE>
. Consulte o guia do usuário do seu registro particular para
detalhes específicos. Para mais informações, consulte Sobre o uso de v2
no
endpoint do registro.
bmctl push images \
--source=IMAGES_TAR_FILE_PATH \
--private-registry=REGISTRY_IP:PORT/NAMESPACE \
--cacert=CERT_PATH
Substitua NAMESPACE
pelo nome do namespace no
servidor de registro em que você quer fazer upload de imagens.
Por exemplo, se você só tiver acesso a 198.51.20:5000/test-namespace/
, poderá
usar um comando como o seguinte para fazer upload de todas as imagens no namespace
test-namespace
:
bmctl push images \
--source=./bmpackages_1.32.200-gke.104.tar.xz \
--private-registry=198.51.20:5000/test-namespace \
--username=alex \
--password=pa55w0rd \
--cacert /etc/pki/tls/certs/ca-bundle.crt
Em seguida, no arquivo de configuração do cluster, adicione o seguinte para fazer o
containerd
extrair do namespace test-namespace
:
registryMirrors:
- endpoint: https://198.51.20:5000/v2/test-namespace
Para mais informações sobre o comando bmctl push images
, consulte a referência do comando
bmctl
.
Configurar clusters para usar um espelho de registro
É possível configurar um espelho de registro para um cluster na criação dele ou sempre que você atualizar um cluster atual. O método de configuração usado depende do tipo de cluster e, para clusters de usuário, se você está criando ou atualizando um cluster. As duas seções a seguir descrevem os dois métodos disponíveis para configurar espelhos de registro.
Usar a seção de cabeçalho no arquivo de configuração do cluster
Com o Google Distributed Cloud, é possível especificar espelhos de registro fora da especificação do cluster, na seção de cabeçalho do arquivo de configuração do cluster:
Para clusters de administrador, híbridos e autônomos, a única maneira de configurar um espelho de registro é usar a seção de cabeçalho no arquivo de configuração do cluster. Esse método se aplica à criação ou atualização de clusters.
Para clusters de usuário, use esse método para configurar um espelho de registro somente durante a criação do cluster. Como alternativa, para configurar um espelho de registro para um cluster de usuário atual, use a seção
nodeConfig.registryMirrors
na especificação do cluster.
No exemplo de arquivo de configuração de cluster a seguir, as imagens devem ser extraídas de um espelho de registro local com o endpoint https://198.51.20:5000
. Alguns dos campos que aparecem no início desse arquivo de configuração são descritos nas seções a seguir.
# Sample cluster config with registry mirror:
---
gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json
sshPrivateKeyPath: /root/ssh-key/id_rsa
registryMirrors:
- endpoint: https://198.51.20:5000
caCertPath: /root/ca.crt
pullCredentialConfigPath: /root/.docker/config.json
hosts:
- somehost.io
- otherhost.io
---
apiVersion: v1
kind: Namespace
metadata:
name: cluster-admin1
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: admin1
namespace: cluster-admin1
spec:
nodeConfig:
containerRuntime: containerd
...
Use a seção nodeConfig.registryMirrors
na especificação do cluster
Esse método de criação ou atualização de um espelho de registro se aplica apenas a clusters de usuário. Como é possível compartilhar os secrets criados para o cluster de gerenciamento com
o cluster de usuário, use o nodeConfig.registryMirrors
do
cluster de administrador ou híbrido de gerenciamento para especificar o espelho do registro na especificação
do cluster de usuário.
Para configurar um cluster de usuário para usar o mesmo espelho de registro que o cluster de administrador, siga estas etapas:
Receba a seção
nodeConfig.registryMirror
, incluindo referências secretas, denodeConfig.registryMirrors
do recurso de cluster de administrador:kubectl get cluster CLUSTER_NAME -n CLUSTER_NAMESPACE \ --kubeconfig ADMIN_KUBECONFIG \ -o yaml
Substitua:
CLUSTER_NAME
: o nome do cluster de administrador ou híbrido que gerencia o cluster de usuário.CLUSTER_NAMESPACE
: o nome do namespace do cluster de gerenciamento.ADMIN_KUBECONFIG
: o caminho do arquivo kubeconfig do cluster gerenciado.
Adicione a configuração
nodeConfig.registryMirrors
do cluster de administrador ao arquivo de configuração do cluster de usuário.A seção
registryMirrors
no arquivo de configuração do cluster de usuário deve ser semelhante ao exemplo a seguir:--- gcrKeyPath: /bmctl/bmctl-workspace/.sa-keys/my-gcp-project-anthos-baremetal-gcr.json sshPrivateKeyPath: /root/ssh-key/id_rsa --- apiVersion: v1 kind: Namespace metadata: name: cluster-user1 --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: user1 namespace: cluster-user1 spec: nodeConfig: containerRuntime: containerd registryMirrors: - caCertSecretRef: name: the-secret-created-for-the-admin-cluster namespace: anthos-creds endpoint: https://172.18.0.20:5000 hosts: - somehost.io - otherhost.io pullCredentialSecretRef: name: the-image-pull-creds-created-for-the-admin-cluster namespace: anthos-creds ...
Para fazer mudanças subsequentes na configuração do espelho de registro do cluster de usuário, edite o nodeConfig.registryMirrors
no arquivo de configuração do cluster de
usuário e aplique as mudanças com bmctl update
.
Não é possível usar a seção de cabeçalho do arquivo de configuração do cluster para atualizar a configuração de espelhos de registro de um cluster de usuário.
Campo hosts
containerd
verifica a seção hosts
do arquivo de configuração do cluster para descobrir quais hosts são espelhados localmente. Esses hosts são mapeados para o
endpoint do espelho de registro especificado no arquivo de configuração do cluster
(registryMirror.endpoint
). No arquivo de configuração de exemplo da
seção anterior, os registros públicos listados na seção hosts
são
somehost.io
e otherhost.io
. Como esses registros públicos aparecem na seção
hosts
, o containerd
verifica primeiro o espelho de registro particular quando
encontra solicitações de extração para imagens de somehost.io
ou otherhost.io
.
Por exemplo, suponha que containerd
receba um comando pull para somehost.io/kubernetes-e2e-test-images/nautilus:1.0
. Como somehost.io
está listado como um dos hosts na seção hosts
do arquivo de configuração do cluster, containerd
procura no espelho local do registro a imagem kubernetes-e2e-test-images/nautilus:1.0
. Se somehost.io
não estiver listado
na seção hosts
, containerd
não saberá que um espelho local de
somehost.io
existe. Nesse caso, o containerd
não verifica o espelho da
imagem e extrai a imagem do registro público somehost.io
.
Por padrão, o Google Distributed Cloud espelha automaticamente imagens de
gcr.io
. Portanto, não é necessário listar gcr.io
como um host na seção hosts
.
Os valores hosts
e endpoint
não podem se sobrepor. Por exemplo, a
amostra de configuração a seguir mostra um host, europe-docker.pkg.dev
, que
corresponde à parte do domínio do valor do endpoint. Nesse caso, não é necessário especificar um valor de hosts
:
...
registryMirrors:
...
endpoint: https://europe-docker.pkg.dev:5000/v2/cloud-data-fusion-images
hosts:
- europe-docker.pkg.dev
...
Campo gcrKeyPath
Se você quiser que o Google Distributed Cloud use automaticamente o Artifact Registry
(gcr.io
) para extrair imagens que não aparecem no registro local, especifique o
caminho para a chave da conta de serviço do Artifact Registry.
O Google Distributed Cloud não tem um mecanismo para fornecer chaves a outros registros públicos.
Se você não planeja usar o recurso em que as imagens são extraídas de gcr.io
quando elas não aparecem no seu registro local, não é necessário adicionar um
gcrKeyPath
ao arquivo de configuração do cluster.
Campo caCertPath
Se o registro exigir um certificado Transport Layer Security (TLS),
esse campo usará o caminho para o arquivo de certificado da CA raiz do servidor. Esse
arquivo de certificado precisa estar na estação de trabalho do administrador, a máquina que executa os comandos
bmctl
. Se o registro não exigir um certificado TLS particular, deixe
o campo caCertPath
em branco.
Campo pullCredentialConfigPath
Se o servidor de registro não exigir um arquivo de configuração do Docker de
autenticação, deixe o campo pullCredentialConfigPath
em branco. Esse é
o caminho para o arquivo de configuração na máquina que executa os comandos bmctl
.
Usar um espelho de registro com clusters de usuário
Os clusters de usuário não extrairão automaticamente as imagens de um espelho de registro se o cluster de administrador tiver sido configurado para fazer isso. Para que os clusters de usuário sejam extraídos de um espelho de registro, é necessário configurá-los individualmente, conforme descrito em Configurar clusters para usar um espelho de registro.
Atualizar endpoints de espelho de registro, certificados e credenciais de pull
Para atualizar endpoints de espelho do registro, certificados ou credenciais de pull:
No arquivo de configuração do cluster, atualize o endpoint, o arquivo de certificado de CA e o caminho do arquivo de configuração de credencial.
Aplique as alterações executando:
bmctl update cluster -c CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
Substitua:
CLUSTER_NAME
pelo nome do cluster que você quer atualizar.ADMIN_KUBECONFIG
pelo caminho do arquivo de configuração do cluster de administrador.
Verificar se as imagens foram extraídas do espelho de registro
É possível determinar se containerd
está extraindo imagens do seu registro
local examinando o conteúdo de um arquivo config.toml
, conforme mostrado nas
seguintes etapas:
Faça login em um nó e examine o conteúdo do seguinte arquivo:
/etc/containerd/config.toml
Verifique a seção
plugins."io.containerd.grpc.v1.cri".registry.mirrors
do arquivoconfig.toml
para ver se o servidor de registro está listado no campoendpoint
. Confira um trecho de um exemplo de arquivoconfig.toml
em que o campoendpoint
aparece em negrito:version = 2 root = "/var/lib/containerd" state = "/run/containerd" ... [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."gcr.io"] [plugins."io.containerd.grpc.v1.cri".registry.configs."privateregistry2.io".tls] ca_file = '/etc/containerd/certs.d/privateregistry2.io/ca.crt' [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"] endpoint = ["http://privateregistry.io", "https://privateregistry2.io"] ...
Se o espelho do registro aparecer no campo
endpoint
, o nó estará extraindo imagens do espelho do registro, em vez de um registro público.
Resolver problemas nas configurações de espelho de registro
Use o crictl
, a ferramenta de linha de comando da interface de tempo de execução do contêiner, para testar
as configurações do registro baixando arquivos de imagem individuais. Cada arquivo de imagem é
marcado de forma independente com uma string de versão significativa. Por exemplo, a imagem do controlador da API do cluster é marcada com a versão do Google Distributed Cloud, e a imagem do etcd é marcada com a versão correspondente do etcd.
Para a versão 1.31.200-gke.59 do Google Distributed Cloud em bare metal, a imagem do controlador da API de cluster, cluster-api-controller
, e a imagem do etcd, etcd
, têm as seguintes tags:
cluster-api-controller:1.31.200-gke.59
etcd:v3.4.30-0-gke.1
Extrair uma imagem do espelho de registro
Se o espelho de registro não usar namespaces, use o seguinte comando para extrair uma imagem:
crictl pull REGISTRY_IP:PORT/IMAGE_PATH:IMAGE_TAG
Extrair uma imagem de um espelho de registro que usa namespaces
Se o espelho de registro usar namespaces, use o seguinte comando para extrair uma imagem:
crictl pull REGISTRY_IP:PORT/NAMESPACE/IMAGE_PATH:IMAGE_TAG
Sobre o uso de v2
no endpoint de registro
Quando o registro usa namespaces personalizados, é necessário adicionar o namespace ao endpoint do registro (registryMirror.endpoint
) no arquivo de configuração do cluster com v2/
. Se você não estiver usando namespaces, não use v2
. Em qualquer caso, não use v2
no valor da flag --private-registry
ou nos comandos de extração de imagens:
Sem namespaces
- Válido:
endpoint: https://172.18.0.20:5000
crictl pull 172.18.0.20:5000/anthos-baremetal-release/etcd:v3.4.30-0-gke.1
- Inválido:
endpoint: https://172.18.0.20:5000/v2
crictl pull 172.18.0.20:5000/v2/anthos-baremetal-release/etcd:v3.4.30-0-gke.1
Com namespaces
- Válido:
endpoint: https://172.18.0.21:5000/v2/namespace
crictl 172.18.0.21:5000/namespace/anthos-baremetal-release/etcd:v3.4.30-0-gke.1
- Inválido:
endpoint: https://172.18.0.21:5000/namespace
crictl pull 172.18.0.21:5000/v2/namespace/anthos-baremetal-release/etcd:v3.4.30-0-gke.1