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.

Bereitstellen in der Google Kubernetes Engine

Du kannst Bereitstellungen in Google Kubernetes Engine im Rahmen deiner Continuous-Deployment-Workflows (CD) vornehmen.

Hinweis: GitHub-gehostete Runner werden auf GitHub Enterprise Server derzeit nicht unterstützt. Weitere Informationen zur geplanten zukünftigen Unterstützung findest Du in der GitHub public roadmap.

Einführung

In diesem Leitfaden wird erläutert, wie GitHub Actions verwendet wird, um eine containerisierte Anwendung zu erstellen, sie in Google Container Registry (GCR) zu pushen und sie in Google Kubernetes Engine (GKE) bereitzustellen, wenn ein Push in den main-Branch erfolgt.

GKE ist ein verwalteter Kubernetes-Clusterdienst von Google Cloud, der deine containerisierten Workloads in der Cloud oder in deinem eigenen Rechenzentrum hosten kann. Weitere Informationen findest du unter Google Kubernetes Engine.

Hinweis: Wenn deine GitHub Actions-Workflows auf Ressourcen eines Cloudanbieters zugreifen müssen, der OpenID Connect (OIDC) unterstützt, kannst du deine Workflows so konfigurieren, dass die Authentifizierung direkt beim Cloudanbieter erfolgt. Dadurch musst du diese Anmeldeinformationen nicht mehr als langlebige Geheimnisse speichern und profitierst zudem von weiteren Sicherheitsvorteilen. Weitere Informationen findest du unter Informationen zur Sicherheitshärtung mit OpenID Connect.

Voraussetzungen

Bevor du mit dem Erstellen des Workflows fortfährst, musst du die folgenden Schritte für dein Kubernetes-Projekt ausführen. In diesem Leitfaden wird davon ausgegangen, dass der Stamm deines Projekts bereits über eine Dockerfile-Datei und eine Konfigurationsdatei für die Kubernetes-Bereitstellung verfügt. Ein Beispiel findest du unter google-github-actions.

Erstellen eines GKE-Clusters

Um den GKE-Cluster zu erstellen, musst du dich zuerst mithilfe der gcloud-CLI authentifizieren. Weitere Informationen zu diesem Schritt findest du in den folgenden Artikeln:

Beispiel:

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

Aktivieren der APIs

Aktiviere die Kubernetes Engine- und Container Registry-APIs. Beispiel:

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

Konfigurieren eines Dienstkontos und Speichern seiner Anmeldeinformationen

In diesem Verfahren wird gezeigt, wie du das Dienstkonto für deine GKE-Integration erstellst. Es wird erläutert, wie du das Konto erstellst, ihm Rollen hinzufügst, seine Schlüssel abrufst und sie als base64-codiertes verschlüsseltes Repositorygeheimnis namens GKE_SA_KEY speicherst.

  1. Erstelle ein neues Dienstkonto:

    $ gcloud iam service-accounts create $SA_NAME
    
  2. Rufe die E-Mail-Adresse des soeben erstellten Dienstkontos ab:

    $ gcloud iam service-accounts list
    
  3. Füge dem Dienstkonto Rollen hinzu. Hinweis: Wende restriktivere Rollen an, um deine Anforderungen zu erfüllen.

    $ 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. Lade die JSON-Schlüsseldatei für das Dienstkonto herunter:

    $ gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
    
  5. Speichere den Dienstkontoschlüssel als Geheimnis namens GKE_SA_KEY:

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

    Weitere Informationen zum Speichern eines Geheimnisses findest du unter Verschlüsselte Geheimnisse.

Speichern des Projektnamens

Speichere den Namen deines Projekts als Geheimnis namens GKE_PROJECT. Weitere Informationen zum Speichern eines Geheimnisses findest du unter Verschlüsselte Geheimnisse.

(Optional) Konfigurieren von Kustomize

Kustomize ist ein optionales Tool zum Verwalten von YAML-Spezifikationen. Nach dem Erstellen einer kustomization-Datei kann der folgende Workflow verwendet werden, um dynamisch Felder des Images festzulegen und das Ergebnis an kubectl weiterzuleiten. Weitere Informationen findest du unter Kustomize-Syntax.

(Optional) Konfigurieren einer Bereitstellungsumgebung

Umgebungen werden verwendet, um ein allgemeines Bereitstellungsziel wie production, staging oder development zu beschreiben. Wenn ein GitHub Actions-Workflow in einer Umgebung bereitgestellt wird, wird die Umgebung auf der Hauptseite des Repositorys angezeigt. Du kannst Umgebungen verwenden, um festzulegen, dass für die Fortsetzung eines Auftrags eine Genehmigung erforderlich ist, um einzuschränken, welche Branches einen Workflow auslösen können, oder um den Zugriff auf Geheimnisse zu beschränken. Weitere Informationen zu Umgebungen findest du unter Verwenden von Umgebungen für die Bereitstellung.

Erstellen des Workflows

Nachdem die Voraussetzungen erfüllt sind, kannst du mit dem Erstellen des Workflows fortfahren.

Im folgenden Beispielworkflow wird gezeigt, wie du ein Containerimage erstellst und in GCR pushst. Anschließend werden die Kubernetes-Tools (z. B kubectl und kustomize) verwendet, um das Image in die Clusterbereitstellung zu pullen.

Ändere unter dem env-Schlüssel den Wert von GKE_CLUSTER in den Namen deines Clusters, GKE_ZONE in deine Clusterzone, DEPLOYMENT_NAME in den Namen deiner Bereitstellung und IMAGE in den Namen deines Images.

Wenn du eine Bereitstellungsumgebung konfiguriert hast, ändere den Wert environment in den Namen deiner Umgebung. Wenn du keine Umgebung konfiguriert hast, lösche den environment-Schlüssel.

YAML
# Dieser Workflow verwendet Aktionen, die nicht von GitHub zertifiziert sind.
# Sie werden von einem Drittanbieter bereitgestellt und unterliegen
# separaten Nutzungsbedingungen, Datenschutzbestimmungen und Support
# Onlinedokumentation.

# GitHub empfiehlt, Aktionen an einen Commit-SHA anzuheften.
# Um eine neuere Version zu erhalten, musst du den SHA aktualisieren.
# Du kannst auch auf ein Tag oder einen Branch verweisen, aber die Aktion kann sich ohne Vorwarnung ändern.

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

Zusätzliche Ressourcen

Weitere Informationen zu den in diesen Beispielen verwendeten Tools findest du in der folgenden Dokumentation: