Aggiornamento di un cluster - Amazon EKS

Aggiornamento di un cluster

É possibile aggiornare un cluster Amazon EKS esistente a una nuova versione di Kubernetes o la crittografia dei segreti per il proprio cluster.

Aggiornamento della versione Kubernetes del cluster Amazon EKS

Quando è disponibile una nuova versione di Kubernetes in Amazon EKS, è possibile aggiornare il cluster Amazon EKS alla versione più recente.

Importante

Prima di eseguire l'aggiornamento a una nuova versione di Kubernetes, è consigliabile esaminare le informazioni contenute in Versioni Kubernetes per Amazon EKS e nei passaggi di aggiornamento in questo argomento.

Le nuove versioni di Kubernetes hanno introdotto modifiche significative. Pertanto ti consigliamo di verificare il comportamento delle applicazioni rispetto alla nuova versione di Kubernetes prima di eseguire l'aggiornamento sui cluster di produzione. È possibile ottenere questo risultato mediante la creazione di un flusso di lavoro di integrazione continua per testare il comportamento totale dell'applicazione prima di passare a una nuova versione di Kubernetes.

Il processo di aggiornamento consiste nell'avvio, da parte di Amazon EKS, di nuovi nodi del server API con la versione aggiornata di Kubernetes per sostituire quelli esistenti. Amazon EKS esegue i controlli dell'integrità dell'infrastruttura standard e dello stato di preparazione per il traffico di rete su questi nuovi nodi per verificare che funzionino come previsto. Se uno di questi controlli non va a buon fine, Amazon EKS ripristina l'implementazione dell'infrastruttura e il cluster rimane nella versione precedente di Kubernetes. Le applicazioni in esecuzione non sono interessate e il cluster non viene mai lasciato in uno stato non deterministico o irrecuperabile. Amazon EKS esegue regolarmente il backup di tutti i cluster gestiti e, se necessario, dispone di meccanismi per il recupero dei cluster. Stiamo valutando e migliorando costantemente i nostri processi di gestione dell'infrastruttura di Kubernetes.

Per aggiornare il cluster, Amazon EKS richiede 2-3 indirizzi IP liberi dalle sottoreti fornite al momento della creazione del cluster. Se queste sottoreti non dispongono di indirizzi IP disponibili, l'aggiornamento potrebbe non riuscire. Inoltre, il processo di aggiornamento del cluster potrebbe non riuscire se una sottorete o un gruppo di sicurezza fornito durante la creazione del cluster viene eliminato.

Nota

Sebbene Amazon EKS esegua un piano di controllo ad alta disponibilità, si possono verificare interruzioni minori del servizio durante un aggiornamento. Ad esempio, se si tenta di connettersi a un server di API subito prima o dopo che è stato terminato e sostituito da un nuovo server API con in esecuzione la nuova versione di Kubernetes, si possono verificare errori di chiamata alle API o problemi di connettività. In questo caso, riapplicare le operazioni delle API finché non abbiano esito positivo.

Aggiornamento della versione Kubernetes di un cluster Amazon EKS

Aggiorna la versione Kubernetes desiderata per il cluster.

