Skip to main content
We publish frequent updates to our documentation, and translation of this page may still be in progress. For the most current information, please visit the English documentation.

Deploying to Google Kubernetes Engine

You can deploy to Google Kubernetes Engine as part of your continuous deployment (CD) workflows.

Введение

В этом руководстве объясняется, как использовать GitHub Actions для создания контейнерного приложения, его отправки в Реестр контейнеров Google (GCR) и развертывания в Google Kubernetes Engine (GKE) при наличии отправки в ветвь main.

GKE — это управляемая служба кластера Kubernetes от Google Cloud, которая может размещать контейнерные рабочие нагрузки в облаке или в вашем собственном центре обработки данных. Дополнительные сведения см. в статье о Google Kubernetes Engine.

Примечание. Если рабочим процессам GitHub Actions требуется доступ к ресурсам от поставщика облачных служб, поддерживающего OpenID Connect (OIDC), можно настроить рабочие процессы для проверки подлинности непосредственно в поставщике облачных служб. Это позволит прекратить хранение таких учетных данных в виде долгоживущих секретов и обеспечить другие преимущества безопасности. Дополнительные сведения см. в разделе About security hardening with OpenID Connect.

Предварительные требования

Прежде чем приступить к созданию рабочего процесса, необходимо выполнить следующие действия для проекта Kubernetes. В этом руководстве предполагается, что в корневом каталоге проекта уже есть Dockerfile и файл конфигурации развертывания Kubernetes. Пример см. на странице google-github-actions.

Создание кластера GKE

Чтобы создать кластер GKE, сначала потребуется пройти проверку подлинности с помощью CLI gcloud. Дополнительные сведения об этом действии см. в следующих статьях:

Пример.

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

Включение API-интерфейсов

Включите API-интерфейсы Kubernetes Engine Реестра контейнеров. Пример.

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

Настройка учетной записи службы и сохранение ее учетных данных

В этой процедуре показано, как создать учетную запись службы для интеграции GKE. В ней объясняется, как создать учетную запись, добавить в нее роли, получить ключи и сохранить их в виде зашифрованного в кодировке Base64 секрета репозитория с именем GKE_SA_KEY.

  1. Создайте учетную запись службы:

    $ gcloud iam service-accounts create $SA_NAME
    
  2. Получите адрес электронной почты только что созданной учетной записи службы:

    $ gcloud iam service-accounts list
    
  3. Добавьте роли в учетную запись службы. Примечание. Примените более ограничительные роли в соответствии с вашими требованиями.

    $ 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. Скачайте файл ключа JSON для учетной записи службы:

    $ gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
    
  5. Сохраните ключ учетной записи службы в виде секрета с именем GKE_SA_KEY:

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

    Дополнительные сведения о хранении секрета см. в разделе Зашифрованные секреты.

Сохранение имени проекта

Сохраните имя проекта в виде секрета с именем GKE_PROJECT. Дополнительные сведения о хранении секрета см. в разделе Зашифрованные секреты.

(Необязательно) Настройка kustomize

Kustomize — это необязательное средство, используемое для управления спецификациями YAML. После создания файла kustomization приведенный ниже рабочий процесс можно использовать для динамического задания полей образа и канала в результате выполнения команды kubectl. Дополнительные сведения см. в разделе об использовании kustomize.

(Необязательно) Настройка среды развертывания

Среды используются для описания общего целевого объекта развертывания, такого как production, staging или development. Когда рабочий процесс GitHub Actions выполняет развертывание в среде, эта среда отображается на главной странице репозитория. Среды можно использовать для утверждения продолжения задания, ограничения ветвей, которые могут активировать рабочий процесс, или ограничения доступа к секретам. Дополнительные сведения о создании сред см. в разделе Using environments for deployment.

Создание рабочего процесса

Выполнив предварительные требования, можно приступить к созданию рабочего процесса.

В следующем примере рабочего процесса показано, как создать образ контейнера и отправить его в GCR. Затем с помощью средств Kubernetes (например, kubectl и kustomize) образ извлекается в развертывание кластера.

Под ключом env измените значение GKE_CLUSTER на имя кластера, GKE_ZONE на зону кластера, DEPLOYMENT_NAME на имя развертывания и IMAGE на имя образа.

Если вы настроили среду развертывания, измените значение environment на имя среды. Если вы не настроили среду , или если рабочий процесс находится в частном репозитории, и вы не используете GitHub Enterprise Cloud, удалите ключ environment.

YAML
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.

# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.

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@v3

    # 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

Дополнительные ресурсы

Дополнительные сведения о средствах, используемых в этих примерах, см. в следующей документации: