Esegui il deployment di un'app server web containerizzata


Questo tutorial descrive come caricare un'applicazione container in un ambiente air-gap di Google Distributed Cloud (GDC) ed eseguirla su un cluster Kubernetes. Un workload containerizzato viene eseguito su un cluster Kubernetes all'interno di uno spazio dei nomi del progetto. I cluster sono logicamente separati dai progetti e tra loro per fornire diversi domini di errore e garanzie di isolamento. Tuttavia, devi assicurarti che il cluster sia collegato a un progetto per consentire la gestione dei carichi di lavoro containerizzati all'interno di un progetto.

Uno dei maggiori ostacoli alla distribuzione di un'app container è l'ottenimento del binario per l'app nel tuo data center isolato. Collabora con il tuo team di infrastruttura e con gli amministratori per trasferire l'applicazione alla tua workstation o implementare questo tutorial direttamente sul server di integrazione continua e distribuzione continua (CI/CD).

Questo tutorial utilizza un'app server web di esempio disponibile in Google Cloud Artifact Registry.

Obiettivi

  • Crea un registro Harbor gestito.
  • Esegui il push di un'immagine container nel registro Harbor gestito.
  • Crea un cluster Kubernetes.
  • Esegui il deployment dell'app container di esempio nel cluster.

Costi

Poiché GDC è progettato per essere eseguito in un data center con air gap, i processi e le informazioni di fatturazione sono limitati solo al deployment di GDC e non sono gestiti da altri prodotti Google.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

Utilizza la dashboard Costo previsto per prevedere i costi futuri degli SKU per le tue fatture.

Per monitorare il consumo di spazio di archiviazione e risorse di calcolo, utilizza i dashboard Utilizzo fatturazione.

Prima di iniziare

  1. Assicurati di avere un progetto per gestire i deployment containerizzati. Crea un progetto se non ne hai uno.

  2. Imposta lo spazio dei nomi del progetto come variabile di ambiente:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Scarica e installa gcloud CLI.

  4. Chiedi all'amministratore IAM dell'organizzazione di concederti i seguenti ruoli:

    • Ruolo Amministratore spazio dei nomi (namepspace-admin) per lo spazio dei nomi del progetto. Questo ruolo è necessario per eseguire il deployment dei carichi di lavoro dei container nel tuo progetto.

    • Ruolo Amministratore istanza Harbor (harbor-instance-admin) per lo spazio dei nomi del progetto. Questo ruolo è necessario per l'accesso in lettura e scrittura a tutte le risorse Harbor. È necessario anche per eliminare le istanze Harbor.

    • Ruolo di visualizzatore istanze Harbor (harbor-instance-viewer) per lo spazio dei nomi del tuo progetto. Questo ruolo è necessario per visualizzare e selezionare un'istanza Harbor.

    • Ruolo Autore progetto Harbor (harbor-project-creator) per lo spazio dei nomi del progetto. Questo ruolo è necessario per accedere a un progetto Harbor e gestirlo.

    • Ruolo di amministratore del cluster utente (user-cluster-admin). Questo ruolo è necessario per creare un cluster Kubernetes e non è associato a uno spazio dei nomi.

  5. Accedi al server API di gestione zonale e genera il relativo file kubeconfig con un'identità utente. Imposta il percorso kubeconfig come variabile di ambiente:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Crea un registro Harbor gestito

GDC air-gapped fornisce Harbor as a Service, un servizio completamente gestito che ti consente di archiviare e gestire le immagini container utilizzando Harbor.

Per utilizzare Harbor as a Service, devi prima creare un'istanza del registro Harbor e un progetto Harbor.

Crea un'istanza del registro Harbor

Per creare un'istanza del registro dei container Harbor, completa i seguenti passaggi:

Console

  1. Nel menu di navigazione, seleziona Harbor Container Registry dalla sezione CI/CD.

  2. Seleziona la zona in cui creare l'istanza Harbor. Un'istanza Harbor è unarisorsa di zonae e deve essere creata manualmente in ogni zona per garantire l'alta disponibilità.

  3. Fai clic su Crea istanza.

  4. Inserisci il nome dell'istanza e accetta i Termini di servizio gestiti di Harbor.

  5. Fai clic su Crea istanza.

  6. Verifica che la nuova istanza Harbor esista nella sezione Istanza Harbor.

  7. Fai clic sul link esterno Vai all'istanza Harbor e prendi nota dell'URL dell'istanza. Ad esempio, il formato dell'URL dell'istanza è simile a harbor-1.org-1.zone1.google.gdc.test. L'URL dell'istanza non deve includere il prefisso https://.

  8. Imposta l'URL dell'istanza come variabile da utilizzare più avanti nel tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

    Sostituisci INSTANCE_URL con l'URL dell'istanza del registro Harbor.

    Ad esempio:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

