Utilizzare un mirror del registry per le immagini container

Questa pagina spiega come creare e eseguire l'upgrade dei cluster utilizzando le immagini estratte da un mirroring del Registro di sistema anziché da un registry pubblico come gcr.io. Questa funzionalità può essere attivata o disattivata in qualsiasi momento nel ciclo di vita del cluster.

Questa pagina è rivolta a operatori e specialisti di archiviazione che configurano e gestiscono le prestazioni, l'utilizzo e le spese di archiviazione. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività comuni degli utenti di GKE Enterprise. Google Cloud

Un mirror del registry è una copia locale di un registry pubblico che copia o esegue il mirroring della struttura file del registry pubblico. Ad esempio, supponiamo che il percorso al mirror del registry locale sia 172.18.0.20:5000. Quando containerd rileva una richiesta di estrazione di un'immagine come gcr.io/kubernetes-e2e-test-images/nautilus:1.0, containerd tenta di estrarre l'immagine non da gcr.io, ma dal tuo registry locale al seguente percorso: 172.18.0.20:5000/kubernetes-e2e-test-images/nautilus:1.0. Se l'immagine non è in questo percorso del registry locale, viene estratta automaticamente dal registry pubblico gcr.io.

L'utilizzo di un mirror del registry offre i seguenti vantaggi:

  • Ti protegge da interruzioni del registry pubblico.
  • Velocizza la creazione del pod.
  • Ti consente di eseguire la tua analisi delle vulnerabilità.
  • Evita i limiti imposti dai registri pubblici sulla frequenza con cui puoi inviare comandi.

Prima di iniziare

  • Devi avere configurato un server di registry dei container nella tua rete.
  • Se il server del registry esegue un certificato TLS privato, devi disporre del file dell'autorità di certificazione (CA).
  • Se il server del registry richiede l'autenticazione, devi disporre delle credenziali di accesso o del file di configurazione Docker appropriate.
  • Se utilizzi un registry Red Hat Quay, potrebbe essere necessario creare manualmente la struttura di directory del registry locale.
  • Per utilizzare un mirror del registry, devi impostare il runtime del container su containerd.
  • Assicurati di avere spazio su disco sufficiente sulla tua workstation di amministrazione per supportare i caricamenti di immagini. Il comando di caricamento delle immagini, bmctl push images, decomprime il file del pacchetto di immagini scaricato ed estrae tutti i file immagine localmente prima di caricarli. Per poter caricare le immagini, lo spazio su disco deve essere almeno tre volte superiore alle dimensioni del file del pacchetto di immagini scaricato. Ad esempio, il file bmpackages_1.31.200-gke.59.tar.xz compresso occupa circa 8,5 GB di spazio su disco, quindi devi disporre di almeno 25,5 GB di spazio su disco libero prima di scaricare il file.

Scarica tutte le immagini richieste per Google Distributed Cloud

Scarica la versione più recente dello strumento bmctl e del pacchetto di immagini dalla pagina Download.

Carica le immagini container sul server del registry

Quando utilizzi bmctl push images per caricare le immagini container sul server del repository, bmctl push images esegue i seguenti passaggi in ordine:bmctl

  1. Decomprimere un file tar compresso del pacchetto di immagini scaricato, ad esempio bmpackages_1.31.300-gke.81.tar.xz in bmpackages_1.31.300-gke.81.tar.

  2. Estrai tutte le immagini dal file tar decompresso in una directory denominata bmpackages_1.31.300-gke.81.

  3. Esegui il push di ogni file immagine nel registry privato specificato.

    bmctl utilizza i valori --username e --password per l'autenticazione di base per eseguire il push delle immagini nel tuo registry privato.

Le sezioni seguenti illustrano alcune varianti comuni del comando bmctl push images per caricare le immagini sul server del repository.

Esegui l'autenticazione con il registry e condividi il certificato TLS

Il seguente comando include i flag --username e --password per l'autenticazione degli utenti con il server del registry. Il comando include anche il flag --cacert per il passaggio del certificato TLS (Transport Layer Security) dell'autorità di certificazione, utilizzato per la comunicazione sicura del server del registry, inclusi i push e i pull delle immagini. Questi flag forniscono una sicurezza di base per il server del registry.

