Entwicklung in Cloud Code für Cloud Shell beschleunigen

Um die lokale Entwicklung in Cloud Code für Cloud Shell zu beschleunigen, können Sie die Dateisynchronisierung und das Hot Reloading, die automatische Bereitstellung beim Speichern und die Verwendung von Skaffold-Modulen nutzen, um Teile einer Anwendung separat zu entwickeln.

Skaffold-Dateisynchronisierung und Hot Reload aktivieren

Skaffold unterstützt das Kopieren geänderter Dateien in einen bereitgestellten Container, um die Effizienz des lokalen Entwicklungsworkflows zu verbessern und die Neuerstellung, erneute Bereitstellung und den Neustart von Pods zu vermeiden. Wenn Sie also Änderungen an statischen und Quellcodedateien vornehmen, werden Ihre Änderungen innerhalb von Sekunden angezeigt, wodurch eine beschleunigte Feedback-Schleife entsteht.

Bei statischen Dateien (z. B. HTML- und CSS-Dateien) wird dieses Kopierverhalten als Dateisynchronisierung bezeichnet.

Bei Quellcodedateien wird dieses Verhalten als Hot Reload bezeichnet und unterstützt die folgenden Dateitypen:

  • Go: *.go
  • Java: *.java, *.kt, *.scala, *.groovy, *.clj
  • NodeJS: *.js, *.mjs, *.coffee, *.litcoffee, *.json

Wenn Hot Reload konfiguriert ist, erkennt Skaffold Änderungen an unterstützten Dateien und synchronisiert diese Änderungen mit dem ausgeführten Container in Ihrem Cluster. Änderungen an Dateitypen, die kein Hot Reload unterstützen, lösen eine Image-Neuerstellung und einen Pod-Neustart aus.

Die automatische Dateisynchronisierung und Hot Reload sind standardmäßig aktiviert, wenn Sie mit Buildpacks als Ihrem bevorzugten Builder arbeiten. Für andere Builder wie Docker können Sie in der Datei skaffold.yaml einen sync-Abschnitt für das anzupassende Artefakt angeben.

Folgende Synchronisierungseinstellungen können festgelegt werden (in der Reihenfolge ihrer Präferenz):

  • auto: Skaffold konfiguriert die Synchronisierung automatisch. (nur für Jib- und Buildpacks-Artefakte) Dies ist der Standard für Buildpacks.
  • infer: Die Ziele für jede geänderte Datei werden vom Builder abgeleitet.
  • manual: Sie müssen die Dateien in Ihrem lokalen Arbeitsbereich und ihr Ziel im laufenden Container angeben.

Der folgende Beispielabschnitt sync in einer skaffold.yaml-Datei gibt eine manual-Synchronisierung an, um alle /static-html-HTML-Dateien mit dem static-Ordner in einem Container zu synchronisieren:

build:
  artifacts:
    - image: gcr.io/k8s-skaffold/node-example
      context: node
      sync:
        manual:
          - src: 'static-html/*.html'
            dest: static

Einen detaillierten Blick auf die Dateisynchronisierung und die Angabe von Synchronisierungsregeln finden Sie im Skaffold-Leitfaden zur Dateisynchronisierung.

Neue Funktionen bei der Entwicklung auf Kubernetes hinzufügen

Nachdem Sie die Dateisynchronisierung und Hot Reload eingerichtet haben, starten Sie einen Iterationszyklus und fügen Sie Ihrem Projekt weitere Funktionen hinzu. Ihre Änderungen werden in Ihrem Kubernetes-Cluster bereitgestellt, ohne dass dadurch das Deployment angehalten oder entfernt, das Image manuell erstellt und mit Tags versehen oder der Cluster aktualisiert werden muss.

