GKE-Kosten am Anfang des Entwicklungszyklus mit GitHub schätzen

Last reviewed 2022-12-15 UTC

In dieser Anleitung wird gezeigt, wie Sie die Kostensichtbarkeit von Google Kubernetes Engine (GKE) nach links zu Ihrem Entwicklungsteam verschieben. Diese Praxis der Linksverschiebung generiert früh während des Prozesses ein Bewusstsein für Kosten und hilft Ihnen, unerwartete Kosten in Ihrer Google Cloud-Rechnung zu vermeiden.

Diese Anleitung richtet sich an Entwickler, Operatoren und FinOps-Experten, die Kosten in GKE-Clustern optimieren möchten und GitHub in der Produktion verwenden. Wenn Sie stattdessen GitLab verwenden, lesen Sie die Informationen unter GKE-Kosten am Anfang des Entwicklungszyklus mit GitLab schätzen.

In dieser Anleitung wird davon ausgegangen, dass Sie mit Docker, GitHub, Kubernetes, GKE, Cloud Build und Linux vertraut sind.

Übersicht

Viele Teams, die die öffentliche Cloud nutzen, sind nicht an den "Pay as you go"-Abrechnungsstil gewöhnt. Häufig verstehen sie nicht vollständig, in welcher Umgebung ihre Anwendungen ausgeführt werden, in diesem Fall GKE. Mit dem FinOps-Betriebsmodell wird diese Kultur der finanziellen Rechenschaftspflicht gefördert. Eine FinOps-Best-Practice besteht darin, Teams Echtzeitinformationen über ihre Ausgaben bereitzustellen, damit Kostenprobleme so schnell wie möglich behoben werden können.

In diesem Dokument erfahren Sie, wie Sie noch einen Schritt weiter gehen und Kosten schätzen, bevor sie zu einer Ausgabe in der Abrechnung werden. Wie auf der GitHub-Website erläutert: "Auf GitHub sind in jede Pull-Anfrage einfache Code-Review-Tools integriert." So können Sie "Projekte weiterentwickeln, neue Features vorschlagen und Implementierungsdetails besprechen, bevor Sie den Quellcode ändern". Die beste Zeit für eine Kostenschätzung ist früh während des Entwicklungsprozesses und des Code Review. Auf diese Weise können Fachkräfte Alternativen zu den Kostenauswirkungen neuer Features und Fehlerkorrekturen verstehen und besprechen, bevor sie zu einem Problem werden. Im folgenden Diagramm wird eine solche Vorgehensweise zusammengefasst.

Best Practice zur frühzeitigen Kostenschätzung.

Wie das Diagramm zeigt, schätzt ein Entwickler die GKE-Kosten in seiner lokalen Umgebung, idealerweise bei der Erstellung. Mit dieser Schätzung erhält er ein Verständnis der monatlichen Kosten für die Produktionsarbeitslast. Wenn das Feature oder die Fehlerkorrektur abgeschlossen ist, schlägt der Dienst eine Pull-Anfrage vor, die Cloud Build zur Prüfung der Differenz zwischen den alten und neuen Kosten veranlasst. Bei Erhöhungen über einen vordefinierten Schwellenwert kann er einen neuen Code Review anfordern. Mit dieser Vorgehensweise können Entwickler sich ihrer Arbeitslastkapazität bewusster werden und Anwendungsprobleme proaktiv beheben, anstatt jedes Mal weitere Ressourcen hinzuzufügen, wenn eine Instabilität in der Produktion festgestellt wird.

Ziele

  • Erstellen Sie das Kubernetes-Image für die Kostenschätzung und übertragen Sie es per Push.
  • Erstellen Sie ein GitHub-Repository.
  • Verbinden Sie Cloud Build mit dem GitHub-Repository.
  • Übertragen Sie den Beispielcode per Push in Ihr GitHub-Repository.
  • Ändern Sie den Code und schlagen Sie eine Pull-Anfrage vor, um die Kostenschätzung in Aktion zu sehen.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  1. Rufen Sie in der Google Cloud Console die Seite für die Projektauswahl auf.

    Zur Projektauswahl

  2. Wählen Sie ein Google Cloud-Projekt aus oder erstellen Sie eines.

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

    Unten in der Google Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI bereits installiert ist und Werte für Ihr aktuelles Projekt bereits festgelegt sind. Das Initialisieren der Sitzung kann einige Sekunden dauern.

