Skip to main content

Esta versão do GitHub Enterprise foi descontinuada em 2023-01-18. Nenhum lançamento de patch será feito, mesmo para questões críticas de segurança. Para obter melhor desempenho, segurança aprimorada e novos recursos, atualize para a última versão do GitHub Enterprise. Para obter ajuda com a atualização, entre em contato com o suporte do GitHub Enterprise.

Implantar no Google Kubernetes Engine

Você pode realizar a implantação no Google Kubernetes Engine como parte dos seus fluxos de trabalho de implantação contínua (CD).

Observação: no momento, não há suporte para os executores hospedados no GitHub no GitHub Enterprise Server. Você pode ver mais informações sobre o suporte futuro planejado no GitHub public roadmap.

Introdução

Este guia explica como usar o GitHub Actions para criar um aplicativo conteinerizado, efetuar push dele no GCR (Registro de Contêiner do Google) e implantá-lo no GKE (Mecanismo de Kubernetes do Google) quando houver um push para o branch main.

O GKE é um serviço de cluster gerenciado do Kubernetes pelo Google Cloud que pode hospedar suas cargas de trabalho containerizadas na nuvem ou em seu próprio centro de dados. Para obter mais informações, confira o Mecanismo de Kubernetes do Google.

Pré-requisitos

Antes de prosseguir com a criação do fluxo de trabalho, você precisará concluir as etapas a seguir para seu projeto do Kubernetes. Este guia pressupõe que a raiz do seu projeto já tenha um Dockerfile e um arquivo de configuração de Implantação do Kubernetes. Para ver um exemplo, confira google-github-actions.

Criar um cluster do GKE

Para criar o cluster do GKE, primeiro, você precisará se autenticar usando a CLI do gcloud. Para obter mais informações sobre esta etapa, veja os artigos a seguir:

Por exemplo:

Shell
$ gcloud container clusters create $GKE_CLUSTER \
    --project=$GKE_PROJECT \
    --zone=$GKE_ZONE

Habilitar as APIs

Habilitar as APIs do Kubernetes Engine e do Registro de Contêiner. Por exemplo:

Shell
$ gcloud services enable \
    containerregistry.googleapis.com \
    container.googleapis.com

Configurar uma conta de serviço e armazenar as suas credenciais

Este procedimento demonstra como criar a conta de serviço para sua integração com o GKE. Ele explica como criar a conta, adicionar funções a ela, recuperar as respectivas chaves e armazená-las como um segredo de repositório criptografado codificado em Base64 chamado GKE_SA_KEY.

  1. Crie uma conta de serviço:

    $ gcloud iam service-accounts create $SA_NAME
    
  2. Recupere o endereço de email da conta de serviço que você acabou de criar:

    $ gcloud iam service-accounts list
    
  3. Adicionar funções à conta de serviço. Observação: Aplique funções mais restritivas para atender aos seus requisitos.

    $ gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/container.admin
    $ gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/storage.admin
    $ gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/container.clusterViewer
    
  4. Baixe o arquivo de chave JSON da conta de serviço:

    $ gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
    
  5. Armazene a chave da conta de serviço como um segredo chamado GKE_SA_KEY:

    $ export GKE_SA_KEY=$(cat key.json | base64)
    

    Para obter mais informações sobre como armazenar um segredo, confira "Segredos criptografados".

Armazenando o nome do seu projeto

Armazene o nome do projeto como um segredo chamado GKE_PROJECT. Para obter mais informações sobre como armazenar um segredo, confira "Segredos criptografados".

(Opcional) Configurar kustomize

Kustomize é uma ferramenta opcional usada para gerenciar especificações do YAML. Depois que você criar um arquivo kustomization, o fluxo de trabalho abaixo poderá ser usado para definir dinamicamente os campos da imagem e encaminhar o resultado para kubectl. Para obter mais informações, confira Uso do Kustomize.

(Opcional) Configure um ambiente de implantação

Os ambientes são usados para descrever um destino de implantação geral, como production, staging ou development. Quando um fluxo de trabalho de GitHub Actions é implantado em um ambiente, o ambiente é exibido na página principal do repositório. Você pode usar ambientes para exigir aprovação para um trabalho para prosseguir, restringir quais branches podem acionar um fluxo de trabalho ou limitar o acesso a segredos. Para obter mais informações sobre como criar ambientes, confira "Como usar ambientes para implantação".