gdcloud

  1. Crea la nuova istanza del registro dei container Harbor:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT \
    

    Sostituisci quanto segue:

    • INSTANCE_NAME: il nome dell'istanza Harbor.
    • PROJECT: il nome del progetto Google Cloud.
  2. Elenca l'URL dell'istanza:

    gdcloud harbor instances describe INSTANCE_NAME \
        --project=PROJECT
    

    L'output è simile al seguente:

    # Several lines of code are omitted here.
    status:
      url: https://harbor-1.org-1.zone1.google.gdc.test
    
  3. Imposta l'URL dell'istanza come variabile da utilizzare più avanti nel tutorial:

    export INSTANCE_URL=INSTANCE_URL
    

    Sostituisci INSTANCE_URL con l'URL dell'istanza del registro Harbor. Assicurati che l'URL dell'istanza non includa il prefisso https://.

    Ad esempio:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

Crea un progetto Harbor nel registro

Devi creare un progetto Harbor all'interno dell'istanza del registro Harbor per gestire le tue immagini container:

Console

  1. Fai clic su Crea un progetto Harbor nella pagina Harbor Container Registry.

  2. Inserisci il nome del progetto.

  3. Fai clic su Crea.

  4. Imposta il nome del progetto Harbor come variabile da utilizzare più avanti nel tutorial:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. Crea il nuovo progetto Harbor:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=PROJECT \
        --instance=INSTANCE_NAME
    

    Sostituisci quanto segue:

    • HARBOR_PROJECT: il nome del progetto Harbor da creare.
    • PROJECT: il nome del progetto Google Cloud.
    • INSTANCE_NAME: il nome dell'istanza Harbor.
  2. Imposta il nome del progetto Harbor come variabile da utilizzare più avanti nel tutorial:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

Configura Docker

Per utilizzare Docker nel tuo registro Harbor, completa i seguenti passaggi:

  1. Configura Docker in modo che consideri attendibile Harbor as a Service. Per ulteriori informazioni, vedi Configurare Docker in modo che consideri attendibile la CA radice di Harbor.

  2. Configura l'autenticazione Docker in Harbor. Per saperne di più, consulta la pagina Configurare l'autenticazione Docker per le istanze del registro Harbor.

Crea un secret di pull delle immagini Kubernetes

Poiché utilizzi un progetto Harbor privato, devi creare un secret di pull delle immagini Kubernetes.

  1. Aggiungi un account robot del progetto Harbor da utilizzare come account di servizio.

    1. Nella console Harbor, seleziona il tuo progetto Harbor.

    2. Fai clic su Robot Accounts (Account robot).

    3. Seleziona New Robot Account (Nuovo account robot).

    4. Assegna un nome al nuovo account robot e definisci eventuali impostazioni aggiuntive.

    5. Fai clic su Aggiungi.

    6. Il nome e il segreto dell'account robot vengono visualizzati nella schermata di operazione riuscita. Tieni aperta questa schermata come riferimento per il passaggio successivo.

    Per ulteriori informazioni, consulta la documentazione di Harbor: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.

  2. In una nuova finestra del terminale, accedi a Docker con l'account robot e il token segreto del progetto Harbor:

    docker login ${INSTANCE_URL}
    

    Quando richiesto, inserisci il nome del progetto robot per il nome utente e il token segreto per la password forniti nel passaggio precedente dalla schermata di conferma della console Harbor.

  3. Imposta un nome arbitrario per il secret di pull dell'immagine:

    export SECRET=SECRET
    
  4. Crea il secret necessario per il pull dell'immagine:

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n ${NAMESPACE}
    

    Sostituisci DOCKER_CONFIG con il percorso del file .docker/config.json.

  5. Verifica che il tuo secret esista nello spazio dei nomi del progetto GDC:

    kubectl get secrets -n ${NAMESPACE}
    

    L'output è simile al seguente:

    NAME          TYPE                               DATA     AGE
    my-secret     kubernetes.io/dockerconfigjson     1        23s
    

Esegui il push dell'immagine container nel registro Harbor gestito

Per questo tutorial, scaricherai e invierai l'immagine del server web nginx al registro Harbor gestito e la utilizzerai per eseguire il deployment di un'app server web nginx di esempio in un cluster Kubernetes. L'app del server web nginx è disponibile nel repository pubblico Docker Hub.

  1. Esegui il pull dell'immagine nginx da Docker Hub alla tua workstation locale utilizzando una rete esterna:

    docker pull nginx
    
  2. Tagga l'immagine locale con il nome del repository:

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. Esegui il push dell'immagine container nginx nel registro Harbor gestito:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

Crea un cluster Kubernetes

Ora che l'immagine container nginx è archiviata nel registro Harbor gestito e puoi accedervi, crea un cluster Kubernetes per eseguire il server web Nginx.