Umgebung vorbereiten

  1. Klonen Sie in Cloud Shell das GitHub-Repository gke-shift-left-cost.

    git clone https://github.com/GoogleCloudPlatform/gke-shift-left-cost
    cd gke-shift-left-cost
    

    Der Code in diesem Repository ist in folgende Ordner strukturiert:

    • Root: Enthält eine Dockerfile-Datei, die zum Erstellen des Kostenschätzungs-Images verwendet wird, und die Datei main.go, die die Befehlszeilenlogik für das Schätzungstool implementiert.
    • api/: Enthält die Golang API zum Bearbeiten von Kubernetes-Objekten und zum Durchführen der Kostenschätzung.
    • samples/: Enthält Beispiele von Kubernetes-Manifesten, damit Sie mit dem Prozess experimentieren können, bevor Sie ihn in Ihrer Organisation implementieren.
  2. Legen Sie Ihre Google Cloud-Projekt-ID, Ihren GitHub-Nutzer und Ihre E-Mail-Adresse sowie einen weiteren GitHub-Nutzer fest, der als FinOps-Prüfer fungieren soll:

    export GCP_PROJECT_ID=YOUR_PROJECT_ID
    export GITHUB_USER=YOUR_GITHUB_USER
    export GITHUB_EMAIL=YOUR_GITHUB_EMAIL_ADDRESS
    export GITHUB_FINOPS_REVIEWER_USER=ANOTHER_GITHUB_USER
    

    Dabei gilt:

    • YOUR_PROJECT_ID: die Google Cloud-Projekt-ID des Projekts, das Sie in dieser Anleitung verwenden.
    • YOUR_GITHUB_USER: der Nutzer, mit dem Sie sich in Ihrem GitHub-Konto anmelden.
    • YOUR_GITHUB_EMAIL_ADDRESS: die E-Mail-Adresse, die Sie in Ihrem GitHub-Konto verwenden.
    • ANOTHER_GITHUB_USER: ein anderer GitHub-Nutzer, der als FinOps-Prüfer fungieren soll. Beachten Sie, dass Sie für diese Anleitung diesen Nutzer als Repository-Mitbearbeiter hinzufügen müssen und es daher nicht selbst sein können. Achten Sie darauf, dass der Nutzer Ihre Einladung nach dem Erstellen der Einladung annimmt, damit die Anleitung nicht unterbrochen wird.
  3. Legen Sie das Google Cloud-Projekt fest und aktivieren Sie die erforderlichen APIs:

    gcloud config set project $GCP_PROJECT_ID
    
    gcloud services enable cloudbilling.googleapis.com \
        artifactregistry.googleapis.com \
        cloudbuild.googleapis.com
    

Erstellen Sie das Kubernetes-Image für die Kostenschätzung und übertragen Sie es per Push.