Se il server del registry richiede l'autenticazione e non utilizzi i flag --username e --password, ti verranno richieste le credenziali quando esegui bmctl push images. Puoi digitare la password o scegliere il file di configurazione di Docker contenente le credenziali.

Per caricare immagini con autenticazione e un certificato CA privato, utilizza un comando come il seguente:

bmctl push images \
    --source IMAGES_TAR_FILE_PATH \
    --private-registry REGISTRY_IP:PORT \
    --username USERNAME \
    --password PASSWORD \
    --cacert CERT_PATH

Sostituisci quanto segue:

  • IMAGES_TAR_FILE_PATH: il percorso del file tar del pacchetto di immagini scaricato, ad esempio bmpackages_1.31.300-gke.81.tar.xz.

  • REGISTRY_IP:PORT: l'indirizzo IP e la porta del server del registry privato.

  • USERNAME: il nome utente di un utente con autorizzazioni di accesso per caricare immagini sul server del registry.

  • PASSWORD: la password dell'utente per l'autenticazione con il server del registry.

  • CERT_PATH: il percorso del file del certificato CA, se il server di registry utilizza un certificato TLS privato.

Ad esempio:

bmctl push images \
    --source bmpackages_1.31.300-gke.81.tar.xz \
    --private-registry 172.18.0.20:5000 \
    --username alex --password pa55w0rd \
    --cacert /etc/pki/tls/certs/ca-bundle.crt

Caricare immagini senza autenticazione utente o certificati

Se il server del registry non richiede credenziali, ad esempio un nome utente e una password, specifica --need-credential=false nel comando bmctl. Se il tuo server di registry utilizza un certificato TLS pubblico, non è necessario utilizzare il --cacert. Questo tipo di comando di caricamento è più adatto per gli ambienti di test, dove la sicurezza è meno importante che in produzione.

Per caricare immagini senza autenticazione o un certificato CA privato, utilizza un comando come il seguente:

bmctl push images \
    --source IMAGES_TAR_FILE_PATH \
    --private-registry REGISTRY_IP:PORT \
    --need-credential=false

Ad esempio:

bmctl push images \
    --source bmpackages_1.31.300-gke.81.tar.xz \
    --private-registry 172.18.0.20:5000 \
    --need-credential=false.

Regolare il numero di thread

La routine di caricamento delle immagini può richiedere molto tempo a causa delle dimensioni e della quantità di immagini container nel file tar del pacchetto di immagini. L'aumento del numero di thread paralleli consente di eseguire la routine più velocemente. Puoi utilizzare il flag --threads per modificare il numero di thread paralleli utilizzati da bmctl push images.

Per impostazione predefinita, la routine di caricamento delle immagini utilizza 4 thread. Se i caricamenti delle immagini impiegano troppo tempo, aumenta questo valore. Come benchmark, in un ambiente di test Google, il caricamento di immagini da una workstation con 4 CPU richiede circa 10 minuti con 8 thread paralleli.

bmctl push images \
    --source IMAGES_TAR_FILE_PATH \
    --private-registry REGISTRY_IP:PORT \
    --cacert CERT_PATH \
    --threads NUM_THREADS

Sostituisci NUM_THREADS con il numero di thread paralleli utilizzati per elaborare i caricamenti delle immagini. Per impostazione predefinita, bmctl push images utilizza quattro thread paralleli.

Il seguente comando aumenta il numero di thread per il caricamento da 4 a 8 per ridurre il tempo di caricamento:

bmctl push images \
    --source bmpackages_1.31.300-gke.81.tar.xz \
    --private-registry 172.18.0.20:5000 \
    --cacert ~/cert.pem \
    --threads 8

Caricamento tramite proxy

Se hai bisogno di un proxy per caricare le immagini dalla tua workstation al server del registry, puoi aggiungere i dettagli del proxy prima del comando bmctl:

HTTPS_PROXY=http://PROXY_IP:PORT bmctl push images \
    --source=IMAGES_TAR_FILE_PATH \
    --private-registry=REGISTRY_IP:PORT \
    --cacert=CERT_PATH

Sostituisci quanto segue:

  • PROXY_IP:PORT: l'indirizzo IP e la porta del proxy.

  • IMAGES_TAR_FILE_PATH: il percorso del file tar del pacchetto di immagini scaricato, ad esempio bmpackages_1.31.300-gke.81.tar.xz.

  • REGISTRY_IP:PORT: l'indirizzo IP e la porta del server del registry privato.

  • CERT_PATH: il percorso del file del certificato CA, se il server di registry utilizza un certificato TLS privato.