Per aggiornare la versione Kubernetes desiderata per il cluster

  1. Confrontare la versione Kubernetes del piano di controllo cluster con la versione Kubernetes dei nodi.

    • Ottenimento della versione Kubernetes del piano di controllo cluster con il seguente comando.

      kubectl version --short
    • É possibile ottenere la versione Kubernetes dei nodi con il comando seguente. Questo comando restituisce tutti i nodi Amazon EC2 e Fargate gestiti e autogestiti. Ogni pod Fargate è presente nell'elenco assieme al rispettivo nodo.

      kubectl get nodes

    Prima di aggiornare il piano di controllo a una nuova versione di Kubernetes, assicurarsi che la versione secondaria Kubernetes dei nodi gestiti e Fargate nel cluster sia la stessa della versione corrente del piano di controllo. Ad esempio, se nel piano di controllo è in esecuzione la versione 1.20 e in un qualsiasi nodo è in esecuzione la versione 1.19, aggiornare i nodi alla versione 1.20 prima di aggiornare la versione Kubernetes del piano di controllo alla 1.21. Prima di aggiornare il piano di controllo, si consiglia inoltre di aggiornare i nodi autogestiti alla stessa versione del piano di controllo. Per ulteriori informazioni, consultare Aggiornamento di un gruppo di nodi gestiti e Aggiornamenti del nodo autogestito. Per aggiornare la versione di un nodo Fargate, eliminare il pod rappresentato dal nodo e implementare nuovamente il pod dopo aver aggiornato il piano di controllo.

  2. Il controller di ammissione della policy di sicurezza pod è abilitato per impostazione predefinita sui cluster Amazon EKS. Al fine di evitare problemi, assicurarsi che siano presenti policy di sicurezza del pod appropriate prima di eseguire l'aggiornamento del cluster. È possibile verificare la policy di default con il comando seguente:

    kubectl get psp eks.privileged

    Se ricevi il seguente errore, consultare policy di sicurezza pod di default prima di procedere.

    Error from server (NotFound): podsecuritypolicies.extensions "eks.privileged" not found
  3. Se il cluster è stato implementato in origine su Kubernetes 1.17 o su versioni precedenti, potrebbe essere necessario rimuovere un termine interrotto dal manifesto CoreDNS.

    1. Controllare se il manifesto CoreDNS ha una riga contenente solo la parola upstream.

      kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream

      Se non viene restituito alcun output, il manifesto non ha la riga ed è possibile passare direttamente alla fase successiva per aggiornare il cluster. Se come risultato viene restituita la parola upstream è necessario rimuovere la riga.

    2. Modificare la configmap, rimuovendo la riga vicino alla parte superiore del file contenente solo la parola upstream. Non apportare ulteriori modifiche al file. Dopo aver rimosso la riga, salvare le modifiche.

      kubectl edit configmap coredns -n kube-system -o yaml
  4. Aggiornare il cluster usando eksctl, il AWS Management Console, o il AWS CLI.

    Importante
    • Poiché Amazon EKS viene eseguito in un piano di controllo ad alta disponibilità, è possibile aggiornare solo una versione secondaria alla volta. Consulta Policy per la versione Kubernetes e il supporto Skew della versione per la logica sottostante questo requisito. Pertanto, se la versione corrente è 1.19 e si desidera eseguire l'aggiornamento a 1.21, è necessario innanzitutto aggiornare il cluster a 1.20, quindi effettuare l'aggiornamento da 1.20 a 1.21.

    • Prima di eseguire l'aggiornamento, assicurarsi che il file kubelet sui nodi gestiti e Fargate siano aggiornati alla stessa versione Kubernetes del piano di controllo. È inoltre consigliabile che i nodi autogestiti abbiano la stessa versione del piano di controllo, anche se possono essere aggiornati al massimo alla versione immediatamente precedente alla versione corrente del piano di controllo.

    • L'aggiornamento del cluster a una versione più recente potrebbe sovrascrivere le configurazioni personalizzate.

    eksctl

    Questa procedura richiede eksctl versione 0.84.0 o versione successiva. Puoi verificare la versione con il seguente comando:

    eksctl version

    Per ulteriori informazioni sull'installazione o sull'aggiornamento di eksctl, consultare Installazione o aggiornamento di eksctl.

    Aggiornare la versione Kubernetes del piano di controllo Amazon EKS con una versione secondaria successiva alla versione corrente con il seguente comando. Sostituire <my-cluster> (incluso <>) con il nome del cluster.

    eksctl upgrade cluster --name <my-cluster> --approve

    Il processo di aggiornamento può richiedere alcuni minuti per il completamento.

    AWS Management Console
    1. Aprire la console Amazon EKS all'indirizzo https://console.aws.amazon.com/eks/home#/clusters.

    2. Scegliere il nome del cluster Amazon EKS da aggiornare, quindi selezionare Aggiorna la versione del cluster.

    3. Per Kubernetes version (Versione di Kubernetes), selezionare la versione alla quale aggiornare il cluster, quindi scegliere Update (Aggiorna).

    4. In Cluster name (Nome cluster), digitare il nome del cluster e scegliere Confirm (Conferma).

      Il processo di aggiornamento può richiedere alcuni minuti per il completamento.

    AWS CLI
    1. Aggiornare il cluster Amazon EKS con il seguente comando AWS CLI. Sostituire il <example-values> (incluso <>) con il proprio.

      aws eks update-cluster-version \ --region <region-code> \ --name <my-cluster> \ --kubernetes-version <1.21>

      Output:

      { "update": { "id": "<b5f0ba18-9a87-4450-b5a0-825e6e84496f>", "status": "InProgress", "type": "VersionUpdate", "params": [ { "type": "Version", "value": "1.21" }, { "type": "PlatformVersion", "value": "eks.1" } ], ... "errors": [] } }
    2. É possibile monitorare lo stato di aggiornamento del cluster attraverso il seguente comando. Utilizzare il nome del cluster e l'ID aggiornamento restituito dal comando precedente. L'aggiornamento è completo quando lo stato viene visualizzato come Successful. Il processo di aggiornamento può richiedere alcuni minuti per il completamento.

      aws eks describe-update \ --region <region-code> \ --name <my-cluster> \ --update-id <b5f0ba18-9a87-4450-b5a0-825e6e84496f>

      Output:

      { "update": { "id": "b5f0ba18-9a87-4450-b5a0-825e6e84496f", "status": "Successful", "type": "VersionUpdate", "params": [ { "type": "Version", "value": "1.21" }, { "type": "PlatformVersion", "value": "eks.1" } ], ... "errors": [] } }
  5. Dopo che l'aggiornamento del cluster è completo, aggiornare i nodi di lavoro alla stessa versione secondaria di Kubernetes del cluster aggiornato. Per ulteriori informazioni, consulta le sezioni Aggiornamenti del nodo autogestito o Aggiornamento di un gruppo di nodi gestiti. Tutti i nuovi pod lanciati in Fargate avranno una versione di kubelet che corrisponde alla versione del cluster. I pod Fargate esistenti non vengono modificati.

  6. (Facoltativo) Se è stato implementato Kubernetes Cluster Autoscaler nel cluster prima di aggiornarlo, aggiornare Cluster Autoscaler alla versione più recente che corrisponde alla versione principale e secondaria di Kubernetes per cui è stato eseguito l'aggiornamento.

    1. Aprire la pagina delle versioni di Cluster Autoscaler in un browser Web e trovare la versione più recente di Cluster Autoscaler corrispondente alla versione principale e secondaria di Kubernetes del cluster. Ad esempio, se la versione Kubernetes del cluster è 1.21, cercare la versione di Cluster Autoscaler che inizia con 1.21. Registrare il numero di versione semantica (<1.21.n>) per tale versione da utilizzare nella fase successiva.

    2. Impostare il tag image di Cluster Autoscaler sulla versione registrata nella fase precedente mediante il comando seguente. Se necessario, sostituire 1.21.n con il valore in proprio possesso.

      kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=k8s.gcr.io/autoscaling/cluster-autoscaler:v1.21.n
  7. (Cluster solo con nodi di lavoro GPU) Se il cluster ha gruppi di nodi di lavoro con supporto GPU (ad esempio, p3.2xlarge), è necessario aggiornare il set daemon per il plug-in del dispositivo NVIDIA per Kubernetes impostato sul cluster con il comando seguente.

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
  8. Aggiornare il CNI VPC, CoreDNS ed kube-proxy i componenti aggiuntivi.