Das in dieser Anleitung enthaltene Tool zur Kostenschätzung von Kubernetes ist nur ein Beispiel dafür, was möglich ist. Er bietet die Möglichkeit, die Kosten für Kubernetes-Objekte vom Typ DaemonSet, Deployment, StatefulSet, ReplicaSet, HorizontalPodAutoScaler und PersistentVolumeClaim zu schätzen. Sie können auch ein eigenes Tool zur Kostenschätzung implementieren oder Pull-Anfragen mit den gewünschten Verbesserungen vorschlagen.

  1. Erlauben Sie in Cloud Shell application-default die Verwendung Ihrer Anmeldedaten:

    gcloud auth application-default login
    
  2. Erstellen Sie das Kubernetes-Binärprogramm für die Kostenschätzung:

    mkdir ./bin
    go test ./api
    go build -v -o ./bin/k8s-cost-estimator .
    
  3. Testen Sie das Binärprogramm, indem Sie in einem Beispielordner die Kostenschätzung ausführen:

    ./bin/k8s-cost-estimator \
        --k8s ./samples/k8s-cost-estimator-local/app-v1  \
        --config ./samples/k8s-cost-estimator-local/example-conf.yaml --v trace
    

    In der Ausgabe wird eine Markdown-Tabelle mit den geschätzten monatlichen Kosten für den Ordner ./samples/k8s-cost-estimator-local/app-v1/ angezeigt. Um die monatlichen Produktionskosten ihrer Anwendungen besser zu verstehen, können Entwickler diesen Schritt ausführen, bevor sie eine Push-Übertragung zum Remote-Repository durchführen.

    INFO[0000] Starting cost estimation (version v0.0.1)...
    ...
    
    |         KIND          | MIN REQUESTED (USD) | MIN REQ + HPA CPU BUFFER (USD) | MAX REQUESTED (USD) | MIN LIMITED (USD) | MAX LIMITED (USD) |
    |-----------------------|---------------------|--------------------------------|---------------------|-------------------|-------------------|
    | Deployment            |             $133.31 |                        $198.71 |             $266.54 |           $312.83 |           $579.29 |
    | StatefulSet           |              $36.33 |                         $36.33 |              $36.33 |            $72.67 |            $72.67 |
    | DaemonSet             |              $29.68 |                         $29.68 |              $29.68 |            $53.19 |            $53.19 |
    | PersistentVolumeClaim |              $28.88 |                         $28.88 |              $28.88 |            $33.68 |            $33.68 |
    | **TOTAL**             |         **$228.20** |                    **$293.60** |         **$361.43** |       **$472.38** |       **$738.83** |
    
    INFO[0002] Finished cost estimation!
    
  4. Erstellen Sie das Kubernetes-Container-Image für die Kostenschätzung:

    docker build . -t us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    
  5. Erstellen Sie das Artifact Registry-Docker-Repository zum Speichern des Images:

    gcloud artifacts repositories create docker-repo \
            --repository-format=docker \
            --location=us-central1 \
            --description="Docker repository"
    
  6. Registrieren Sie gcloud als Credential Helper für die Konfigurationsdatei von Docker. Wenn Sie dazu aufgefordert werden, bestätigen Sie die Dateiaktualisierung.

    gcloud auth configure-docker us-central1-docker.pkg.dev
    
  7. Übertragen Sie das Image per Push in Artifact Registry:

    docker push us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    

Neues GitHub-Repository erstellen

  1. Wechseln Sie in Cloud Shell die Verzeichnisse wie im GitHub-Beispiel:

    cd samples/k8s-cost-estimator-github
    
  2. Erstellen Sie in GitHub ein Zugriffstoken:

    Zur GitHub-Seite mit persönlichen Zugriffstokens

    1. Geben Sie im Feld Hinweis eine Tokenbeschreibung ein.
    2. Klicken Sie unter Bereiche auswählen auf die Kästchen repo, admin:public_key und delete_repo.
    3. Klicken Sie auf Token generieren und kopieren Sie den Wert für Ihr neues persönliches Zugriffstoken oben auf der Seite.
  3. Speichern Sie Ihr persönliches Zugriffstoken in Cloud Shell in einer Variablen.

    GITHUB_TOKEN=YOUR_NEW_PERSONAL_ACCESS_TOKEN
    

    Dabei gilt:

    • YOUR_NEW_PERSONAL_ACCESS_TOKEN: das persönliche Zugriffstoken, das Sie gerade erstellt haben.
  4. Erstellen Sie ein GitHub-Repository:

    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/repos \
      -d '{"name":"k8s-cost-estimator-github"}' | jq
    

    Die Ausgabe sieht etwa so aus:

    {
      "id": 36099474,
      "node_id": "MDEwOldfsdjA5OTQ3Njc=",
      "name": "k8s-cost-estimator-github",
      ...
    }
    
  5. Fügen Sie den FinOps-Prüfer als Mitbearbeiter in Ihrem Repository hinzu:

    curl -X PUT \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github/collaborators/$GITHUB_FINOPS_REVIEWER_USER  | jq -r .html_url
    

    Die Ausgabe sieht etwa so aus:

    https://github.com/your-user/k8s-cost-estimator-github/invitations
    
  6. Geben Sie die Ausgabe-URL für den Nutzer frei, den Sie in der Variable GITHUB_FINOPS_REVIEWER_USER festgelegt haben, damit er die Einladung annehmen kann. Bevor Sie mit dem nächsten Schritt fortfahren, rufen Sie dieselbe URL auf, um sicherzustellen, dass die Einladung akzeptiert wurde.

    Überprüfen, ob die Einladung angenommen wurde.

Verbinden Sie Cloud Build mit dem GitHub-Repository.