Inserisci il tuo nome utente e la password quando richiesto o seleziona un file di configurazione Docker.

Il seguente comando carica le immagini tramite un proxy:

HTTPS_PROXY=http://10.128.0.136:3128 bmctl push images \
    --source bmpackages_1.31.300-gke.81.tar.xz \
    --private-registry 172.18.0.20:5000 \
    --cacert ~/cert.pem

Utilizzare il proprio spazio dei nomi con bmctl push images

Se vuoi utilizzare il tuo spazio dei nomi nel server del registry anziché lo spazio dei nomi principale, containerd può estrarre dati da questo spazio dei nomi se fornisci l'endpoint API per il tuo registry privato nel campo registryMirrors.endpoint del file di configurazione del cluster. In genere, l'endpoint è nel formato <REGISTRY_IP:PORT>/v2/<NAMESPACE>. Per dettagli specifici, consulta la guida dell'utente del registry privato. Per ulteriori informazioni, consulta Informazioni sull'utilizzo di v2 nell'endpoint del registry.

bmctl push images \
    --source=IMAGES_TAR_FILE_PATH \
    --private-registry=REGISTRY_IP:PORT/NAMESPACE \
    --cacert=CERT_PATH

Sostituisci NAMESPACE con il nome dello spazio dei nomi nel server del registry in cui vuoi caricare le immagini.

Ad esempio, se hai accesso solo a 198.51.20:5000/test-namespace/, puoi utilizzare un comando come il seguente per caricare tutte le immagini nello spazio dei nomi test-namespace:

bmctl push images \
    --source=./bmpackages_1.31.300-gke.81.tar.xz \
    --private-registry=198.51.20:5000/test-namespace \
    --username=alex \
    --password=pa55w0rd \
    --cacert /etc/pki/tls/certs/ca-bundle.crt

Poi, nel file di configurazione del cluster, puoi aggiungere quanto segue per eseguire il pull di containerd dallo spazio dei nomi test-namespace:

registryMirrors:
  - endpoint: https://198.51.20:5000/v2/test-namespace

Per ulteriori informazioni sul comando bmctl push images, consulta il riferimento al comando bmctl.

Configurare i cluster per l'utilizzo di un mirror del registry

Puoi configurare un mirror del registry per un cluster al momento della creazione o ogni volta che aggiorni un cluster esistente. Il metodo di configurazione utilizzato dipende dal tipo di cluster e, per i cluster utente, dal fatto che tu stia creando o aggiornando un cluster. Le due sezioni seguenti descrivono i due metodi disponibili per la configurazione degli specchi del registry.

Utilizza la sezione dell'intestazione nel file di configurazione del cluster

Google Distributed Cloud ti consente di specificare i mirror del registry al di fuori della specifica del cluster, nella sezione dell'intestazione del file di configurazione del cluster:

  • Per i cluster di amministrazione, ibrida e autonomi, l'unico modo per configurare un mirror del registry è utilizzare la sezione dell'intestazione nel file di configurazione del cluster. Questo metodo si applica alla creazione o agli aggiornamenti dei cluster.

  • Per i cluster utente, puoi utilizzare questo metodo per configurare un mirroring del Registro di sistema solo durante la creazione del cluster. In alternativa, per configurare un mirroring del Registro di sistema per un cluster utente esistente, utilizza la sezione nodeConfig.registryMirrors nella specifica del cluster.

Il seguente file di configurazione del cluster di esempio specifica che le immagini devono essere recuperate da un mirror del registry locale il cui endpoint è https://198.51.20:5000. Alcuni dei campi visualizzati all'inizio di questo file di configurazione sono descritti nelle sezioni seguenti.

# 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
...

Utilizza la sezione nodeConfig.registryMirrors nella specifica del cluster

Questo metodo per creare o aggiornare un mirror del registry si applica solo ai cluster di utenti. Poiché puoi condividere i secret creati per il cluster di gestione con il tuo cluster utente, puoi utilizzare nodeConfig.registryMirrors dal cluster di gestione amministrativo o ibrida per specificare il mirroring del Registro di sistema nella specifica del cluster per il cluster utente.

Per configurare un cluster utente in modo che utilizzi lo stesso mirroring del Registro di sistema del cluster di amministrazione:

  1. Recupera la sezione nodeConfig.registryMirror, inclusi i riferimenti ai secret, da nodeConfig.registryMirrors della risorsa cluster di amministrazione:

    kubectl get cluster CLUSTER_NAME -n CLUSTER_NAMESPACE \
        --kubeconfig ADMIN_KUBECONFIG \
        -o yaml
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster di amministrazione o ibrido che gestisce il cluster utente.

    • CLUSTER_NAMESPACE: il nome dello spazio dei nomi per il cluster di gestione.

    • ADMIN_KUBECONFIG: il percorso del file kubeconfig del cluster di gestione.

  2. Aggiungi la configurazione nodeConfig.registryMirrors dal cluster di amministrazione al file di configurazione del cluster del cluster utente.

    La sezione registryMirrors nel file di configurazione del cluster utente dovrebbe essere simile all'esempio seguente:

    ---
    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
    ...
    

Per apportare modifiche successive alla configurazione del mirroring del Registro di sistema per il tuo cluster di utenti, modifica nodeConfig.registryMirrors nel file di configurazione del cluster di utenti e applica le modifiche con bmctl update.

Non puoi utilizzare la sezione dell'intestazione del file di configurazione del cluster per aggiornare la configurazione dei mirror del registry per un cluster di utenti.

Campo hosts

containerd controlla la sezione hosts del file di configurazione del cluster per scoprire quali host sono sottoposti a mirroring localmente. Questi host sono mappati all'endpoint del mirror del registry specificato nel file di configurazione del cluster (registryMirror.endpoint). Nel file di configurazione di esempio della sezione precedente, i registry pubblici elencati nella sezione hosts sono somehost.io e otherhost.io. Poiché questi registri pubblici vengono visualizzati nella sezione hosts, containerd controlla prima il mirror del registry privato quando rileva richieste pull per le immagini da somehost.io o otherhost.io.

Ad esempio, supponiamo che containerd riceva un comando pull per somehost.io/kubernetes-e2e-test-images/nautilus:1.0. Poiché somehost.io è elencato come uno degli host nella sezione hosts del file di configurazione del cluster, containerd cerca l'immagine kubernetes-e2e-test-images/nautilus:1.0 nel mirror del registry locale. Se somehost.io non è elencato nella sezione hosts, containerd non sa che esiste un mirror locale di somehost.io. In questo caso, containerd non controlla se l'immagine è presente nel mirror e la estrae dal registry pubblico somehost.io.

Tieni presente che per impostazione predefinita, Google Distributed Cloud esegue automaticamente il mirroring delle immagini da gcr.io, quindi non è necessario elencare gcr.io come host nella sezione hosts.

I valori hosts e il valore endpoint non devono sovrapporsi. Ad esempio, il seguente esempio di configurazione mostra un host, europe-docker.pkg.dev, che corrisponde alla parte di dominio del valore dell'endpoint. In questo caso, non è necessario specificare un valore hosts:

...
registryMirrors:
  ...
  endpoint: https://europe-docker.pkg.dev:5000/v2/cloud-data-fusion-images
  hosts:
    - europe-docker.pkg.dev
    ...

Campo gcrKeyPath

Se vuoi che Google Distributed Cloud utilizzi automaticamente Container Registry (gcr.io) per estrarre le immagini che non compaiono nel tuo registry locale, devi specificare il percorso della chiave dell'account di servizio Container Registry. Google Distributed Cloud non dispone di un meccanismo per fornire chiavi per altri registrar pubblici.

Se non prevedi di utilizzare la funzionalità in cui le immagini vengono estratte da gcr.io quando non vengono visualizzate nel tuo registry locale, non devi aggiungere un gcrKeyPath al file di configurazione del cluster.

Campo caCertPath

Se il registry richiede un certificato TLS (Transport Layer Security) privato, questo campo prende il percorso del file del certificato CA radice del server. Questo file del certificato deve trovarsi sulla workstation di amministrazione, la macchina su cui vengono eseguiti i comandi bmctl. Se il tuo registry non richiede un certificato TLS privato, puoi lasciare vuoto il campo caCertPath.

Campo pullCredentialConfigPath