Abilitazione della crittografia segreta dei dati in transito su un cluster esistente

Se si abilita crittografia segreti, i segreti di Kubernetes vengono crittografati utilizzando il AWS KMS key che si seleziona. La chiave KMS deve essere:

  • Simmetrica

  • Come crittografare e decrittare i dati

  • Creato nella stessa regione del cluster

  • Se la chiave KMS è stata creata in un account diverso, l'utente dovrà avere accesso alla stessa.

Per ulteriori informazioni, consultare Consentire agli utenti in altri account di utilizzare una chiave KMS nella Guida per gli sviluppatori AWS Key Management Service.

avvertimento

Non è possibile disabilitare la crittografia dei segreti dopo averla abilitata. Questa operazione è irreversibile.

eksctl

È possibile abilitare la crittografia in due modi:

  • Aggiungere la crittografia al cluster con un singolo comando.

    Per crittografare automaticamente i segreti:

    eksctl utils enable-secrets-encryption / --cluster <my-cluster> / --key-arn arn:aws:kms:<Region-code>:<account>:key/<key>

    Per disattivare la crittografia automatica dei segreti:

    eksctl utils enable-secrets-encryption --cluster <my-cluster> / --key-arn arn:aws:kms:<Region-code>:<account>:key/<key> / --encrypt-existing-secrets=false
  • Aggiungere la crittografia al cluster con un file .yaml.

    # cluster.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: <my-cluster> region: <Region-code> secretsEncryption: keyARN: arn:aws:kms:<Region-code>:<account>:key/<key>

    Per crittografare automaticamente i segreti:

    eksctl utils enable-secrets-encryption -f kms-cluster.yaml

    Per disattivare la crittografia automatica dei segreti:

    eksctl utils enable-secrets-encryption -f kms-cluster.yaml --encrypt-existing-secrets=false