Criar o fluxo de trabalho

Depois de preencher os pré-requisitos, você pode prosseguir com a criação do fluxo de trabalho.

O fluxo de trabalho a seguir mostra como construir uma imagem de contêiner e como carregá-los no GCR. Em seguida, ele usa as ferramentas do Kubernetes (como kubectl e kustomize) para efetuar pull da imagem na implantação do cluster.

Na chave env, altere o valor de GKE_CLUSTER para o nome do cluster, GKE_ZONE para a zona de cluster, DEPLOYMENT_NAME para o nome da implantação e IMAGE para o nome da imagem.

Se você configurou um ambiente de implantação, altere o valor de environment para que ele seja o nome do seu ambiente. Se você não tiver configurado um ambiente, exclua a chave environment.

YAML
# <a name="this-workflow-uses-actions-that-are-not-certified-by-github"></a>Esse fluxo de trabalho usa ações que não são certificadas pelo GitHub.
# <a name="they-are-provided-by-a-third-party-and-are-governed-by"></a>São fornecidas por terceiros e regidas por
# <a name="separate-terms-of-service-privacy-policy-and-support"></a>termos de serviço, política de privacidade e suporte separados
# <a name="documentation"></a>online.

# <a name="github-recommends-pinning-actions-to-a-commit-sha"></a>O GitHub recomenda fixar ações em um SHA de commit.
# <a name="to-get-a-newer-version-you-will-need-to-update-the-sha"></a>Para obter uma versão mais recente, você precisará atualizar o SHA.
# <a name="you-can-also-reference-a-tag-or-branch-but-the-action-may-change-without-warning"></a>Você também pode fazer referência a uma marca ou branch, mas a ação pode ser alterada sem aviso.

name: Build and Deploy to GKE

on:
  push:
    branches:
      - main

env:
  PROJECT_ID: ${{ secrets.GKE_PROJECT }}
  GKE_CLUSTER: cluster-1    # Add your cluster name here.
  GKE_ZONE: us-central1-c   # Add your cluster zone here.
  DEPLOYMENT_NAME: gke-test # Add your deployment name here.
  IMAGE: static-site

jobs:
  setup-build-publish-deploy:
    name: Setup, Build, Publish, and Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    # Setup gcloud CLI
    - uses: google-github-actions/setup-gcloud@94337306dda8180d967a56932ceb4ddcf01edae7
      with:
        service_account_key: ${{ secrets.GKE_SA_KEY }}
        project_id: ${{ secrets.GKE_PROJECT }}

    # Configure Docker to use the gcloud command-line tool as a credential
    # helper for authentication
    - run: |-
        gcloud --quiet auth configure-docker

    # Get the GKE credentials so we can deploy to the cluster
    - uses: google-github-actions/get-gke-credentials@fb08709ba27618c31c09e014e1d8364b02e5042e
      with:
        cluster_name: ${{ env.GKE_CLUSTER }}
        location: ${{ env.GKE_ZONE }}
        credentials: ${{ secrets.GKE_SA_KEY }}

    # Build the Docker image
    - name: Build
      run: |-
        docker build \
          --tag "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA" \
          --build-arg GITHUB_SHA="$GITHUB_SHA" \
          --build-arg GITHUB_REF="$GITHUB_REF" \
          .

    # Push the Docker image to Google Container Registry
    - name: Publish
      run: |-
        docker push "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA"

    # Set up kustomize
    - name: Set up Kustomize
      run: |-
        curl -sfLo kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/v3.1.0/kustomize_3.1.0_linux_amd64
        chmod u+x ./kustomize

    # Deploy the Docker image to the GKE cluster
    - name: Deploy
      run: |-
        ./kustomize edit set image gcr.io/PROJECT_ID/IMAGE:TAG=gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA
        ./kustomize build . | kubectl apply -f -
        kubectl rollout status deployment/$DEPLOYMENT_NAME
        kubectl get services -o wide

Recursos adicionais

Para mais informações sobre as ferramentas usadas nesses exemplos, consulte a documentação a seguir: