Questo documento fornisce passaggi per la risoluzione dei problemi comuni che potresti riscontrare con il runtime del container sui nodi Google Kubernetes Engine (GKE).
I percorsi di montaggio con lettere di unità semplici non vanno a buon fine nei pool di nodi Windows con containerd
Questo problema è stato risolto in containerd versione 1.6.6 e successive.
I cluster GKE che eseguono pool di nodi Windows Server che utilizzano il runtime containerd precedente alla versione 1.6.6 potrebbero riscontrare errori all'avvio dei container, ad esempio:
failed to create containerd task : CreateComputeSystem : The parameter is incorrect : unknown
Per maggiori dettagli, consulta l'articolo di GitHub n. 6589.
Soluzione
Per risolvere il problema, esegui l'upgrade dei pool di nodi alle versioni più recenti di GKE che utilizzano la versione 1.6.6 o successive del runtime containerd.
Le immagini container con righe di comando CMD
o ENTRYPOINT
pre-escape non di array non vanno a buon fine sui pool di nodi Windows con containerd
Questo problema è stato risolto in containerd versione 1.6 e successive.
I cluster GKE che eseguono node pool Windows Server che utilizzano il runtime containerd 1.5.X potrebbero riscontrare errori all'avvio dei container, ad esempio i seguenti:
failed to start containerd task : hcs::System::CreateProcess : The system cannot find the file specified.: unknown
Per maggiori dettagli, consulta l'articolo di GitHub n. 5067 e l'articolo di GitHub n. 6300.
Soluzione
Per risolvere il problema, esegui l'upgrade dei pool di nodi alle versioni più recenti di GKE che utilizzano la versione 1.6.6 o successive del runtime containerd.
I volumi delle immagini container con percorsi inesistenti o simili a Linux (barra) non riescono sui pool di nodi Windows con containerd
Questo problema è stato risolto in containerd versione 1.6 e successive.
I cluster GKE che eseguono node pool Windows Server che utilizzano il runtime containerd 1.5.X potrebbero riscontrare errori all'avvio dei container, ad esempio i seguenti:
failed to generate spec: failed to stat "<volume_path>": CreateFile : The system cannot find the path specified.
Per maggiori dettagli, consulta l'articolo di GitHub n. 5671.
Soluzione
Per risolvere il problema, esegui l'upgrade dei pool di nodi alle versioni più recenti di GKE che utilizzano la versione 1.6.x o successive del runtime containerd.
/etc/mtab
: Nessun file o directory corrispondente
Il runtime del container Docker popola questo collegamento simbolico all'interno del container per impostazione predefinita, ma il runtime containerd non lo fa.
Per maggiori dettagli, consulta l'articolo di GitHub n. 2419.
Soluzione
Per risolvere il problema, crea manualmente il collegamento simbolico /etc/mtab
durante la creazione dell'immagine.
ln -sf /proc/mounts /etc/mtab
Errore pull immagine: non è una directory
Versioni GKE interessate: tutte
Quando crei un'immagine con kaniko, potrebbe non essere possibile eseguirne il pull con containerd con il messaggio di errore "not a directory" (non è una directory). Questo errore si verifica se l'immagine viene creata in modo speciale: quando un comando precedente rimuove una directory e il comando successivo ricrea gli stessi file in quella directory.
Il seguente esempio di Dockerfile con npm
illustra questo problema.
RUN npm cache clean --force
RUN npm install
Per maggiori dettagli, consulta il problema n. 4659 di GitHub.
Soluzione
Per risolvere il problema, crea l'immagine utilizzando docker build
, che non è interessato
da questo problema.
Se docker build
non è un'opzione per te, combina i comandi in uno solo.
Il seguente esempio di Dockerfile combina RUN npm cache clean --force
e
RUN npm install
:
RUN npm cache clean --force && npm install
Mancano alcune metriche del file system e il formato delle metriche è diverso
Versioni GKE interessate: tutte
L'endpoint Kubelet /metrics/cadvisor
fornisce metriche Prometheus, come
documentato in
Metriche per i componenti di sistema Kubernetes.
Se installi un raccoglitore di metriche che dipende da questo endpoint, potresti riscontrare i seguenti problemi:
- Il formato delle metriche sul nodo Docker è
k8s_<container-name>_<pod-name>_<namespace>_<pod-uid>_<restart-count>
mentre il formato sul nodo containerd è<container-id>
. Nel nodo containerd mancano alcune metriche del file system, come segue:
container_fs_inodes_free container_fs_inodes_total container_fs_io_current container_fs_io_time_seconds_total container_fs_io_time_weighted_seconds_total container_fs_limit_bytes container_fs_read_seconds_total container_fs_reads_merged_total container_fs_sector_reads_total container_fs_sector_writes_total container_fs_usage_bytes container_fs_write_seconds_total container_fs_writes_merged_total
Soluzione
Puoi mitigare questo problema utilizzando cAdvisor come daemonset autonomo.
- Trova l'ultima release di cAdvisor
con il pattern di nome
vX.Y.Z-containerd-cri
(ad esempio,v0.42.0-containerd-cri
). - Segui i passaggi descritti in cAdvisor Kubernetes Daemonset per creare il daemonset.
- Indica al raccoglitore di metriche installato di utilizzare l'endpoint cAdvisor
/metrics
che fornisce il set completo di metriche dei container Prometheus.
Alternative
- Esegui la migrazione della tua soluzione di monitoraggio a Cloud Monitoring, che fornisce l'insieme completo di metriche dei container.
- Raccogli le metriche dall'API Kubelet Summary
con un endpoint di
/stats/summary
.
Le operazioni basate sull'allegato non funzionano correttamente dopo i riavvii del runtime del container su GKE Windows
Versioni GKE interessate: da 1.21 a 1.21.5-gke.1802, da 1.22 a 1.22.3-gke.700
I cluster GKE che eseguono node pool Windows Server che utilizzano il runtime containerd (versioni 1.5.4 e 1.5.7-gke.0) potrebbero riscontrare problemi se il runtime del container viene riavviato forzatamente e le operazioni di collegamento ai container in esecuzione esistenti non riescono a eseguire nuovamente il binding di I/O. Il problema non causerà errori nelle chiamate API, ma i dati non verranno inviati o ricevuti. Sono inclusi i dati per le API e le CLI di collegamento e log tramite il server API del cluster.
Soluzione
Per risolvere il problema, esegui l'upgrade alla versione patchata del runtime del container (1.5.7-gke.1) con le versioni più recenti di GKE.
I pod mostrano il messaggio di errore failed to allocate for range 0: no IP addresses available in range set
Versioni di GKE interessate: 1.24.6-gke.1500 o precedenti, 1.23.14-gke.1800 o precedenti e 1.22.16-gke.2000 o precedenti
I cluster GKE che eseguono node pool che utilizzano containerd potrebbero riscontrare problemi di perdita di IP ed esaurire tutti gli IP dei pod su un nodo. Un pod pianificato su un nodo interessato mostra un messaggio di errore simile al seguente:
failed to allocate for range 0: no IP addresses available in range set: 10.48.131.1-10.48.131.62
Per maggiori informazioni sul problema, consulta le segnalazioni di GitHub n. 5438 e n. 5768 relative a containerd.
Esiste un problema noto in GKE Dataplane V2 che può attivare questo problema. Tuttavia, questo problema può essere causato da altri motivi, tra cui runc bloccato�.
Soluzione
Per risolvere il problema, segui le soluzioni alternative menzionate nella sezione Soluzioni alternative per i cluster GKE standard per GKE Dataplane V2.
Differenza nel comportamento del probe di esecuzione quando il probe supera il timeout
Versioni GKE interessate: tutte
Il comportamento del probe di esecuzione sulle immagini Containerd è diverso da quello
sulle immagini dockershim
. Quando il probe exec definito per il pod supera la soglia Kubernetes timeoutSeconds
dichiarata, nelle immagini dockershim
viene considerato come un errore del probe.
Nelle immagini di containerd, i risultati del probe restituiti dopo la soglia timeoutSeconds
dichiarata vengono ignorati.
Soluzione
In GKE, il feature gate ExecProbeTimeout
è impostato su
false
e non può essere modificato. Per risolvere il problema, aumenta la soglia
timeoutSeconds
per tutti i probe di esecuzione interessati o implementa la funzionalità di timeout
nell'ambito della logica del probe.
Risolvere i problemi relativi ai registri privati
Questa sezione fornisce informazioni per la risoluzione dei problemi relativi alle configurazioni del registro privato in containerd.
Il pull dell'immagine non riesce e viene visualizzato l'errore x509: certificate signed by unknown authority
Questo problema si verifica se GKE non è riuscito a trovare un certificato per un dominio del registro privato specifico. Puoi verificare la presenza di questo errore in Cloud Logging utilizzando la seguente query:
Vai alla pagina Esplora log nella console Google Cloud :
Esegui questa query:
("Internal error pulling certificate" OR "Failed to get credentials from metadata server" OR "Failed to install certificate")
Per risolvere il problema, prova quanto segue:
In GKE Standard, apri il file di configurazione nel seguente percorso:
/etc/containerd/hosts.d/DOMAIN/config.toml
Sostituisci
DOMAIN
con il nome di dominio completo del registro.Verifica che il file di configurazione contenga il nome di dominio completo corretto.
Verifica che il percorso del certificato nel campo
secretURI
del file di configurazione sia corretto.Verifica che il certificato esista in Secret Manager.
Certificato non presente
Questo problema si verifica se GKE non è riuscito a estrarre il certificato da Secret Manager per configurare containerd sui tuoi nodi.
Per risolvere il problema, prova quanto segue:
- Assicurati che il nodo interessato esegua Container-Optimized OS. I nodi Ubuntu e Windows non sono supportati.
- Nel file di configurazione, assicurati che il percorso del secret nel campo
secretURI
sia corretto. - Verifica che il account di servizio IAM del cluster disponga delle autorizzazioni corrette per accedere al secret.
- Verifica che il cluster abbia l'ambito di accesso
cloud-platform
. Per istruzioni, consulta Controllare gli ambiti di accesso.
L'opzione del registro non protetto non è configurata per la rete locale (10.0.0.0/8)
Versioni GKE interessate: tutte
Nelle immagini containerd, l'opzione del registro non sicuro non è configurata per la rete locale 10.0.0.0/8
. Se utilizzi registri privati non protetti, potresti notare
errori simili ai seguenti:
pulling image: rpc error: code = Unknown desc = failed to pull and unpack image "IMAGE_NAME": failed to do request: Head "IMAGE_NAME": http: server gave HTTP response to HTTPS client
Per risolvere il problema, prova quanto segue:
- Utilizzare Artifact Registry
- Configura TLS nei tuoi registri privati se il tuo caso d'uso supporta questa opzione. Puoi utilizzare un file di configurazione di containerd per indicare a GKE di utilizzare i certificati archiviati in Secret Manager per accedere al tuo registro privato. Per istruzioni, vedi Accedere ai registri privati con certificati CA privati.
Configura DaemonSet con privilegi per modificare la configurazione di containerd
Per i cluster standard, prova a procedere nel seguente modo. Questa soluzione alternativa non è disponibile in Autopilot perché i container con privilegi sono un rischio per la sicurezza. Se il tuo ambiente è esposto a internet, valuta la tua tolleranza al rischio prima di eseguire il deployment di questa soluzione. In tutti i casi, ti consigliamo vivamente di configurare TLS per il tuo registro privato e di utilizzare l'opzione Secret Manager.
Esamina il seguente manifest:
Nel campo
.spec.containers.env
, sostituisci il valoreREGISTRY_ADDRESS
della variabileADDRESS
con l'indirizzo del tuo registro HTTP locale nel formatoDOMAIN_NAME:PORT
. Ad esempio,containers: - name: startup-script ... env: - name: ADDRESS value: "example.com:5000"
Esegui il deployment di DaemonSet:
kubectl apply -f insecure-registry-ds.yaml
Il DaemonSet aggiunge il registro non protetto alla configurazione di containerd su ogni nodo.
containerd ignora qualsiasi mappatura dei dispositivi per i pod con privilegi
Versioni GKE interessate: tutte
Per i pod Kubernetes con privilegi,
il runtime del container ignora qualsiasi mappatura dei dispositivi che volumeDevices.devicePath
gli viene passata e rende invece disponibile ogni dispositivo sull'host al container
in /dev
.
containerd perde processi shim quando i nodi sono sotto pressione I/O
Versioni di GKE interessate: da 1.25.0 a 1.25.15-gke.1040000, da 1.26.0 a 1.26.10-gke.1030000, da 1.27.0 a 1.27.6-gke.1513000 e da 1.28.0 a 1.28.3-gke.1061000
Quando un nodo GKE è sotto pressione I/O, containerd potrebbe non riuscire a eliminare i processi containerd-shim-runc-v2
quando un pod viene eliminato, causando perdite di processi. Quando la perdita si verifica su un nodo, vedrai più
processi containerd-shim-runc-v2
sul nodo rispetto al numero di pod su quel
nodo. Potresti anche notare un aumento dell'utilizzo di memoria e CPU, oltre a PID aggiuntivi.
Per maggiori dettagli, consulta il problema di GitHub
Fix leaked shim caused by high IO pressure.
Per risolvere il problema, esegui l'upgrade dei nodi alle seguenti versioni o successive:
- 1.25.15-gke.1040000
- 1.26.10-gke.1030000
- 1.27.6-gke.1513000
- 1.28.3-gke.1061000
La famiglia di indirizzi IPv6 è abilitata sui pod che eseguono containerd
Versioni GKE interessate: 1.18, 1.19, 1.20.0-1.20.9
La famiglia di immagini IPv6 è abilitata per i pod in esecuzione con Containerd. L'immagine dockershim
disabilita IPv6 su tutti i pod, mentre l'immagine containerd no. Ad esempio, localhost
viene risolto prima nell'indirizzo IPv6 ::1
. In genere non è
un problema, ma in alcuni casi potrebbe comportare un comportamento imprevisto.
Soluzione
Per risolvere il problema, utilizza esplicitamente un indirizzo IPv4 come 127.0.0.1
oppure
configura un'applicazione in esecuzione nel pod in modo che funzioni su entrambe le famiglie di indirizzi.
Il provisioning automatico dei nodi esegue il provisioning solo dei node pool Container-Optimized OS con Docker
Versioni GKE interessate: 1.18, 1.19, 1.20.0-1.20.6-gke.1800
Il provisioning automatico dei nodi consente di scalare automaticamente i node pool con qualsiasi tipo di immagine supportato, ma può creare solo nuovi node pool con il tipo di immagine Container-Optimized OS con Docker.
Soluzione
Per risolvere il problema, esegui l'upgrade dei cluster GKE alla versione 1.20.6-gke.1800 o successive. In queste versioni di GKE, il tipo di immagine predefinito può essere impostato per il cluster.
Conflitto con l'intervallo di indirizzi IP 172.17/16
Versioni di GKE interessate: da 1.18.0 a 1.18.14
L'intervallo di indirizzi IP 172.17/16
è occupato dall'interfaccia docker0
sulla VM nodo con containerd abilitato. L'invio o l'origine del traffico da questo intervallo potrebbe non essere instradato correttamente (ad esempio, un pod potrebbe non essere in grado di connettersi a un host connesso alla VPN con un indirizzo IP all'interno di 172.17/16
).
Metriche GPU non raccolte
Versioni GKE interessate: da 1.18.0 a 1.18.18
Le metriche di utilizzo della GPU non vengono raccolte quando utilizzi containerd come runtime nelle versioni di GKE precedenti alla 1.18.18.
Soluzione
Per risolvere il problema, esegui l'upgrade dei cluster alle versioni GKE 1.18.18 o successive.
Le immagini con config.mediaType
impostato su application/octet-stream
non possono essere utilizzate su containerd
Versioni GKE interessate: tutte
Le immagini con config.mediaType
impostato su "application/octet-stream"
non possono essere utilizzate su Containerd. Per maggiori informazioni, vedi
il problema n. 4756 di GitHub.
Queste immagini non sono compatibili con la specifica Open Container Initiative
e sono considerate errate. Queste immagini funzionano con Docker per fornire la compatibilità
con le versioni precedenti, mentre in containerd non sono supportate.
Sintomi e diagnosi
Esempio di errore nei log dei nodi:
Error syncing pod <pod-uid> ("<pod-name>_<namespace>(<pod-uid>)"), skipping: failed to "StartContainer" for "<container-name>" with CreateContainerError: "failed to create containerd container: error unpacking image: failed to extract layer sha256:<some id>: failed to get reader from content store: content digest sha256:<some id>: not found"
Il manifest dell'immagine si trova in genere nel registro in cui è ospitato.
Una volta ottenuto il manifest, controlla config.mediaType
per determinare se
si verifica questo problema:
"mediaType": "application/octet-stream",
Soluzione
Poiché la community di containerd ha deciso di non supportare queste immagini, tutte le versioni di containerd sono interessate e non esiste una correzione. L'immagine container
deve essere ricompilata con Docker versione 1.11 o successive e devi assicurarti che il
campo config.mediaType
non sia impostato su "application/octet-stream"
.
CNI non inizializzato
Versioni GKE interessate: tutte
Se viene visualizzato un errore simile al seguente, la configurazione dell'interfaccia di rete del contenitore (CNI) non è pronta:
Error: "network is not ready: container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized".
Questo errore si verifica principalmente per due motivi:
- L'installazione di CNI non è stata completata
- Il webhook non è configurato correttamente
Assicurati che l'installazione di CNI sia stata completata
Potresti visualizzare questo errore nei file di log durante il bootstrapping dei nodi mentre GKE installa la configurazione CNI. Se visualizzi questo errore, ma GKE sta creando tutti i nodi correttamente, puoi ignorarlo senza problemi.
Questa situazione può verificarsi perché CNI fornisce ai pod la connettività di rete, quindi i pod hanno bisogno di CNI per funzionare. Tuttavia, Kubernetes utilizza le incompatibilità per contrassegnare i nodi non pronti e i pod di sistema possono tollerare queste incompatibilità. Ciò significa che i pod di sistema possono avviarsi su un nuovo nodo prima che la rete sia pronta, il che genera l'errore.
Per risolvere il problema, attendi che GKE completi l'installazione della configurazione CNI. Una volta terminata la configurazione della rete da parte di CNI, i pod di sistema vengono avviati correttamente senza alcun intervento.
Correggere i webhook configurati in modo errato
Se l'errore di inizializzazione di CNI persiste e noti che GKE non riesce a creare nodi durante un upgrade, un ridimensionamento o un'altra azione, potresti avere un webhook configurato in modo errato.
Se hai un webhook personalizzato che intercetta il comando del controller DaemonSet per creare un pod e questo webhook è configurato in modo errato, potresti visualizzare l'errore come stato di errore del nodo nella console Google Cloud . Questa configurazione errata impedisce
a GKE di creare un pod netd
o calico-node
. Se i pod netd
o
calico-node
sono stati avviati correttamente mentre l'errore persiste,
contatta l'assistenza clienti.
Per correggere eventuali webhook configurati in modo errato, completa i seguenti passaggi:
Identificare i webhook configurati in modo errato.
Se utilizzi un cluster con l'applicazione dei criteri di rete Dataplane V1 attivata, puoi anche controllare lo stato del pod
calico-typha
per informazioni su quali webhook causano questo errore:kubectl describe pod -n kube-system -l k8s-app=calico-typha
Se il pod ha un errore, l'output è simile al seguente:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedCreate 9m15s (x303 over 3d7h) replicaset-controller Error creating: admission webhook WEBHOOK_NAME denied the request [...]
In questo output,
WEBHOOK_NAME
è il nome di un webhook non riuscito. L'output potrebbe includere informazioni su un altro tipo di errore.Se vuoi conservare i webhook configurati in modo errato, risolvi i problemi. Se non sono obbligatori, eliminali eseguendo i seguenti comandi:
kubectl delete mutatingwebhookconfigurations WEBHOOK_NAME kubectl delete validatingwebhookconfigurations WEBHOOK_NAME
Sostituisci
WEBHOOK_NAME
con il nome del webhook configurato in modo errato che vuoi rimuovere.Configura i webhook per ignorare i pod di sistema.
Passaggi successivi
Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta la sezione Richiedere assistenza per ulteriore aiuto, inclusi consigli sui seguenti argomenti:
- Aprire una richiesta di assistenza contattando l'assistenza clienti cloud.
- Ricevere assistenza dalla community
ponendo domande su StackOverflow e utilizzando il tag
google-kubernetes-engine
per cercare problemi simili. Puoi anche unirti al canale Slack#kubernetes-engine
per ulteriore assistenza della community. - Apertura di bug o richieste di funzionalità utilizzando lo strumento di monitoraggio dei problemi pubblico.