Ein Standard-Iterationszyklus sieht so aus:

  1. Nehmen Sie eine Änderung in Ihrem Projekt vor. Wenn Sie beispielsweise die Cloud Code-Java-Gästebuch-App verwenden, fügen Sie der Klasse FrontendController einen neuen Endpunkt hinzu:

    1. Öffnen Sie die Datei FrontendController.java aus src/main/java/cloudcode/guestbook/frontend und fügen Sie Folgendes hinzu:

      @RequestMapping("/greeting")
      @ResponseBody
      public String greeting(@RequestParam(value="name", defaultValue="World") String name) {
         return String.format("Hello from Kubernetes with IntelliJ, %s!", name);
      }
      
    2. Fügen Sie die erforderlichen Importe für die neuen Annotationen RequestMapping und ResponseBody hinzu.

  2. Speichern Sie die Änderungen (Ctrl/Cmd+S) oder erstellen Sie das Projekt.

    Im Konsolenfenster können Sie Fortschritts- und Bereitstellungslogs aufrufen. Nachdem die Änderungen bereitgestellt wurden, prüfen Sie die Aktualisierungen.

  3. Klicken Sie zum Beenden der kontinuierlichen Entwicklungssitzung auf das Symbol Beenden.

    Cloud Code löscht alle Kubernetes-Ressourcen, die für die Entwicklungssitzung verwendet wurden.

Mikrodienstanwendungen mit Skaffold-Konfigurationen entwickeln

Bei der Entwicklung von Mikrodienstanwendungen kann es hilfreich sein, unabhängig an einzelnen Abschnitten zu arbeiten, um das Debugging und die Bereitstellung zu vereinfachen.

Sie können Teile Ihrer Anwendung unabhängig voneinander entwickeln und debuggen, indem Sie Ihre Anwendung in Skaffold-Module aufteilen. Die Bank of Anthos-Beispielanwendung enthält beispielsweise zehn Mikrodienste. In der Beispieldatei skaffold.yaml werden diese Dienste in fünf Skaffold-Module mit den Namen setup, db, frontend, backend und loadgenerator gruppiert.

Skaffold-Module und Konfigurationsabhängigkeiten definieren

So definieren Sie Skaffold-Module und Konfigurationsabhängigkeiten:

  1. Öffnen Sie das Projekt, in dem Sie die Module definieren möchten.

  2. Öffnen Sie die Datei skaffold.yaml.

  3. Wenn die Datei skaffold.yaml mehrere Konfigurationen enthält, geben Sie die folgende Zeile an, um eine Konfiguration als Skaffold-Modul zu erstellen:

    metadata:
      name: MODULE_NAME_1
    

    Im skaffold.yaml der Bank of Anthos werden beispielsweise mit dem Modul db Datenbankbereitstellungen definiert:

    apiVersion: skaffold/v3
    kind: Config
    metadata:
      name: db # module defining database deployments
    requires:
    - configs:
      - setup
    build:
      artifacts:
      - image: accounts-db
        context: src/accounts-db
      - image: ledger-db
        context: src/ledger-db
    manifests:
      rawYaml:
      - dev-kubernetes-manifests/accounts-db.yaml
      - dev-kubernetes-manifests/ledger-db.yaml
    deploy:
      kubectl: {}
  4. Für Konfigurationen, die auf einer anderen Konfiguration basieren, bevor die aktuelle Konfiguration bereitgestellt werden kann, müssen Sie die Konfiguration zu Ihren Abhängigkeiten hinzufügen. Wenn Sie eine Konfigurationsabhängigkeit angeben möchten, fügen Sie der Datei skaffold.yaml im Abschnitt requires eine configs-Liste hinzu.

    Die Datei skaffold.yaml der Bank of Anthos enthält beispielsweise die Konfigurationsabhängigkeit setup.

    Fügen Sie der Datei skaffold.yaml Folgendes hinzu, um eine Abhängigkeit zu definieren. Dabei ist DEPENDENCY_NAME der Name der Abhängigkeit.

    requires:
        - configs: DEPENDENCY_NAME
    

    Konfigurationen, die auf diese Weise aufgeführt werden, können auf Abhängigkeiten verweisen, die in derselben Datei oder in anderen skaffold.yaml-Dateien im aktuellen Projekt definiert sind.

  5. Testen Sie Ihre Konfigurationsabhängigkeiten, indem Sie jedes Skaffold-Modul separat erstellen. So können Sie prüfen, ob diese mit ihren Abhängigkeiten bereitgestellt werden. Führen Sie dazu die Schritte unter Bestimmte Skaffold-Module und ihre Abhängigkeiten erstellen aus.