AWS Management Console
  1. Aprire la console Amazon EKS all'indirizzo https://console.aws.amazon.com/eks/home#/clusters.

  2. Scegliere il cluster per cui aggiungere la crittografia KMS.

  3. Scegliere la scheda Configuration (Configurazione).

  4. Scorri verso il basso fino a Secrets encryption (Crittografia dei segreti) e scegli Enable (Abilita).

  5. Seleziona una chiave dall'elenco a discesa e fare clic sul pulsante Enable (Abilita). Se non sono elencate chiavi, è necessario crearne una prima. Per ulteriori informazioni, consultare Creazione chiavi

  6. Fai clic sul pulsante Confirm (Conferma) per utilizzare la chiave scelta.

AWS CLI
  1. Associa la configurazione di crittografia dei segreti con il cluster utilizzando il comando AWS CLI. Sostituire il <example-values> (incluso <>) con il proprio.

    aws eks associate-encryption-config \ --cluster-name <my-cluster> \ --encryption-config '[{"resources":["secrets"],"provider":{"keyArn":"arn:aws:kms:<Region-code>:<account>:key/<key>"}}]'

    Output:

    {   "update": {     "id": "<3141b835-8103-423a-8e68-12c2521ffa4d>",     "status": "InProgress",     "type": "AssociateEncryptionConfig",     "params": [       {         "type": "EncryptionConfig",         "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws:kms:<Region-code>:<account>:key/<key>\"}}]"       }     ],     "createdAt": <1613754188.734>,     "errors": []   } }
  2. È possibile monitorare lo stato dell'aggiornamento di crittografia con il comando seguente. Utilizzo del cluster name e update ID che è stato restituito come Output del passaggio precedente. L'aggiornamento è completo quando lo stato è illustrato come Successful.

    aws eks describe-update \ --region <Region-code> \ --name <my-cluster> \ --update-id <3141b835-8103-423a-8e68-12c2521ffa4d>

    Output:

    {   "update": {     "id": "<3141b835-8103-423a-8e68-12c2521ffa4d>",     "status": "Successful",     "type": "AssociateEncryptionConfig",     "params": [       {         "type": "EncryptionConfig",         "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws:kms:<region-code>:<account>:key/<key>\"}}]"       }     ],     "createdAt": <1613754188.734>,     "errors": []   } }
  3. Per verificare che la crittografia sia attivata nel cluster, eseguire il comando describe-cluster. La risposta conterrà EncryptionConfig.

    aws eks describe-cluster --region <Region-code> --name <my-cluster>

Dopo aver abilitato la crittografia nel cluster, sarà necessario crittografare tutti i segreti esistenti con la nuova chiave:

Nota

Se si usa eksctl, non è necessario eseguire il seguente comando, a meno che non si scelga di non crittografare automaticamente i segreti.

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - kms-encryption-timestamp="<time value>"
avvertimento

Se si abilita crittografia dei segreti per un cluster esistente e la chiave KMS utilizzata non viene mai eliminata, non esisterà nessun percorso di ripristino per il cluster. L'eliminazione della chiave KMS metterà definitivamente il cluster in uno stato degradato. Per ulteriori informazioni, consultare Eliminazione di chiavi KMS AWS.

Nota

Per impostazione predefinita, il comando create-key crea una chiave simmetrica con un policy della chiave che consente all'account utente root dell'account di accedere alle AWS KMS azioni e alle risorse. Se si desidera ridurre l'ambito delle autorizzazioni, assicurarsi che le azioni kms:DescribeKey e kms:CreateGrant siano consentite nella policy per il principale che chiamerà l'API create-cluster.

Amazon EKS non supporta la condizione della policy kms:GrantIsForAWSResource. La creazione di un cluster non avverrà se questa operazione è presente nella policy della chiave KMS.