Se il server del registry non richiede un file di configurazione Docker per l'autenticazione, puoi lasciare vuoto il campo pullCredentialConfigPath. Tieni presente che si tratta del percorso del file di configurazione sulla macchina su cui vengono eseguiti i comandi bmctl.

Utilizzare un mirror del registry con i cluster utente

I cluster utente non estraggono automaticamente le immagini da un mirroring del Registro di sistema, se il cluster di amministrazione è stato configurato. Per fare in modo che i cluster utente estraggano le immagini da un mirroring del Registro di sistema, devi configurarli singolarmente come descritto in Configurare i cluster per l'utilizzo di un mirroring del Registro di sistema.

Aggiorna gli endpoint di mirroring del registry, i certificati e le credenziali di pull

Per aggiornare gli endpoint di mirroring del registry, i certificati o le credenziali pull:

  1. Nel file di configurazione del cluster, aggiorna l'endpoint, il file del certificato CA e il percorso del file di configurazione delle credenziali pull.

  2. Applica le modifiche eseguendo:

    bmctl update cluster -c CLUSTER_NAME --kubeconfig=ADMIN_KUBECONFIG
    

    Sostituisci quanto segue:

    • CLUSTER_NAME con il nome del cluster da aggiornare.

    • ADMIN_KUBECONFIG con il percorso del file di configurazione del cluster di amministrazione.

Verificare che le immagini vengano estratte dal mirror del registry

Puoi determinare se containerd estrae le immagini dal tuo registry locale esaminando i contenuti di un file config.toml, come mostrato nei passaggi che seguono:

  1. Accedi a un nodo ed esamina i contenuti del seguente file: /etc/containerd/config.toml

  2. Controlla la sezione plugins."io.containerd.grpc.v1.cri".registry.mirrors del file config.toml per verificare se il tuo server di registry è elencato nel campo endpoint. Ecco un estratto di un file config.toml di esempio in cui il campo endpoint è visualizzato in grassetto:

    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", "http://privateregistry2.io"]
    ...
    

    Se il mirror del registry viene visualizzato nel campo endpoint, il nodo sta estraendo le immagini dal mirror del registry anziché da un registry pubblico.

Risolvere i problemi relativi alle impostazioni dei mirror del registro

Puoi utilizzare crictl, lo strumento a riga di comando dell'interfaccia di runtime del contenitore, per testare le impostazioni del registry scaricando singoli file immagine. Ogni file immagine viene contrassegnato in modo indipendente con una stringa di versione significativa. Ad esempio, l'immagine del controller API del cluster è contrassegnata con la versione della release di Google Distributed Cloud e l'immagine etcd è contrassegnata con la versione etcd corrispondente.

Per la versione 1.31.200-gke.59 di Google Distributed Cloud per bare metal, l'immagine del controller dell'API cluster, cluster-api-controller, e l'immagine etcd, etcd, hanno i seguenti tag:

  • cluster-api-controller:1.31.200-gke.59
  • etcd:v3.4.30-0-gke.1

Estrai un'immagine dal mirror del registry

Se il mirror del registry non utilizza gli spazi dei nomi, utilizza il seguente comando per recuperare un'immagine:

crictl pull REGISTRY_IP:PORT/IMAGE_PATH:IMAGE_TAG

Estrarre un'immagine da un mirror del registry che utilizza gli spazi dei nomi

Se il mirror del registry utilizza gli spazi dei nomi, utilizza il seguente comando per estrarre un'immagine:

crictl pull REGISTRY_IP:PORT/NAMESPACE/IMAGE_PATH:IMAGE_TAG

Informazioni sull'utilizzo di v2 nell'endpoint del registry

Quando il registry utilizza spazi dei nomi personalizzati, devi anteporre lo spazio dei nomi nell'endpoint del registry (registryMirror.endpoint) nel file di configurazione del cluster con v2/. Se non utilizzi gli spazi dei nomi, non utilizzare v2. In entrambi i casi, non utilizzare v2 nel valore del flag --private-registry o nei comandi di estrazione delle immagini:

Senza spazi dei nomi

  • Valido:
    • endpoint: https://172.18.0.20:5000
    • crictl pull 172.18.0.20:5000/anthos-baremetal-release/etcd:v3.4.30-0-gke.1
  • Non valido:
    • 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

Con spazi dei nomi

  • Valido:
    • 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
  • Non valido:
    • 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