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:

  1. 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.

  2. Crie uma configuração do Skaffold e um manifesto do Kubernetes para especificar a imagem do contentor (pré-criada) a implementar.

  3. Defina o pipeline de entrega e o alvo de implementação do Cloud Deploy.

  4. 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.

  5. Veja o pipeline de fornecimento e o lançamento na Google Cloud consola.

  6. Crie um segundo lançamento, desta vez executando a fase de teste canário para implementar a aplicação em 50%.

  7. Avançar o lançamento para implementação a 100%.

Antes de começar

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  14. Se já tiver a CLI instalada, certifique-se de que está a executar a versão mais recente:

    gcloud components update
    

  15. 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.

    1. 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"
      

    2. 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"
        

    3. Adicione a função iam.serviceAccountUser, que inclui a autorização actAspara 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

    1. 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
      
    2. Obtenha as credenciais do cluster:

      gcloud container clusters get-credentials canary-quickstart-cluster \
             --project=PROJECT_ID \
             --region=us-central1
      
    3. 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
      
    4. 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.

    1. Abra uma janela de terminal.

    2. 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
      
    3. 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.

    4. Crie o manifesto da aplicação.

      GKE

      Crie um ficheiro denominado kubernetes.yaml no diretório deploy-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ório deploy-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ório deploy-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ório deploy-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ório deploy-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ório deploy-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
    
    1. 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.

    2. 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.

      Visualização do pipeline de fornecimento na consola Google Cloud

    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ório deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi ou deploy-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.

    1. 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.

      Abra a página Pipelines de fornecimento

    2. 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ó.

      visualização do pipeline de fornecimento na consola Google Cloud

      O lançamento é apresentado no separador Lançamentos em Detalhes do pipeline de envio.

    3. 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.

      Implementações na consola Google Cloud

      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%:

    1. Na visualização do pipeline, clique em Avançar para estável.

    2. 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%.

    pipeline de entrega na fase estável

    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.

    1. Para criar um novo release, execute o seguinte comando a partir do diretório deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi ou deploy-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:

      pipeline de fornecimento a iniciar a fase de teste

      Quando a primeira fase de implementação termina, a implementação passa para a fase de teste:

      Visualização do pipeline de fornecimento na consola Google Cloud , com a aplicação implementada em 50%

      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%.

    2. 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%.

      pipeline de entrega na fase estável, implementado a 100%

    Limpar

    Para evitar incorrer em cobranças na sua Google Cloud conta pelos recursos usados nesta página, siga estes passos.

    1. Elimine o cluster canary-quickstart-cluster (apenas no GKE):

      gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
      
    2. 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
      
    3. 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
      
    4. Elimine os contentores do Cloud Storage que o Cloud Deploy criou.

      Uma termina com _clouddeploy e a outra é [region].deploy-artifacts.[project].appspot.com.

      Abra a página do navegador do Cloud Storage

    É tudo. Concluiu este início rápido!

    O que se segue?