Implemente uma aplicação de forma gradual num destino
Este início rápido mostra como usar o Cloud Deploy para fornecer uma imagem de aplicação de exemplo numa implementação canária no Google Kubernetes Engine ou no Cloud Run. (Também pode executar uma implementação canária no GKE Enterprise, mas apenas o GKE e o Cloud Run são apresentados neste início rápido.)
Uma implementação canary divide o tráfego entre uma versão da aplicação já implementada e a nova versão. O Cloud Run distribui o tráfego com base nas percentagens que configurar no pipeline de fornecimento. O GKE implementa a nova versão numa proporção de pods. Este início rápido é implementado primeiro em 50% e, em seguida, em 100%.
Neste início rápido, existe apenas um alvo,
(prod
).
Por isso, criamos apenas um cluster do GKE ou um serviço do Cloud Run para executar a sua aplicação.
Neste início rápido, vai fazer o seguinte:
Crie um cluster do GKE ou defina um serviço do Cloud Run.
Também pode fazer uma implementação canary em clusters do GKE Enterprise, mas este início rápido usa apenas o GKE e o Cloud Run.
Crie uma configuração do Skaffold e um manifesto do Kubernetes para especificar a imagem do contentor (pré-criada) a implementar.
Defina o pipeline de entrega e o alvo de implementação do Cloud Deploy.
Invoque a sua pipeline de fornecimento criando um lançamento, que é implementado automaticamente num destino.
Este primeiro lançamento ignora a fase de teste canary.
Veja o pipeline de fornecimento e o lançamento na Google Cloud consola.
Crie um segundo lançamento, desta vez executando a fase de teste canário para implementar a aplicação em 50%.
Avançar o lançamento para implementação a 100%.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
- Certifique-se de que a conta de serviço predefinida do Compute Engine tem autorizações suficientes.
A conta de serviço pode já ter as autorizações necessárias. Estes passos são incluídos para projetos que desativam as concessões de funções automáticas para contas de serviço predefinidas.
- Primeiro, adicione a função
clouddeploy.jobRunner
:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.jobRunner"
- Adicione a função de programador para o seu tempo de execução específico.
- Para o GKE e o GKE com a API Gateway:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/container.developer"
- Para o Cloud Run:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/run.developer"
-
Adicione a função
iam.serviceAccountUser
, que inclui a autorizaçãoactAs
para implementar no tempo de execução:gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
Crie o seu ambiente de tempo de execução
GKE
Crie um cluster do GKE Autopilot:
gcloud container clusters create-auto canary-quickstart-cluster \ --project=PROJECT_ID \ --region=us-central1
GKE + API Gateway
Crie um cluster do GKE com as definições recomendadas para suportar a utilização com o Istio:
gcloud container clusters create canary-quickstart-cluster \ --machine-type=n1-standard-1 \ --num-nodes 4 \ --region=us-central1 \ --project=PROJECT_ID
Obtenha as credenciais do cluster:
gcloud container clusters get-credentials canary-quickstart-cluster \ --project=PROJECT_ID \ --region=us-central1
Instale os CRDs da API Kubernetes Gateway se ainda não estiverem presentes no cluster.
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
Ative a implementação do controlador de gateway do Istio instalando o Istio.
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \ && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
Cloud Run
Se estiver a usar o Cloud Run, pode ignorar este comando. Não tem de fazer nada aqui.
Prepare a configuração do Skaffold e o manifesto da aplicação
O Cloud Deploy usa o Skaffold para fornecer os detalhes sobre o que implementar e como o implementar corretamente no seu alvo.
Neste início rápido, cria um ficheiro
skaffold.yaml
, que identifica o manifesto do Kubernetes ou a configuração do serviço do Cloud Run a implementar.Abra uma janela de terminal.
Crie um novo diretório e navegue para o mesmo.
GKE
mkdir deploy-canary-quickstart-gke cd deploy-canary-quickstart-gke
GKE + API Gateway
mkdir deploy-canary-quickstart-gke-gatewayapi cd deploy-canary-quickstart-gke-gatewayapi
Cloud Run
mkdir deploy-canary-quickstart-run cd deploy-canary-quickstart-run
Crie um ficheiro denominado
skaffold.yaml
com o seguinte conteúdo:GKE
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - kubernetes.yaml deploy: kubectl: {}
GKE + API Gateway
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - kubernetes.yaml deploy: kubectl: {}
Cloud Run
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - run.yaml deploy: cloudrun: {}
Este ficheiro é uma configuração mínima do Skaffold que identifica o seu manifesto. Para este início rápido, cria o ficheiro. No entanto, também pode pedir ao Cloud Deploy que crie um para si, para aplicações simples que não sejam de produção.
Consulte a referência
skaffold.yaml
para mais informações acerca deste ficheiro.Crie o manifesto da aplicação.
GKE
Crie um ficheiro denominado
kubernetes.yaml
no diretóriodeploy-canary-quickstart-gke
com o seguinte conteúdo:apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app namespace: default spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-image --- apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: selector: app: my-app ports: - protocol: TCP port: 80
Este ficheiro é um manifesto do Kubernetes, que é aplicado ao cluster para implementar a aplicação. Este manifesto inclui os recursos de serviço e implementação necessários para a implementação canary, além de um HTTPRoute e o recurso de gateway necessário para usar a API Gateway.
A imagem do contentor a implementar é definida aqui como um marcador de posição,
my-app-image
, que é substituído pela imagem específica quando cria a versão.GKE + API Gateway
Crie um ficheiro denominado
kubernetes.yaml
no diretóriodeploy-canary-quickstart-gke-gatewayapi
com o seguinte conteúdo:kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: my-gateway annotations: networking.istio.io/service-type: "ClusterIP" spec: gatewayClassName: istio listeners: - name: default hostname: "*.example.com" port: 80 protocol: HTTP allowedRoutes: namespaces: from: All --- kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: my-httproute spec: parentRefs: - kind: Gateway name: my-gateway hostnames: - "test.example.com" rules: - backendRefs: - name: my-service port: 80 --- apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-image
Este ficheiro é um manifesto do Kubernetes, que é aplicado ao cluster para implementar a aplicação. Este manifesto inclui os recursos de serviço e implementação necessários para a implementação canary, além de um HTTPRoute e o recurso de gateway necessário para usar a API Gateway.
A imagem do contentor a implementar é definida aqui como um marcador de posição,
my-app-image
, que é substituído pela imagem específica quando cria a versão.Cloud Run
Crie um ficheiro denominado
run.yaml
no diretóriodeploy-canary-quickstart-run
com o seguinte conteúdo:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-canary-run-service spec: template: spec: containers: - image: my-app-image
Este ficheiro é uma definição básica do serviço do Cloud Run, que é aplicada no momento da implementação para criar o seu serviço no Cloud Run. A imagem do contentor a implementar é definida aqui como um marcador de posição,
my-app-image
, que é substituído pela imagem específica quando cria a versão.
Crie o seu pipeline de entrega e segmentações
Pode definir o pipeline de entrega e os alvos num ficheiro ou em ficheiros separados. Neste início rápido, criamos um ficheiro para o nosso pipeline e o nosso único destino:
GKE
Crie um ficheiro denominado
clouddeploy.yaml
no diretóriodeploy-canary-quickstart-gke
com o seguinte conteúdo:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-canary-demo-app-1 description: main application pipeline serialPipeline: stages: - targetId: prod profiles: [] strategy: canary: runtimeConfig: kubernetes: serviceNetworking: service: "my-service" deployment: "my-deployment" canaryDeployment: percentages: [50] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod description: prod GKE cluster gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
GKE + API Gateway
Crie um ficheiro denominado
clouddeploy.yaml
no diretóriodeploy-canary-quickstart-gke-gatewayapi
com o seguinte conteúdo:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-canary-demo-app-1 description: main application pipeline serialPipeline: stages: - targetId: prod profiles: [] strategy: canary: runtimeConfig: kubernetes: gatewayServiceMesh: httpRoute: "my-httproute" service: "my-service" deployment: "my-deployment" canaryDeployment: percentages: [50] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod description: prod GKE cluster gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
Cloud Run
Crie um ficheiro denominado
clouddeploy.yaml
no diretóriodeploy-canary-quickstart-run
com o seguinte conteúdo:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-canary-demo-app-1 description: main application pipeline serialPipeline: stages: - targetId: prod profiles: [] strategy: canary: runtimeConfig: cloudRun: automaticTrafficControl: true canaryDeployment: percentages: [50] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod description: prod Run Service run: location: projects/PROJECT_ID/locations/us-central1
Registe o pipeline e os destinos no serviço Cloud Deploy:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
Agora, tem um pipeline com um destino configurado para uma estratégia de implementação canary.
Confirme o seu pipeline e alvos:
Na Google Cloud consola, navegue para a página Cloud Deploy Pipelines de entrega para ver uma lista dos pipelines de entrega disponíveis.
Abra a página Pipelines de fornecimento
É apresentado o pipeline de entrega que acabou de criar e o destino que configurou é apresentado na coluna Destinos.
Crie um lançamento
Um lançamento é o recurso central do Cloud Deploy que representa as alterações que estão a ser implementadas. O pipeline de fornecimento define o ciclo de vida dessa versão. Consulte a secção Arquitetura do serviço Cloud Deploy para ver detalhes sobre esse ciclo de vida.
Para criar um recurso
release
que represente a imagem do contentor a implementar, execute o seguinte comando a partir do diretóriodeploy-canary-quickstart-gke
,deploy-canary-quickstart-gke-gatewayapi
oudeploy-canary-quickstart-run
:GKE
gcloud deploy releases create test-release-001 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
GKE + Gateway API
gcloud deploy releases create test-release-001 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
Cloud Run
gcloud deploy releases create test-release-001 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
Repare na flag
--images=
, que usa para substituir o marcador de posição (my-app-image
) no manifesto ou na definição de serviço pela imagem específica qualificada pela SHA. A Google recomenda que crie modelos dos seus manifestos desta forma e que use nomes de imagens qualificados com SHA no momento da criação do lançamento.Quando cria uma versão, o Cloud Deploy também cria automaticamente um recurso de implementação para a implementar imediatamente no seu único destino,
prod
.Passamos diretamente para a fase estável
Com este primeiro lançamento, ignoramos a fase canary e implementamos a 100% (fase estável). Isto deve-se ao facto de a aplicação não ter sido implementada anteriormente, pelo que não é possível calcular 50% dos pods (para o GKE) ou como o tráfego é dividido para o serviço (para o Cloud Run). Os pods (GKE) ou as revisões (Cloud Run) ainda não existem.
Depois de ignorar a fase canary, estamos agora prontos para iniciar a fase estável, que leva o tráfego a 100%. Depois disso, criamos outra versão e executamos o teste canário.
Numa situação real, normalmente, executa uma implementação canária em que a sua aplicação já está em execução, pelo que a omissão desta fase é rara.
Veja o lançamento na Google Cloud consola
Agora que criou o primeiro lançamento, a implementação é criada e pode ver o lançamento e a implementação na Google Cloud consola. Também pode ver a visualização do pipeline, que mostra o estado atual do lançamento.
Na Google Cloud consola, navegue para a página Cloud Deploy Pipelines de fornecimento para ver o pipeline de fornecimento my-canary-demo-app-1.
Clique no nome do pipeline de fornecimento "my-canary-demo-app-1".
A visualização do pipeline mostra o estado de implementação da app. Uma vez que existe apenas uma fase no pipeline, a visualização mostra apenas um nó.
O lançamento é apresentado no separador Lançamentos em Detalhes do pipeline de envio.
Clique no nome do lançamento,
test-release-001
.As implementações são apresentadas em Implementações. Pode clicar numa implementação para ver os respetivos detalhes, incluindo o registo de implementação.
Repare que o estado da implementação é "Avanço pendente" e o destino apresentado na visualização do pipeline tem um link para "Avançar para estável".
Avançar a fase de implementação
Após o primeiro lançamento, a fase de teste canary foi ignorada e a implementação está a aguardar o início da fase "estável", que implementa a aplicação a 100%:
Na visualização do pipeline, clique em Avançar para estável.
Quando lhe for pedido, clique em Avançar para confirmar.
Após alguns minutos, a implementação está na fase "estável" e a aplicação é implementada a 100%.
Execute a implementação de teste
Uma vez que o primeiro lançamento ignorou a fase de teste canary, vamos criar outro lançamento que, desta vez, executa uma implementação canary.
Para criar um novo
release
, execute o seguinte comando a partir do diretóriodeploy-canary-quickstart-gke
,deploy-canary-quickstart-gke-gatewayapi
oudeploy-canary-quickstart-run
:GKE
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
GKE + Gateway API
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
Cloud Run
gcloud deploy releases create test-release-002 \ --project=PROJECT_ID \ --region=us-central1 \ --delivery-pipeline=my-canary-demo-app-1 \ --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
Após alguns minutos, é criada uma implementação e, desta vez, a fase de teste canary é executada:
Quando a primeira fase de implementação termina, a implementação passa para a fase de teste:
Isto significa que a aplicação está agora implementada em 50%. Para o GKE baseado em serviceNetworking, é implementado em metade dos seus pods. Para o GKE baseado na API Gateway, o tráfego do Cloud Run é atribuído a 50%.
Clique em Implementação avançada e, de seguida, em Avançar quando lhe for pedido.
Isto avança a implementação para a fase "estável", implementando a aplicação a 100%.
Limpar
Para evitar incorrer em cobranças na sua Google Cloud conta pelos recursos usados nesta página, siga estes passos.
Elimine o cluster
canary-quickstart-cluster
(apenas no GKE):gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
Elimine o serviço
my-canary-run-service
(apenas no Cloud Run):gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID
Elimine o pipeline de fornecimento, o destino e todos os recursos de lançamento e implementação:
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
Elimine os contentores do Cloud Storage que o Cloud Deploy criou.
Uma termina com
_clouddeploy
e a outra é[region].deploy-artifacts.[project].appspot.com
.
É tudo. Concluiu este início rápido!
O que se segue?
- Primeiro, adicione a função
Se já tiver a CLI instalada, certifique-se de que está a executar a versão mais recente:
gcloud components update