In diesem Abschnitt erfahren Sie, wie Sie die Cloud Build-GitHub-Anwendung installieren. Mit dieser Installation können Sie Ihr GitHub-Repository mit Ihrem Google Cloud-Projekt verbinden, sodass Cloud Build automatisch das Kubernetes-Schätzungstool bei jeder Pull-Anfrage ausführt.

  1. Rufen Sie die GitHub Marketplace-Seite für die Cloud Build-Anwendung auf:

    Cloud Build öffnen

  2. Richten Sie den GitHub-Kontozugriff für die Anwendung ein:

    1. Wenn Sie zum ersten Mal eine Anwendung in GitHub konfigurieren, klicken Sie unten auf der Seite auf Mit Google Cloud Build einrichten und dann auf Dieser Anwendung Zugriff auf GitHub-Konto gewähren.
    2. Wenn Sie bereits eine Anwendung in GitHub eingerichtet haben, klicken Sie auf Zugriff konfigurieren.
  3. Die Seite Anwendungen wird geöffnet. Führen Sie folgende Schritte aus:

    1. Klicken Sie in der Zeile für Google Cloud Build auf Konfigurieren.
    2. Wählen Sie die Option Nur Repositories auswählen aus.
    3. Wählen Sie k8s-cost-estimator-github aus, um eine Verbindung zum soeben erstellten Repository herzustellen.
    4. Klicken Sie auf Speichern oder Installieren (das Schaltflächenlabel ändert sich je nach ausgeführtem Ablauf).
  4. Sie werden jetzt zu Google Cloud weitergeleitet, um die Installation fortzusetzen. Melden Sie sich mit Ihrem Google Cloud-Konto an. Autorisieren Sie die Cloud Build-Integration in GitHub, wenn Sie dazu aufgefordert werden.

  5. Wählen Sie auf der Seite Cloud Build Ihr Projekt aus. Ein Assistent wird angezeigt.

  6. Wählen Sie im Bereich Repository auswählen des Assistenten Ihr GitHub-Konto und das Repository k8s-cost-estimator-github aus.

  7. Wenn Sie mit den Nutzungsbedingungen einverstanden sind, klicken Sie das Kästchen an und klicken Sie dann auf Verbinden.

  8. Klicken Sie im Abschnitt Trigger erstellen auf Trigger erstellen und führen Sie die folgenden Schritte aus:

    1. Geben Sie einen Triggernamen ein.
    2. Wählen Sie im Abschnitt Ereignis die Option Pull-Anfrage (nur GitHub-App) aus.
    3. Im Abschnitt Quelle:
      • Das Feld Repository ist automatisch mit your-github-user/k8s-cost-estimator-github (GitHub-App) gefüllt.
      • Wählen Sie im Drop-down-Menü Basis-Branch die Option .* aus.
    4. Wählen Sie im Abschnitt Konfigurationstyp die Option Cloud Build-Konfigurationsdatei (YAML oder JSON) aus.
    5. Fügen Sie im Bereich Erweitert die folgenden Substitutionsvariablen ein:

      • _GITHUB_TOKEN = YOUR_PERSONAL_ACCESS_TOKEN
      • _GITHUB_FINOPS_REVIEWER_USER = THE_GITHUB_FINOPS_REVIEWER_USER
      • _GITHUB_FINOPS_COST_USD_THRESHOLD = 10

      Dabei gilt:

      • YOUR_PERSONAL_ACCESS_TOKEN: das persönliche GitHub-Zugriffstoken, das Sie erstellt haben. Dieses Token ist in der Variable GITHUB_TOKEN in Cloud Shell verfügbar.
      • THE_GITHUB_FINOPS_REVIEWER_USER: der Nutzer, den Sie als Mitbearbeiter in Ihrem GitHub-Repository eingeladen haben. Dieser Nutzername ist in der Cloud Shell-Variable GITHUB_FINOPS_REVIEWER_USER verfügbar.
  9. Klicken Sie auf Erstellen.

Die GitHub-Anwendung "Cloud Build" ist jetzt konfiguriert und Ihr GitHub-Repository ist mit Ihrem Google Cloud-Projekt verknüpft. Pull-Anfragen an Ihr GitHub-Repository lösen jetzt Cloud Build-Ausführungen aus, die die Ergebnisse mithilfe von GitHub-Prüfungen an GitHub zurückmelden.

