Este tutorial mostra aos programadores e operadores que implementam contentores no Kubernetes como usar resumos de imagens de contentores para identificar imagens de contentores. Um resumo da imagem do contentor identifica de forma única e imutável uma imagem do contentor.
A implementação de imagens de contentores através do resumo da imagem oferece várias vantagens em comparação com a utilização de etiquetas de imagens. Para mais informações sobre resumos de imagens, consulte o documento que acompanha este tutorial sobre a utilização de resumos de imagens de contentores antes de continuar.
O argumento image para contentores numa especificação de pod do Kubernetes aceita imagens com resumos. Este argumento aplica-se em todos os locais onde usa uma especificação de pod, como na secção template dos recursos Deployment, StatefulSet, DaemonSet, ReplicaSet, CronJob e Job.
Para implementar uma imagem através do resumo, usa o nome da imagem, seguido de
@sha256: e do valor do resumo. Segue-se um exemplo de um recurso de implementação que usa uma imagem com um resumo. Uma implementação é um objeto da API Kubernetes que lhe permite executar várias réplicas de pods distribuídos entre os nós num 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
Uma desvantagem da utilização de resumos de imagens é que não sabe o valor do resumo até publicar a imagem num registo. À medida que cria novas imagens, o valor de resumo muda e precisa de uma forma de atualizar os manifestos do Kubernetes sempre que implementa.
Este tutorial mostra como pode usar ferramentas como
Skaffold,
kpt,
digester,
kustomize,
gke-deploy,
e
ko
para usar resumos de imagens nos seus manifestos.
Recomendações
Este documento apresenta várias formas de usar resumos de imagens em implementações do Kubernetes. As ferramentas descritas neste documento são complementares.
Por exemplo, pode usar o resultado de uma função kpt com o kustomize para criar variantes para diferentes ambientes. O Skaffold pode
criar imagens com o ko
e implementar as imagens nos seus clusters do Kubernetes com o kubectl ou o kpt.
O motivo pelo qual as ferramentas são complementares é que realizam edições estruturadas com base no modelo de recursos do Kubernetes (KRM). Este modelo torna as ferramentas conectáveis, e pode desenvolver a sua utilização das ferramentas para criar processos e pipelines que ajudam a implementar as suas apps e serviços.
Para começar, recomendamos a abordagem que funciona melhor com as suas ferramentas e processos existentes:
O Skaffold pode adicionar resumos às referências de imagens. Ativa esta função com uma pequena alteração de configuração. A adoção do Skaffold oferece vantagens adicionais, como a abstração da forma como diferentes ferramentas criam e implementam imagens de contentores.
Ao usar a ferramenta de análise como um webhook de admissão de mutação nos seus clusters do Kubernetes, pode adicionar resumos a todas as suas implementações com um impacto mínimo nos seus processos atuais de criação e implementação de imagens de contentores. O webhook do digestor também simplifica a adoção da autorização binária, porque só requer que seja adicionada uma etiqueta a um espaço de nomes.
O kpt é uma excelente opção se precisar de uma ferramenta flexível para manipular manifestos do Kubernetes. A ferramenta de digestão pode ser usada como uma função KRM do lado do cliente numa pipeline kpt.
Se já usa o kustomize para gerir manifestos do Kubernetes em vários ambientes, recomendamos que tire partido dos respetivos transformadores de imagens para implementar imagens por resumo.
koé uma excelente forma de criar e publicar imagens para apps Go e é usada por projetos de código aberto, como o Knative, o Tekton e o sigstore.
Se não usar nenhuma das ferramentas descritas neste documento, recomendamos que comece com o Skaffold e o webhook do digestor. O Skaffold é uma ferramenta comum usada por programadores e equipas de lançamento, e integra-se com as outras ferramentas descritas neste tutorial. Pode tirar partido destas opções de integração à medida que os seus requisitos evoluem. O webhook do Kubernetes do digest complementa o Skaffold ao permitir implementações baseadas em digests para um cluster inteiro.
Objetivos
- Use o Skaffold para criar e enviar uma imagem, e para inserir o nome da imagem e o resumo num manifesto do Kubernetes.
- Use a função do lado do cliente do digest e o webhook de admissão de mutação para adicionar digests a imagens em pods e modelos de pods do Kubernetes.
- Use definidores do kpt para substituir uma etiqueta de imagem num manifesto do Kubernetes por um resumo da imagem.
- Use o kustomize para gerar um manifesto do Kubernetes com um resumo da imagem.
- Use
gke-deploypara resolver uma etiqueta de imagem para um resumo num manifesto do Kubernetes. - Use
kopara criar e enviar uma imagem, e para inserir o nome e o resumo da imagem num manifesto do Kubernetes.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização prevista,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
-
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.
No Cloud Shell, defina o projeto predefinido para a CLI Google Cloud:
gcloud config set project PROJECT_IDSubstitua
PROJECT_IDpelo seu [ID do projeto].Crie um repositório de imagens de contentores no Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --location=LOCATION \ --repository-format=dockerSubstitua o seguinte:
REPOSITORY: o nome que quer usar para o seu repositório, por exemplo,digest-tutorial.LOCATION: uma localização do Artifact Registry>, por exemplo,us-central1.
Configure a autenticação na localização do Artifact Registry para as ferramentas de CLI usadas neste tutorial:
gcloud auth configure-docker LOCATION-docker.pkg.devUsar o Skaffold
O Skaffold é uma ferramenta de linha de comandos para o desenvolvimento e a implementação contínuos de aplicações em clusters do Kubernetes.
Use o Skaffold para criar uma imagem, enviar a imagem para o Artifact Registry e substituir o valor do marcador de posição
imagenum modelo de manifesto do Kubernetes pelo nome, pela etiqueta e pelo resumo da imagem enviada:No Cloud Shell, crie e aceda a um diretório para armazenar os ficheiros que criar nesta secção:
mkdir -p ~/container-image-digests-tutorial/skaffold cd ~/container-image-digests-tutorial/skaffoldClone o repositório Git do Skaffold:
git clone https://github.com/GoogleContainerTools/skaffold.gitAceda ao diretório do exemplo
getting-started:cd skaffold/examples/getting-startedConsulte a etiqueta Git que corresponde à sua versão do Skaffold:
git checkout $(skaffold version)Veja o ficheiro de configuração
skaffold.yaml:cat skaffold.yamlO ficheiro é semelhante ao seguinte:
apiVersion: skaffold/v4beta6 kind: Config build: artifacts: - image: skaffold-example manifests: rawYaml: - k8s-pod.yaml
A secção
build.artifactscontém um nome de imagem de marcador de posição. O Skaffold procura este marcador de posição nos ficheiros de manifesto de entrada.A secção
manifestsindica ao Skaffold que deve ler um manifesto de entrada do diretório atual com o nomek8s-pod.yaml.Para uma vista geral de todas as opções disponíveis, consulte a
skaffold.yamldocumentação de referência.Veja o modelo de manifesto do Kubernetes:
cat k8s-pod.yamlO ficheiro é o seguinte:
apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - name: getting-started image: skaffold-example
O valor do marcador de posição
skaffold-exampleno campoimagecorresponde ao valor do campoimageno ficheiroskaffold.yaml. O Skaffold substitui este valor do marcador de posição pelo nome completo da imagem e pelo resumo na saída renderizada.Crie e envie a imagem para o Artifact Registry:
skaffold build \ --default-repo=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY \ --file-output=artifacts.json \ --interactive=false \ --push=true \ --update-check=falseEste comando usa as seguintes flags:
- O sinalizador
--file-outputespecifica o ficheiro onde o Skaffold guarda as informações sobre a imagem criada, incluindo o valor de resumo. - A flag
--pushindica ao Skaffold que envie a imagem criada para o registo de imagens de contentores especificado pela flag--default-repo. - As flags
--interactivee--update-checkestão ambas definidas comofalse. Defina estas flags comofalseem ambientes não interativos, como pipelines de compilação, mas deixe-as com os valores predefinidos (truepara ambas as flags) para o desenvolvimento local.
Se usar o Cloud Deploy para implementar no GKE, use o ficheiro da flag
--file-outputcomo o valor da flag--build-artifactsquando criar uma versão.- O sinalizador
Renderize o manifesto do Kubernetes expandido com o nome, a etiqueta e o resumo da imagem do contentor do passo anterior:
skaffold render \ --build-artifacts=artifacts.json \ --digest-source=none \ --interactive=false \ --offline=true \ --output=rendered.yaml \ --update-check=falseEste comando usa as seguintes flags:
- A flag
--build-artifactsfaz referência ao ficheiro de saída do comandoskaffold buildno passo anterior. - A flag
--digest-source=nonesignifica que o Skaffold usa o valor do resumo do ficheiro fornecido na flag--build-artifacts, em vez de resolver o resumo do registo de imagens de contentores. - A flag
--offline=truesignifica que pode executar o comando sem precisar de acesso a um cluster do Kubernetes. - A flag
--outputespecifica o ficheiro de saída para o manifesto renderizado.
- A flag
Ver o manifesto renderizado:
cat rendered.yamlO resultado é semelhante ao seguinte:
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
Neste resultado, vê os seguintes valores:
TAG: a etiqueta que o Skaffold atribuiu à imagem.DIGEST: o valor do resumo de imagens
Usar digestor
O Digester adiciona resumos a imagens de contentores e contentores de inicialização em especificações de modelos de pods e pods do Kubernetes. O digestor substitui as referências de imagens de contentores que usam etiquetas:
spec: containers: - image: gcr.io/google-containers/echoserver:1.10Com referências que usam o resumo da imagem:
spec: containers: - image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229O Digester pode ser executado como um webhook de admissão de mutação num cluster do Kubernetes ou como uma função KRM do lado do cliente com as ferramentas de linha de comandos kpt ou kustomize.
Usar a função KRM do digestor
No Cloud Shell, crie e aceda a um diretório para armazenar os ficheiros que criar nesta secção:
mkdir -p ~/container-image-digests-tutorial/digester-fn cd ~/container-image-digests-tutorial/digester-fnTransfira o ficheiro binário do digestor:
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/digesterCrie um manifesto do Kubernetes Pod que faça referência à imagem
gcr.io/google-containers/echoserveratravés da etiqueta1.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 EOFExecute a função KRM do digestor usando o kpt com os manifestos no diretório atual (
.):kpt fn eval . --exec digesterQuando executa este comando, o kpt faz uma atualização no local dos manifestos no diretório atual. Se quiser que o kpt mostre o manifesto atualizado na consola e deixe o ficheiro de manifesto inalterado, adicione a flag
--output unwrap.Veja o manifesto atualizado:
cat pod.yamlO ficheiro é o seguinte:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 ports: - containerPort: 8080
Usar o webhook de admissão do digestor
No Cloud Shell, crie e aceda a um diretório para armazenar os ficheiros que criar nesta secção:
mkdir -p ~/container-image-digests-tutorial/digester-webhook cd ~/container-image-digests-tutorial/digester-webhookCrie um cluster Kubernetes local com o kind:
kind create clusterO kind é uma ferramenta de linha de comandos para executar clusters Kubernetes locais através do Docker.
Implemente o webhook do digestor:
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 -Crie um espaço de nomes do Kubernetes denominado
digester-demono cluster do tipo:kubectl create namespace digester-demoAdicione a etiqueta
digest-resolution: enabledao espaço de nomesdigester-demo:kubectl label namespace digester-demo digest-resolution=enabledO webhook do digestor adiciona resumos aos pods em espaços de nomes com esta etiqueta.
Crie um manifesto de implementação do Kubernetes que faça referência à imagem
gcr.io/google-containers/echoserveratravés da etiqueta1.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 EOFAplique o manifesto no espaço de nomes
digester-demo:kubectl apply --filename deployment.yaml --namespace digester-demo \ --output jsonpath='{.spec.template.spec.containers[].image}{"\n"}'A flag
--outputindica aokubectlque deve enviar o nome da imagem para a consola, seguido de um caráter de nova linha. O resultado é o seguinte:gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229Este resultado mostra que o webhook do digestor adicionou o resumo da imagem à especificação do modelo de pod no recurso de implementação.
Elimine o cluster do tipo para libertar recursos na sua sessão do Cloud Shell:
kind delete cluster
Usar definidores do kpt
O kpt é uma ferramenta de linha de comandos para gerir, manipular, personalizar e aplicar manifestos de recursos do Kubernetes.
Pode usar as funções
create-setterseapply-settersKRM do catálogo de funções do kpt para atualizar os resumos de imagens nos seus manifestos do Kubernetes quando cria novas imagens.No Cloud Shell, crie e aceda a um diretório para armazenar os ficheiros que criar nesta secção:
mkdir -p ~/container-image-digests-tutorial/kpt cd ~/container-image-digests-tutorial/kptCrie um pacote kpt no diretório atual:
kpt pkg init --description "Container image digest tutorial"Crie um manifesto do Kubernetes Pod que faça referência à imagem
gcr.io/google-containers/echoserveratravés da etiqueta1.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 EOFUse o kpt para criar um setter denominado
echoimagepara o campo do manifesto, onde o valor existente é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"Veja o manifesto:
cat pod.yamlO ficheiro é o seguinte:
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
Obtenha o valor de resumo da imagem do contentor:
DIGEST=$(gcloud container images describe \ gcr.io/google-containers/echoserver:1.10 \ --format='value(image_summary.digest)')Defina o novo valor do campo:
kpt fn eval . \ --image gcr.io/kpt-fn/apply-setters@sha256:4d4295727183396f0c3c6a75d2560254c2f9041a39e95dc1e5beffeb49cc1a12 \ -- "echoimage=gcr.io/google-containers/echoserver:1.10@$DIGEST"Quando executa este comando, o kpt faz uma substituição no local do valor do campo
imageno manifesto.Veja o manifesto atualizado:
cat pod.yamlO ficheiro é o seguinte:
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
Usar transformadores de imagens do kustomize
O kustomize é uma ferramenta de linha de comandos que lhe permite personalizar manifestos do Kubernetes através de sobreposições, patches e transformadores.
Pode usar o transformador de imagens do kustomize para atualizar o nome, a etiqueta e o resumo da imagem no manifesto existente.
O fragmento
kustomization.yamlseguinte mostra como configurar o transformador de imagens para usar o valor do transformadordigestpara imagens em que o valor da especificação do blocoimagecorresponde ao valor do transformadorname:images: - name: gcr.io/google-containers/echoserver digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
Para usar um transformador de imagens kustomize com um resumo de imagem, faça o seguinte:
No Cloud Shell, crie e aceda a um diretório para armazenar os ficheiros que criar nesta secção:
mkdir -p ~/container-image-digests-tutorial/kustomize cd ~/container-image-digests-tutorial/kustomizeCrie um ficheiro
kustomization.yaml:kustomize initCrie um manifesto do Kubernetes com uma especificação de pod que faça referência à imagem
gcr.io/google-containers/echoserveratravés da etiqueta1.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 EOFAdicione o manifesto como um recurso no ficheiro
kustomization.yaml:kustomize edit add resource pod.yamlUse um transformador de imagens para atualizar o resumo da imagem:
kustomize edit set image \ gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229Veja o transformador de imagens no ficheiro
kustomization.yaml:cat kustomization.yamlO ficheiro é o seguinte:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - pod.yaml images: - digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: gcr.io/google-containers/echoserver
Veja o manifesto resultante:
kustomize build .O resultado é o seguinte:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: echoserver ports: - containerPort: 8080
Para executar o transformador kustomize e aplicar o manifesto resultante a um cluster do Kubernetes num único passo, pode usar o comando
kubectl applycom a flag--kustomize:kubectl apply --kustomize .Se quiser aplicar a saída mais tarde, pode redirecionar a saída do comando
kustomize buildpara um ficheiro.
A usar
gke-deploygke-deployé uma ferramenta de linha de comandos que usa com o Google Kubernetes Engine (GKE).gke-deployenvolve a ferramenta de linha de comandoskubectle pode modificar os recursos que cria seguindo as práticas recomendadas da Google.Se usar os subcomandos
gke-deployprepareourun,gke-deployresolve as etiquetas de imagem em resumos e guarda os manifestos expandidos com os resumos de imagens no ficheirooutput/expanded/aggregated-resources.yamlpor predefinição.Pode usar
gke-deploy runpara substituir a etiqueta de imagem por um resumo e aplicar o manifesto expandido ao cluster do GKE. Embora este comando seja conveniente, tem uma desvantagem: a etiqueta de imagem é substituída no momento da implementação. A imagem associada à etiqueta pode ter sido alterada no período entre a decisão de implementação e a implementação, o que resultou na implementação de uma imagem inesperada. Para implementações de produção, recomendamos passos separados para gerar e aplicar manifestos.Para substituir uma etiqueta de imagem num manifesto de implementação do Kubernetes pelo resumo da imagem, faça o seguinte:
No Cloud Shell, crie e aceda a um diretório para armazenar os ficheiros que criar nesta secção:
mkdir -p ~/container-image-digests-tutorial/gke-deploy cd ~/container-image-digests-tutorial/gke-deployInstalar
gke-deploy:go install github.com/GoogleCloudPlatform/cloud-builders/gke-deploy@latestCrie um manifesto de implementação do Kubernetes que faça referência à imagem
gcr.io/google-containers/echoserveratravés da etiqueta1.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 EOFGere um manifesto expandido com base no manifesto
deployment.yaml:gke-deploy prepare \ --filename deployment.yaml \ --image gcr.io/google-containers/echoserver:1.10 \ --version 1.10Veja o manifesto expandido:
cat output/expanded/aggregated-resources.yamlO resultado é o seguinte:
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
No manifesto expandido, a etiqueta de imagem é substituída pelo resumo.
Para saber como usar o
gke-deploycom o Cloud Build, consulte a documentação do Cloud Build para ogke-deploy.
A usar
koO
koé uma ferramenta de linha de comandos e uma biblioteca para criar Go imagens de contentores e implementá-las em clusters do Kubernetes. Okocria imagens sem usar o daemon do Docker, pelo que pode usá-lo em ambientes onde não pode instalar o Docker.O subcomando
kobuildcria imagens e publica-as num registo de imagens de contentores ou carrega-as no seu daemon Docker local.O subcomando
koresolvefaz o seguinte:- Identifica as imagens a criar encontrando marcadores de posição nos campos
imagedos manifestos do Kubernetes que fornece através do argumento--filename. - Cria e publica as suas imagens.
- Substitui os marcadores de posição de valores
imagepelos nomes e resumos das imagens criadas. - Imprime os manifestos expandidos.
Os subcomandos
koapply,create, erunexecutam os mesmos passos queresolvee, em seguida, executamkubectl apply,createouruncom os manifestos expandidos.Para criar uma imagem a partir do código fonte Go e adicionar o resumo da imagem a um manifesto de implementação do Kubernetes, faça o seguinte
No Cloud Shell, crie e aceda a um diretório para armazenar os ficheiros que criar nesta secção:
mkdir -p ~/container-image-digests-tutorial/ko cd ~/container-image-digests-tutorial/koTransfira o ficheiro
koe adicione-o ao seuPATH: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 koCrie uma app Go com o nome do módulo
example.com/hello-worldnum novo diretório denominadoapp: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") } EOFDefina o repositório de imagens que o
kousa para publicar imagens:export KO_DOCKER_REPO=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORYEste exemplo usa o Artifact Registry, mas pode usar
kocom um registo de imagens de contentores diferente.Para criar e publicar uma imagem para a sua app, siga um dos seguintes passos:
Crie e publique uma imagem para a sua app indicando o caminho para o seu Go pacote principal:
ko build --base-import-paths ./cmd/ko-exampleO argumento opcional
--base-import-pathssignifica quekousa o nome abreviado do diretório do pacote principal como o nome da imagem.O comando
koimprime o nome e o resumo da imagem parastdoutno seguinte formato:LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGESTNeste resultado,
DIGESTé o valor do resumo da imagem.Use
kopara substituir um marcador de posição do manifesto pelo nome e o resumo da imagem que cria e publica:Crie um manifesto de pod do Kubernetes. O manifesto usa o marcador de posição
ko://IMPORT_PATH_OF_YOUR_MAIN_PACKAGEcomo o valor do 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 EOFCrie e publique uma imagem para a sua app e substitua o marcador de posição do manifesto pelo nome e resumo da imagem:
ko resolve --base-import-paths --filename ko-pod.yamlkoimprime o manifesto com o nome da imagem e o resumo parastdout:apiVersion: v1 kind: Pod metadata: name: ko-example spec: containers: - name: hello-world image: LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGEST
Neste resultado,
DIGESTé o valor do resumo da imagem.
Limpar
A forma mais fácil de eliminar a faturação é eliminar o Google Cloud projeto que criou para o tutorial. Em alternativa, pode eliminar os recursos individuais.
Elimine o projeto
- 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.
Elimine os recursos
Se quiser manter o Google Cloud projeto que usou neste tutorial, elimine os recursos individuais:
No Cloud Shell, elimine os ficheiros que criou neste tutorial:
cd rm -rf ~/container-image-digests-tutorialElimine o repositório de imagens de contentores no Artifact Registry:
gcloud artifacts repositories delete REPOSITORY \ --location=LOCATION --async --quiet
O que se segue?
- Saiba mais sobre os resumos de imagens de contentores.
- Saiba mais sobre a função KRM por parte do cliente do digestor e o webhook de mutação do Kubernetes.
- Explore a entrega contínua ao estilo GitOps com o Cloud Build.