Console

  1. Nel menu di navigazione, seleziona Kubernetes Engine > Cluster.

  2. Fai clic su Crea cluster.

  3. Nel campo Nome, specifica un nome per il cluster.

  4. Seleziona la zona in cui creare il cluster Kubernetes. Un cluster Kubernetes è una risorsa di zona e deve essere creato manualmente in ogni zona per garantire l'alta disponibilità.

  5. Fai clic su Collega progetto e seleziona un progetto da collegare al cluster. Quindi, fai clic su Salva.

  6. Fai clic su Crea.

  7. Attendi la creazione del cluster. Quando il cluster è disponibile per l'uso, accanto al nome del cluster viene visualizzato lo stato READY.

API

  1. Crea una risorsa personalizzata Cluster e salvala come file YAML, ad esempio cluster.yaml:

    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    

    Sostituisci il valore CLUSTER_NAME con il nome del cluster.

  2. Applica la risorsa personalizzata all'istanza GDC:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. Collega un progetto al tuo cluster Kubernetes utilizzando la console GDC. Al momento non puoi collegare un progetto al cluster utilizzando l'API.

Per ulteriori informazioni sulla creazione di un cluster Kubernetes, consulta Crea un cluster Kubernetes.

Esegui il deployment dell'app container di esempio

Ora puoi eseguire il deployment dell'immagine container nginx nel cluster Kubernetes.

Kubernetes rappresenta le applicazioni come risorse Pod, che sono unità scalabili che includono uno o più container. Il pod è l'unità più piccola di cui è possibile eseguire il deployment in Kubernetes. In genere, i pod vengono implementati come un insieme di repliche che possono essere scalate e distribuite insieme nel cluster. Uno dei modi per eseguire il deployment di un set di repliche è utilizzare un Deployment Kubernetes.

In questa sezione, creerai un Deployment Kubernetes per eseguire l'app container nginx sul tuo cluster. Questo deployment ha repliche o pod. Un pod Deployment contiene un solo container: l'immagine container nginx. Puoi anche creare una risorsa Service che offre ai client un modo stabile per inviare richieste ai pod del tuo Deployment.

Esegui il deployment del server web nginx nel cluster Kubernetes:

  1. Accedi al cluster Kubernetes e genera il relativo file kubeconfig con un'identità utente. Imposta il percorso kubeconfig come variabile di ambiente:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. Crea ed esegui il deployment delle risorse personalizzate Deployment e Service di Kubernetes:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
            ports:
            - containerPort: 80
          imagePullSecrets:
          - name: ${SECRET}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
        - port: 80
          protocol: TCP
      type: LoadBalancer
    EOF
    
  3. Verifica che i pod siano stati creati dal deployment:

    kubectl get pods -l app=nginx -n ${NAMESPACE}
    

    L'output è simile al seguente:

    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1882529037-6p4mt   1/1       Running   0          1h
    nginx-deployment-1882529037-p29za   1/1       Running   0          1h
    nginx-deployment-1882529037-s0cmt   1/1       Running   0          1h
    
  4. Crea un criterio di rete per consentire tutto il traffico di rete allo spazio dei nomi:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    
  5. Esporta l'indirizzo IP per il servizio nginx:

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  6. Testa l'indirizzo IP del server nginx utilizzando curl:

      curl http://$IP
    

Esegui la pulizia

Per evitare che al tuo account GDC vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, devi eliminare le risorse che hai creato.

Elimina l'immagine container

Per eliminare l'immagine container dall'ambiente air-gap GDC, elimina l'istanza Harbor che contiene l'immagine oppure mantieni l'istanza Harbor ed elimina la singola immagine container.

Per eliminare l'immagine container dal registro Harbor gestito, utilizza la console GDC:

  1. Nel menu di navigazione, seleziona Harbor Container Registry dalla sezione CI/CD.

  2. Fai clic sul link esterno Vai all'istanza Harbor.

  3. Elimina l'immagine container utilizzando la UI di Harbor. Per ulteriori informazioni, consulta la sezione Eliminare le istanze del registro Harbor.

Eliminare l'app contenitore

Per eliminare l'app container di cui è stato eseguito il deployment, elimina il progetto GDC che contiene le risorse oppure mantieni il progetto GDC ed elimina le singole risorse.

Per eliminare le singole risorse:

  1. Elimina l'oggetto Service per l'app contenitore:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Elimina l'oggetto Deployment per l'app contenitore:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. Se hai creato un cluster Kubernetes di test esclusivamente per questo tutorial, eliminalo:

    kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \
        -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
    

    Questa operazione elimina le risorse che compongono il cluster Kubernetes, ad esempio le istanze di calcolo, i dischi e le risorse di rete:

Passaggi successivi