Questo tutorial mostra a sviluppatori e operatori che eseguono il deployment di container in Kubernetes come utilizzare i digest delle immagini container per identificare le immagini container. Un digest dell'immagine container identifica in modo univoco e immutabile un'immagine container.
Il deployment delle immagini container utilizzando il digest dell'immagine offre diversi vantaggi rispetto all'utilizzo dei tag immagine. Per ulteriori informazioni sui digest delle immagini, consulta il documento di accompagnamento sull'utilizzo dei digest delle immagini container prima di continuare questo tutorial.
L'argomento image per i container in una specifica del pod Kubernetes accetta
immagini con digest. Questo argomento si applica ovunque utilizzi una specifica del pod, ad esempio nella sezione template delle risorse Deployment, StatefulSet, DaemonSet, ReplicaSet, CronJob e Job.
Per eseguire il deployment di un'immagine utilizzando il digest, devi utilizzare il nome dell'immagine, seguito da
@sha256: e dal valore del digest. Di seguito è riportato un esempio di risorsa Deployment
che utilizza un'immagine con un digest. Un deployment è un oggetto API Kubernetes che ti consente di eseguire più repliche di pod distribuite tra i nodi di un cluster.
apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 ports: - containerPort: 8080
Uno svantaggio dell'utilizzo dei digest delle immagini è che non conosci il valore del digest finché non hai pubblicato l'immagine in un registro. Man mano che crei nuove immagini, il valore del digest cambia e devi trovare un modo per aggiornare i manifest Kubernetes ogni volta che esegui il deployment.
Questo tutorial mostra come utilizzare strumenti come
Skaffold,
kpt,
digester,
kustomize,
gke-deploy,
e
ko
per utilizzare i digest delle immagini nei manifest.
Consigli
Questo documento presenta diversi modi per utilizzare i digest delle immagini nei deployment Kubernetes. Gli strumenti descritti in questo documento sono complementari.
Ad esempio, puoi utilizzare l'output di una funzione kpt con kustomize per
creare varianti per ambienti diversi. Skaffold può
creare immagini utilizzando ko
ed eseguire il deployment delle immagini nei cluster Kubernetes utilizzando kubectl o kpt.
Il motivo per cui gli strumenti sono complementari è che eseguono modifiche strutturate in base al modello di risorse Kubernetes (KRM). Questo modello rende gli strumenti collegabili e puoi far evolvere il loro utilizzo per creare processi e pipeline che ti aiutano a eseguire il deployment delle tue app e dei tuoi servizi.
Per iniziare, ti consigliamo l'approccio che funziona meglio con gli strumenti e i processi esistenti:
Skaffold può aggiungere digest ai riferimenti alle immagini. Puoi attivare questa funzione con una piccola modifica alla configurazione. L'adozione di Skaffold offre ulteriori vantaggi, ad esempio l'astrazione del modo in cui diversi strumenti creano ed eseguono il deployment delle immagini container.
Utilizzando lo strumento di generazione di hash come webhook di ammissione mutante nei tuoi cluster Kubernetes, puoi aggiungere hash a tutti i tuoi deployment con un impatto minimo sui processi attuali per la creazione e il deployment di immagini container. Il webhook digester semplifica anche l'adozione di Binary Authorization, perché richiede solo l'aggiunta di un'etichetta a uno spazio dei nomi.
kpt è un'ottima opzione se hai bisogno di uno strumento flessibile per manipolare i manifest Kubernetes. Lo strumento di analisi può essere utilizzato come funzione KRM lato client in una pipeline kpt.
Se utilizzi già kustomize per gestire i manifest Kubernetes in più ambienti, ti consigliamo di sfruttare i relativi trasformatori di immagini per eseguire il deployment delle immagini in base al digest.
koè un ottimo modo per creare e pubblicare immagini per app Go ed è utilizzato da progetti open source come Knative, Tekton e sigstore.
Se non utilizzi nessuno degli strumenti descritti in questo documento, ti consigliamo di iniziare con Skaffold e il webhook digester. Skaffold è uno strumento comune utilizzato sia dagli sviluppatori sia dai team di rilascio e si integra con gli altri strumenti descritti in questo tutorial. Puoi sfruttare queste opzioni di integrazione man mano che i tuoi requisiti si evolvono. L'webhook Kubernetes di digester integra Skaffold consentendo i deployment basati su digest per un intero cluster.
Obiettivi
- Utilizza Skaffold per creare e inviare un'immagine e per inserire il nome e il digest dell'immagine in un manifest Kubernetes.
- Utilizza la funzione lato client digester e il webhook di ammissione mutante per aggiungere i digest alle immagini nei pod e nei modelli di pod Kubernetes.
- Utilizza i setter kpt per sostituire un tag immagine in un manifest Kubernetes con un digest dell'immagine.
- Utilizza kustomize per generare un manifest Kubernetes con un digest dell'immagine.
- Utilizza
gke-deployper risolvere un tag immagine in un digest in un manifest Kubernetes. - Utilizza
koper creare ed eseguire il push di un'immagine e per inserire il nome e il digest dell'immagine in un manifest Kubernetes.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.
Prima di iniziare
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, activate Cloud Shell.
In Cloud Shell, imposta il progetto predefinito per Google Cloud CLI:
gcloud config set project PROJECT_IDSostituisci
PROJECT_IDcon il tuo [ID progetto].Crea un repository di immagini container in Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --location=LOCATION \ --repository-format=dockerSostituisci quanto segue:
REPOSITORY: il nome che vuoi utilizzare per il repository, ad esempiodigest-tutorial.LOCATION: una posizione di Artifact Registry, ad esempious-central1.
Configura l'autenticazione nella posizione di Artifact Registry per gli strumenti CLI utilizzati in questo tutorial:
gcloud auth configure-docker LOCATION-docker.pkg.devUtilizzo di Skaffold
Skaffold è uno strumento a riga di comando per lo sviluppo e il deployment continui di applicazioni nei cluster Kubernetes.
Utilizza Skaffold per creare un'immagine, eseguirne il push su Artifact Registry e sostituire il valore segnaposto
imagein un modello di manifest Kubernetes con il nome, il tag e il digest dell'immagine di cui è stato eseguito il push:In Cloud Shell, crea una directory e vai a una directory per archiviare i file che crei in questa sezione:
mkdir -p ~/container-image-digests-tutorial/skaffold cd ~/container-image-digests-tutorial/skaffoldClona il repository Git di Skaffold:
git clone https://github.com/GoogleContainerTools/skaffold.gitVai alla directory dell'esempio
getting-started:cd skaffold/examples/getting-startedEstrai il tag Git che corrisponde alla tua versione di Skaffold:
git checkout $(skaffold version)Visualizza il file di configurazione
skaffold.yaml:cat skaffold.yamlIl file è simile al seguente:
apiVersion: skaffold/v4beta6 kind: Config build: artifacts: - image: skaffold-example manifests: rawYaml: - k8s-pod.yaml
La sezione
build.artifactscontiene il nome di un'immagine segnaposto. Skaffold cerca questo segnaposto nei file manifest di input.La sezione
manifestsindica a Skaffold di leggere un manifest di input dalla directory corrente con il nomek8s-pod.yaml.Per una panoramica di tutte le opzioni disponibili, consulta la documentazione di riferimento di
skaffold.yaml.Visualizza il modello di manifest Kubernetes:
cat k8s-pod.yamlIl file è il seguente:
apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - name: getting-started image: skaffold-example
Il valore segnaposto
skaffold-examplenel campoimagecorrisponde al valore del campoimagenel fileskaffold.yaml. Skaffold sostituisce questo valore segnaposto con il nome completo dell'immagine e il digest nell'output di rendering.Crea l'immagine ed eseguine il push in Artifact Registry:
skaffold build \ --default-repo=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY \ --file-output=artifacts.json \ --interactive=false \ --push=true \ --update-check=falseQuesto comando utilizza i seguenti flag:
- Il flag
--file-outputspecifica il file in cui Skaffold salva le informazioni sull'immagine creata, incluso il valore digest. - Il flag
--pushindica a Skaffold di eseguire il push dell'immagine creata nel registro delle immagini container specificato dal flag--default-repo. - I flag
--interactivee--update-checksono entrambi impostati sufalse. Imposta questi flag sufalsein ambienti non interattivi, ad esempio pipeline di build, ma lasciali con i valori predefiniti (trueper entrambi i flag) per lo sviluppo locale.
Se utilizzi Cloud Deploy per il deployment in GKE, utilizza il file del flag
--file-outputcome valore del flag--build-artifactsquando crei una release.- Il flag
Esegui il rendering del manifest Kubernetes espanso con il nome, il tag e il digest dell'immagine container del passaggio precedente:
skaffold render \ --build-artifacts=artifacts.json \ --digest-source=none \ --interactive=false \ --offline=true \ --output=rendered.yaml \ --update-check=falseQuesto comando utilizza i seguenti flag:
- Il flag
--build-artifactsfa riferimento al file di output del comandoskaffold buildnel passaggio precedente. - Il flag
--digest-source=noneindica che Skaffold utilizza il valore digest del file fornito nel flag--build-artifacts, anziché risolvere il digest dal registro delle immagini container. - Il flag
--offline=trueindica che puoi eseguire il comando senza richiedere l'accesso a un cluster Kubernetes. - Il flag
--outputspecifica il file di output per il manifest sottoposto a rendering.
- Il flag
Visualizza il manifest sottoposto a rendering:
cat rendered.yamlL'output è simile al seguente:
apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - image: LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/skaffold-example:TAG@sha256:DIGEST name: getting-started
In questo output, vengono visualizzati i seguenti valori:
TAG: il tag assegnato da Skaffold all'immagine.DIGEST: il valore del digest dell'immagine
Utilizzo del digester
Digester aggiunge i digest alle immagini container e init container nelle specifiche di pod e modello di pod di Kubernetes. Il digest sostituisce i riferimenti alle immagini container che utilizzano tag:
spec: containers: - image: gcr.io/google-containers/echoserver:1.10Con riferimenti che utilizzano il digest dell'immagine:
spec: containers: - image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229Digester può essere eseguito come webhook di ammissione mutante in un cluster Kubernetes o come funzione KRM lato client con gli strumenti a riga di comando kpt o kustomize.
Utilizzare la funzione KRM del digester
In Cloud Shell, crea una directory e vai a una directory per archiviare i file che crei in questa sezione:
mkdir -p ~/container-image-digests-tutorial/digester-fn cd ~/container-image-digests-tutorial/digester-fnScarica il programma binario del digester:
mkdir -p ${HOME}/bin export PATH=${HOME}/bin:${PATH} DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name) curl -L "https://github.com/google/k8s-digester/releases/download/${DIGESTER_VERSION}/digester_$(uname -s)_$(uname -m)" --output ${HOME}/bin/digester chmod +x ${HOME}/bin/digesterCrea un manifest del pod Kubernetes che fa riferimento all'immagine
gcr.io/google-containers/echoserverutilizzando il tag1.10:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFEsegui la funzione KRM digester utilizzando kpt con i manifest nel directory corrente (
.):kpt fn eval . --exec digesterQuando esegui questo comando, kpt esegue un aggiornamento sul posto dei manifest nella directory corrente. Se vuoi che kpt mostri il manifest aggiornato nella console e lasci invariato il file manifest, aggiungi il flag
--output unwrap.Visualizza il manifest aggiornato:
cat pod.yamlIl file è il seguente:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 ports: - containerPort: 8080
Utilizzo del webhook di ammissione del digester
In Cloud Shell, crea una directory e vai a una directory per archiviare i file che crei in questa sezione:
mkdir -p ~/container-image-digests-tutorial/digester-webhook cd ~/container-image-digests-tutorial/digester-webhookCrea un cluster Kubernetes locale utilizzando kind:
kind create clusterkind è uno strumento a riga di comando per eseguire cluster Kubernetes locali utilizzando Docker.
Esegui il deployment del webhook del digester:
DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name) kustomize build "https://github.com/google/k8s-digester.git/manifests?ref=${DIGESTER_VERSION}" | kubectl apply -f -Crea uno spazio dei nomi Kubernetes denominato
digester-demonel cluster kind:kubectl create namespace digester-demoAggiungi l'etichetta
digest-resolution: enabledallo spazio dei nomidigester-demo:kubectl label namespace digester-demo digest-resolution=enabledIl webhook digester aggiunge i digest ai pod negli spazi dei nomi con questa etichetta.
Crea un manifest di deployment Kubernetes che faccia riferimento all'immagine
gcr.io/google-containers/echoserverutilizzando il tag1.10:cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFApplica il manifest nello spazio dei nomi
digester-demo:kubectl apply --filename deployment.yaml --namespace digester-demo \ --output jsonpath='{.spec.template.spec.containers[].image}{"\n"}'Il flag
--outputindica akubectldi restituire il nome dell'immagine alla console, seguito da un carattere di nuova riga. L'output è il seguente:gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229Questo output mostra che il webhook del digester ha aggiunto il digest dell'immagine alla specifica del modello di pod nella risorsa di deployment.
Elimina il cluster kind per liberare risorse nella sessione Cloud Shell:
kind delete cluster
Utilizzo dei setter kpt
kpt è uno strumento a riga di comando per gestire, manipolare, personalizzare e applicare i manifest delle risorse Kubernetes.
Puoi utilizzare le funzioni KRM
create-setterseapply-settersdel catalogo delle funzioni kpt per aggiornare i digest delle immagini nei manifest Kubernetes quando crei nuove immagini.In Cloud Shell, crea una directory e vai a una directory per archiviare i file che crei in questa sezione:
mkdir -p ~/container-image-digests-tutorial/kpt cd ~/container-image-digests-tutorial/kptCrea un pacchetto kpt nella directory corrente:
kpt pkg init --description "Container image digest tutorial"Crea un manifest del pod Kubernetes che fa riferimento all'immagine
gcr.io/google-containers/echoserverutilizzando il tag1.10:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFUtilizza kpt per creare un setter denominato
echoimageper il campo del manifest, dove il valore esistente ègcr.io/google-containers/echoserver:1.10:kpt fn eval . \ --image gcr.io/kpt-fn/create-setters@sha256:0220cc87f29ff9abfa3a3b5643aa50f18d355d5e9dc9e1f518119633ddc4895c \ -- "echoimage=gcr.io/google-containers/echoserver:1.10"Visualizza il manifest:
cat pod.yamlIl file è il seguente:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 # kpt-set: ${echoimage} ports: - containerPort: 8080
Ottieni il valore digest dell'immagine container:
DIGEST=$(gcloud container images describe \ gcr.io/google-containers/echoserver:1.10 \ --format='value(image_summary.digest)')Imposta il nuovo valore del campo:
kpt fn eval . \ --image gcr.io/kpt-fn/apply-setters@sha256:4d4295727183396f0c3c6a75d2560254c2f9041a39e95dc1e5beffeb49cc1a12 \ -- "echoimage=gcr.io/google-containers/echoserver:1.10@$DIGEST"Quando esegui questo comando, kpt esegue una sostituzione sul posto del valore del campo
imagenel manifest.Visualizza il manifest aggiornato:
cat pod.yamlIl file è il seguente:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 # kpt-set: ${echoimage} ports: - containerPort: 8080
Utilizzo di trasformatori di immagini kustomize
kustomize è uno strumento a riga di comando che consente di personalizzare i manifest Kubernetes utilizzando overlay, patch e trasformatori.
Puoi utilizzare lo strumento di trasformazione delle immagini kustomize image transformer per aggiornare il nome, il tag e il digest dell'immagine nel manifest esistente.
Lo snippet
kustomization.yamlseguente mostra come configurare il trasformatore di immagini per utilizzare il valore del trasformatoredigestper le immagini in cui il valore della specifica del podimagecorrisponde al valore del trasformatorename:images: - name: gcr.io/google-containers/echoserver digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
Per utilizzare un trasformatore di immagini kustomize con un digest dell'immagine, procedi nel seguente modo:
In Cloud Shell, crea una directory e vai a una directory per archiviare i file che crei in questa sezione:
mkdir -p ~/container-image-digests-tutorial/kustomize cd ~/container-image-digests-tutorial/kustomizeCrea un file
kustomization.yaml:kustomize initCrea un manifest Kubernetes con una specifica del pod che fa riferimento all'immagine
gcr.io/google-containers/echoserverutilizzando il tag1.10:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFAggiungi il manifest come risorsa nel file
kustomization.yaml:kustomize edit add resource pod.yamlUtilizza un trasformatore di immagini per aggiornare il digest dell'immagine:
kustomize edit set image \ gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229Visualizza il trasformatore di immagini nel file
kustomization.yaml:cat kustomization.yamlIl file è il seguente:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - pod.yaml images: - digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: gcr.io/google-containers/echoserver
Visualizza il manifest risultante:
kustomize build .L'output è il seguente:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: echoserver ports: - containerPort: 8080
Per eseguire il trasformatore kustomize e applicare il manifest risultante a un cluster Kubernetes in un unico passaggio, puoi utilizzare il comando
kubectl applycon il flag--kustomize:kubectl apply --kustomize .Se vuoi applicare l'output in un secondo momento, puoi reindirizzare l'output del comando
kustomize builda un file.
Uso:
gke-deploygke-deployè uno strumento a riga di comando che utilizzi con Google Kubernetes Engine (GKE).gke-deployesegue il wrapping dello strumento a riga di comandokubectle può modificare le risorse che crei seguendo le pratiche consigliate di Google.Se utilizzi i sottocomandi
gke-deployprepareorun,gke-deployrisolve i tag immagine in digest e salva i manifest espansi con i digest delle immagini nel fileoutput/expanded/aggregated-resources.yamlper impostazione predefinita.Puoi utilizzare
gke-deploy runsia per sostituire il tag immagine con un digest sia per applicare il manifest espanso al cluster GKE. Sebbene questo comando sia pratico, ha uno svantaggio: il tag immagine viene sostituito al momento del deployment. L'immagine associata al tag potrebbe essere cambiata nel periodo di tempo tra la decisione di eseguire il deployment e l'esecuzione del deployment, con conseguente deployment di un'immagine imprevista. Per i deployment in produzione, consigliamo passaggi separati per generare e applicare i manifest.Per sostituire un tag immagine in un manifest di deployment Kubernetes con il digest dell'immagine:
In Cloud Shell, crea una directory e vai a una directory per archiviare i file che crei in questa sezione:
mkdir -p ~/container-image-digests-tutorial/gke-deploy cd ~/container-image-digests-tutorial/gke-deployInstalla
gke-deploy:go install github.com/GoogleCloudPlatform/cloud-builders/gke-deploy@latestCrea un manifest di deployment Kubernetes che faccia riferimento all'immagine
gcr.io/google-containers/echoserverutilizzando il tag1.10:cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFGenera un manifest espanso basato sul manifest
deployment.yaml:gke-deploy prepare \ --filename deployment.yaml \ --image gcr.io/google-containers/echoserver:1.10 \ --version 1.10Visualizza il file manifest espanso:
cat output/expanded/aggregated-resources.yamlL'output è il seguente:
apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/managed-by: gcp-cloud-build-deploy app.kubernetes.io/version: "1.10" name: echo-deployment namespace: default spec: selector: matchLabels: app: echo template: metadata: labels: app: echo app.kubernetes.io/managed-by: gcp-cloud-build-deploy app.kubernetes.io/version: "1.10" spec: containers: - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: echoserver ports: - containerPort: 8080
Nel manifest espanso, il tag immagine viene sostituito dal digest.
L'argomento
--versionche hai utilizzato con il comandogke-deployimposta il valore dell'etichettaapp.kubernetes.io/versionnei metadati del deployment e del modello di pod del manifest espanso.Per scoprire come utilizzare
gke-deploycon Cloud Build, consulta la documentazione di Cloud Build pergke-deploy.
Uso:
kokoè uno strumento a riga di comando e una libreria per la creazione di immagini container Go e il loro deployment nei cluster Kubernetes.kocrea immagini senza utilizzare il daemon Docker, quindi puoi utilizzarlo in ambienti in cui non puoi installare Docker.Il comando secondario
kobuildcrea immagini e le pubblica in un registro di immagini container o le carica nel daemon Docker locale.Il comando secondario
koresolveesegue le seguenti operazioni:- Identifica le immagini da creare trovando i segnaposto nei campi
imagedei manifest Kubernetes che fornisci utilizzando l'argomento--filename. - Crea e pubblica le immagini.
- Sostituisce i segnaposto dei valori
imagecon i nomi e i digest delle immagini create. - Stampa i manifest espansi.
I sottocomandi
koapply,createeruneseguono gli stessi passaggi diresolve, quindi eseguonokubectl apply,createoruncon i manifest espansi.Per creare un'immagine dal codice sorgente Go e aggiungere il digest dell'immagine a un manifest di deployment Kubernetes, procedi nel seguente modo:
In Cloud Shell, crea una directory e vai a una directory per archiviare i file che crei in questa sezione:
mkdir -p ~/container-image-digests-tutorial/ko cd ~/container-image-digests-tutorial/koScarica
koe aggiungilo al tuoPATH:mkdir -p ${HOME}/bin export PATH=${HOME}/bin:${PATH} KO_VERSION=$(curl -sL https://api.github.com/repos/ko-build/ko/releases/latest | jq -r .tag_name | cut -c2-) curl -L "https://github.com/ko-build/ko/releases/download/v${KO_VERSION}/ko_${KO_VERSION}_$(uname -s)_$(uname -m).tar.gz" | tar -zxC ${HOME}/bin koCrea un'app Go con il nome del modulo
example.com/hello-worldin una nuova directory denominataapp:mkdir -p app/cmd/ko-example cd app go mod init example.com/hello-world cat << EOF > cmd/ko-example/main.go package main import "fmt" func main() { fmt.Println("hello world") } EOFDefinisci il repository di immagini che
koutilizza per pubblicare le immagini:export KO_DOCKER_REPO=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORYQuesto esempio utilizza Artifact Registry, ma puoi utilizzare
kocon un registro di immagini container diverso.Per creare e pubblicare un'immagine per la tua app, esegui uno dei seguenti passaggi:
Crea e pubblica un'immagine per la tua app fornendo il percorso al tuo pacchetto principale Go:
ko build --base-import-paths ./cmd/ko-exampleL'argomento facoltativo
--base-import-pathsindica chekoutilizza il nome breve della directory del pacchetto principale come nome dell'immagine.kostampa il nome e il digest dell'immagine instdoutnel seguente formato:LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGESTIn questo output,
DIGESTè il valore del digest dell'immagine.Utilizza
koper sostituire un segnaposto del manifest con il nome e il digest dell'immagine che crea e pubblica:Crea un manifest del pod Kubernetes. Il manifest utilizza il segnaposto
ko://IMPORT_PATH_OF_YOUR_MAIN_PACKAGEcome valore del campoimage:cat << EOF > ko-pod.yaml apiVersion: v1 kind: Pod metadata: name: ko-example spec: containers: - name: hello-world image: ko://example.com/hello-world/cmd/ko-example EOFCrea e pubblica un'immagine per la tua app e sostituisci il segnaposto del manifest con il nome e il digest dell'immagine:
ko resolve --base-import-paths --filename ko-pod.yamlkostampa il manifest con il nome e il digest dell'immagine instdout:apiVersion: v1 kind: Pod metadata: name: ko-example spec: containers: - name: hello-world image: LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGEST
In questo output,
DIGESTè il valore del digest dell'immagine.
Esegui la pulizia
Il modo più semplice per eliminare la fatturazione è eliminare il Google Cloud progetto che hai creato per il tutorial. In alternativa, puoi eliminare le singole risorse.
Elimina il progetto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina le risorse
Se vuoi conservare il progetto Google Cloud che hai utilizzato in questo tutorial, elimina le singole risorse:
In Cloud Shell, elimina i file che hai creato in questo tutorial:
cd rm -rf ~/container-image-digests-tutorialElimina il repository di immagini container in Artifact Registry:
gcloud artifacts repositories delete REPOSITORY \ --location=LOCATION --async --quiet
Passaggi successivi
- Scopri di più sui digest delle immagini container.
- Scopri di più sulla funzione KRM lato client digester e sul webhook di mutazione di Kubernetes.
- Esplora la distribuzione continua in stile GitOps con Cloud Build.