Übertragen Sie den Beispielcode per Push in Ihr GitHub-Repository.

  1. Erstellen Sie ein SSH-Schlüsselpaar, damit Sie den Beispielcode per Push in Ihr GitHub-Repository übertragen können:

    mkdir -p ssh && cd ssh
    ssh-keygen -t rsa -b 4096 -N '' -f github-key
    eval `ssh-agent` && ssh-add $(pwd)/github-key
    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/keys \
      -d "{\"title\":\"k8s-cost-estimator-key\", \"key\":\"$(cat github-key.pub)\"}" | jq
    cd ..
    

    Die Ausgabe sieht etwa so aus:

    {
      "id": 52356205,
      "key": "ssh-rsa AAAAB3NzaC….wJICyt0yvWjGFZGCWBPUw==",
      "url": "https://api.github.com/user/keys/526205",
      "title": "k8s-cost-estimator-key",
      "verified": true,
      "created_at": "2021-04-23T16:22:58Z",
      "read_only": false
    }
    
  2. Übertragen Sie den Inhalt per Push in Ihr neues GitHub-Repository:

    sed "s/GCP_PROJECT_ID/$GCP_PROJECT_ID/g; s/GITHUB_USER/$GITHUB_USER/g; s/GITHUB_EMAIL/$GITHUB_EMAIL/g;" templates/cloudbuild.yaml.tpl > cloudbuild.yaml
    
    GITHUB_SSH_URL_REPO=$(curl -X GET \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github | jq -r .ssh_url)
    [ -z "$GITHUB_SSH_URL_REPO" ] && echo "GITHUB_SSH_URL_REPO is not exported" || echo "GITHUB_SSH_URL_REPO is $GITHUB_SSH_URL_REPO"
    
    git init
    git remote add origin $GITHUB_SSH_URL_REPO
    git add -A .
    git commit -m "Initial commit"
    git checkout -b main
    git push -u origin main
    

Code ändern und Pull-Anfrage erstellen, um die Kostenschätzung zu testen

  1. Rufen Sie in Cloud Shell die GitHub-URL zur Datei wordpress/wordpress_hpa.yaml ab:

    echo "https://github.com/$GITHUB_USER/k8s-cost-estimator-github/edit/main/wordpress/wordpress_hpa.yaml"
    
  2. Verwenden Sie Strg + Klick (Cmd + Klick für Mac-Nutzer) für die Ausgabe-URL, um GitHub aufzurufen und die Datei wordpress/wordpress_hpa.yaml zu bearbeiten.

  3. Ändern Sie in GitHub minReplicas zu 5.

  4. Wählen Sie Neuen Branch für diesen Commit erstellen und Pull-Anfrage starten aus und klicken Sie dann auf Änderungen vorschlagen.

  5. Klicken Sie im Bildschirm Pull-Anfrage öffnen auf Pull-Anfrage erstellen.

    Neben dem Erstellen einer neuen Pull-Anfrage löst dieser Schritt eine Cloud Build-Ausführung auf Basis der zuvor erstellten Datei cloudbuild.yaml aus. Diese Cloud Build-Ausführung verwendet das Container-Image, das Sie in Kubernetes-Kostenschätzungs-Image erstellen und per Push übertragen erstellt haben, und trifft die Entscheidung, wann ein FinOps-Prüfer erforderlich ist.

  6. Warten Sie etwa eine Minute, bis die Pipeline abgeschlossen ist. Nach Abschluss des Vorgangs wird in der Pull-Anfrage ein Kommentar mit Kostendetails hinzugefügt. Da die Kostenerhöhung für den Code den Grenzwert von 10 $ überschritten hat, wird auch ein FinOps-Prüfer angefordert.

    Die Ausgabe sieht etwa so aus:

    Der Pull-Anfrage wird eine detaillierte Aufschlüsselung der Kosten hinzugefügt.

Jetzt wissen Sie, wie Sie Ihren Entwicklern zu Beginn des Entwicklungszyklus einen Einblick in ihre Ausgaben geben können. Diese Konfiguration hilft Ihnen und Ihrer Organisation, Überraschungen auf Ihrer Google Cloud-Rechnung zu vermeiden.

Bereinigen

Um zu vermeiden, dass Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden, können Sie Ihr Projekt löschen.

Projekt löschen

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

GitHub-Repository löschen

Wenn Sie Ihr GitHub-Repository nicht behalten möchten, gehen Sie so vor:

  1. Löschen Sie in Cloud Shell Ihr GitHub-Repository:

    curl -X DELETE \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github
    

    Wenn die Verbindung zu Cloud Shell getrennt wird, müssen Sie die Variablen GITHUB_TOKEN und GITHUB_USER zurücksetzen.

Nächste Schritte