Bestimmte Skaffold-Module und ihre Abhängigkeiten erstellen

Nachdem Sie Ihre Module und deren Abhängigkeiten definiert haben, können Sie in Ihrer launch.json-Datei angeben, welche Module mit Cloud Code ausgeführt werden sollen.

Wenn für Ihr Projekt keine launch.json-Datei definiert ist, werden Sie beim Ausführen von Cloud Code: Auf Kubernetes ausführen oder Cloud Code: Debuggen in Kubernetes aufgefordert, die zu erstellenden Module auszuwählen:

  1. Öffnen Sie die Befehlspalette (Ctrl/Cmd+Shift+P) und führen Sie dann Cloud Code: Auf Kubernetes ausführen aus.
  2. Klicken Sie auf Module auswählen.
  3. Wählen Sie die Module aus, die Sie bereitstellen möchten, und klicken Sie dann auf OK. Jedes Modul wird mit seinen Abhängigkeiten erstellt.
  4. Wenn Sie dazu aufgefordert werden, wählen Sie eine Image-Registry aus und drücken Sie dann Enter.

Wenn Ihr Projekt ein launch.json hat, führen Sie die folgenden Schritte aus, um die zu erstellenden Skaffold-Module auszuwählen:

  1. Öffnen Sie die launch.json-Datei Ihres Projekts.

  2. Bearbeiten Sie die Startkonfiguration, um die Option skaffoldFlags mit einer durch Kommas getrennten Liste von modules hinzuzufügen. Wenn skaffoldFlags weggelassen wird, werden alle Module erstellt.

      {
        "name": "Run on Kubernetes",
        "type": "cloudcode.kubernetes",
        "request": "launch",
        "skaffoldConfig": "${workspaceFolder}/skaffold.yaml",
        "skaffoldFlags": {
           "modules": ["MODULE_NAME_2,MODULE_NAME_2"],
        "watch": true,
        "cleanUp": true,
        }
      }
    
  3. Führen Sie die bearbeitete Startkonfiguration aus.

Kontinuierliche Entwicklung in Kubernetes

Nachdem Sie das Ausführungsziel mit den gewünschten Optionen konfiguriert haben, können Sie die Anwendung entweder regulär ausführen oder einen Entwicklungsdurchlauf in Ihrer IDE starten, um eventuelle Änderungen an der Quelle und Abhängigkeiten in die Live-Anwendung zu übernehmen.

Das Ausführungsziel Run on Kubernetes startet den Entwicklungszyklus für einen Kubernetes-Cluster. Nachdem Sie den Entwicklungszyklus gestartet haben, erstellt Cloud Code mit Skaffold ein Image für das Projekt, fügt es dann hinzu, überträgt es per Push in das konfigurierte Repository und stellt mit kubectl die Kubernetes-Manifeste des Projekts bereit.

  1. Passen Sie die Bereitstellung mit den verfügbaren Konfigurationsoptionen an.
  2. Wenn Ihre Anwendung für die Verwendung von Skaffold-Modulen konfiguriert ist, können Sie bestimmte Module zum Erstellen oder Bereitstellen auswählen.
  3. Öffnen Sie die Befehlspalette (drücken Sie Ctrl/Cmd+Shift + P) und führen Sie dann den Befehl Cloud Code: Auf Kubernetes ausführen aus.
  4. Geben Sie an, ob Sie den aktuellen Kubernetes-Kontext zum Ausführen der Anwendung verwenden oder ob Sie zu einem bevorzugten Kontext wechseln möchten. Weitere Informationen zum Einrichten eines Kubernetes-Kontexts finden Sie unter Konfiguration einrichten.
  5. Wenn Sie einen Remote-Cluster als Kontext ausgewählt haben, werden Sie aufgefordert, eine Image-Registry anzugeben, an die die Images übertragen werden. Wenn in Ihrem Projekt die Artifact Registry API aktiviert ist und mindestens ein Artifact Registry-Repository vorhanden ist, können Sie ein vorhandenes Artifact Registry-Repository auswählen.

    Anschließend erstellt Cloud Code Ihre Container, überträgt sie in die Registry, wendet Kubernetes-Konfigurationen auf den Cluster an und wartet auf den Rollout.

Nächste Schritte