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
Assicurati di avere un progetto per gestire i deployment containerizzati. Crea un progetto se non ne hai uno.
Imposta lo spazio dei nomi del progetto come variabile di ambiente:
export NAMESPACE=PROJECT_NAMESPACE
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.
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
Nel menu di navigazione, seleziona Harbor Container Registry dalla sezione CI/CD.
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à.
Fai clic su Crea istanza.
Inserisci il nome dell'istanza e accetta i Termini di servizio gestiti di Harbor.
Fai clic su Crea istanza.
Verifica che la nuova istanza Harbor esista nella sezione Istanza Harbor.
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 prefissohttps://
.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
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.
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
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
Fai clic su Crea un progetto Harbor nella pagina Harbor Container Registry.
Inserisci il nome del progetto.
Fai clic su Crea.
Imposta il nome del progetto Harbor come variabile da utilizzare più avanti nel tutorial:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
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.
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:
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.
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.
Aggiungi un account robot del progetto Harbor da utilizzare come account di servizio.
Nella console Harbor, seleziona il tuo progetto Harbor.
Fai clic su Robot Accounts (Account robot).
Seleziona New Robot Account (Nuovo account robot).
Assegna un nome al nuovo account robot e definisci eventuali impostazioni aggiuntive.
Fai clic su Aggiungi.
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.
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.
Imposta un nome arbitrario per il secret di pull dell'immagine:
export SECRET=SECRET
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
.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.
Esegui il pull dell'immagine
nginx
da Docker Hub alla tua workstation locale utilizzando una rete esterna:docker pull nginx
Tagga l'immagine locale con il nome del repository:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
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
Nel menu di navigazione, seleziona Kubernetes Engine > Cluster.
Fai clic su Crea cluster.
Nel campo Nome, specifica un nome per il cluster.
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à.
Fai clic su Collega progetto e seleziona un progetto da collegare al cluster. Quindi, fai clic su Salva.
Fai clic su Crea.
Attendi la creazione del cluster. Quando il cluster è disponibile per l'uso, accanto al nome del cluster viene visualizzato lo stato
READY
.
API
Crea una risorsa personalizzata
Cluster
e salvala come file YAML, ad esempiocluster.yaml
:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform
Sostituisci il valore
CLUSTER_NAME
con il nome del cluster.Applica la risorsa personalizzata all'istanza GDC:
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
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:
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
Crea ed esegui il deployment delle risorse personalizzate
Deployment
eService
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
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
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
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}'`
Testa l'indirizzo IP del server
nginx
utilizzandocurl
: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:
Nel menu di navigazione, seleziona Harbor Container Registry dalla sezione CI/CD.
Fai clic sul link esterno Vai all'istanza Harbor.
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:
Elimina l'oggetto
Service
per l'app contenitore:kubectl delete service nginx-service -n ${NAMESPACE}
Elimina l'oggetto
Deployment
per l'app contenitore:kubectl delete deployment nginx-deployment -n ${NAMESPACE}
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
Esplora la gerarchia delle risorse e i dettagli sull'isolamento delle risorse.
Scopri di più sull'architettura dei cluster.
Leggi la documentazione Container Kubernetes per GDC per informazioni su come gestire i container di cui è stato eseguito il deployment nei cluster Kubernetes.
Scopri come gestire i cluster Kubernetes dopo il deployment dei carichi di lavoro dei container.
Esplora le best practice per configurare i carichi di lavoro dei container e altre risorse di servizio.