Wdrażanie i uruchamianie kontenera w Cloud Run w Node.js

Cloud Run to zarządzana platforma obliczeniowa, która umożliwia uruchamianie bezstanowych kontenerów wywoływanych przez żądania HTTP. Cloud Run jest bezserwerowe i eliminuje potrzebę zarządzania infrastrukturą, dzięki czemu możesz skupić się na tym, co najważniejsze, czyli tworzeniu świetnych aplikacji. Został on utworzony w systemie Knative, dzięki czemu możesz uruchamiać kontenery w Cloud Run (w pełni zarządzanej) lub Cloud Run dla platformy Anthos. Celem tego ćwiczenia jest utworzenie obrazu kontenera i wdrożenie go w Cloud Run.

Wymagania wstępne

Konfiguracja środowiska we własnym tempie

Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:

Zrzut ekranu z 10 września 2016 r., 12:45:26.png

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID.

Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.

Ćwiczenia z programowania nie powinny kosztować więcej niż kilka dolarów, ale mogą być większe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz to uruchomione (zobacz sekcję „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnej wersji próbnej o wartości 300 USD.

Cloud Shell

Mimo że Google Cloud można uruchomić z laptopa, użyj Cloud Shell – środowiska wiersza poleceń uruchomionego w Google Cloud.

Ta maszyna wirtualna oparta na Debianie jest wyposażona we wszystkie potrzebne narzędzia dla programistów. Oferuje trwały katalog domowy o pojemności 5 GB oraz działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Oznacza to, że do wykonania tych ćwiczeń z programowania wystarczy przeglądarka (tak, to działa na Chromebooku).

Aby aktywować Google Cloud Shell, w konsoli administracyjnej kliknij przycisk w prawym górnym rogu ekranu. Udostępnienie środowiska i połączenie się z nim powinno potrwać kilka minut:

aktywujCloudShell.png

Kliknij przycisk „Rozpocznij” w Cloud Shell:

Zrzut ekranu 2017-06-14 at 22.13.43 PM.png

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelniono już projekt, a w projekcie ustawiono już PROJECT_ID:

gcloud auth list

Polecenie wyjściowe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Polecenie wyjściowe

[core]
project = <PROJECT_ID>

Cloud Shell domyślnie ustawia też niektóre zmienne środowiskowe, co może być przydatne podczas uruchamiania kolejnych poleceń.

echo $GOOGLE_CLOUD_PROJECT

Polecenie wyjściowe

<PROJECT_ID>

Jeśli z jakiegoś powodu projekt nie jest skonfigurowany, uruchom to polecenie :

gcloud config set project <PROJECT_ID>

Szukasz urządzenia PROJECT_ID? Sprawdź identyfikator użyty w procesie konfiguracji lub znajdź go w panelu konsoli:

Identyfikator_projektu.png

WAŻNE: ustaw domyślną strefę i konfigurację projektu:

gcloud config set compute/zone us-central1-f

Możesz wybrać różne strefy. Więcej informacji znajdziesz w dokumentacji regionów i stref.

Włączanie Cloud Run API

W Cloud Shell włącz interfejs Cloud Run API.

gcloud services enable run.googleapis.com

Powinno to spowodować udany komunikat podobny do tego:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

Utworzysz prostą, opartą na wyrażeniach aplikację Node.js, która odpowiada na żądania HTTP.

Aby utworzyć aplikację, utwórz w Cloud Shell nowy katalog o nazwie helloworld-nodejs i zmień w nim katalog.

mkdir helloworld-nodejs
cd helloworld-nodejs

Utwórz plik package.json z tą zawartością:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Co najważniejsze, powyższy plik zawiera polecenie skryptu startowego i zależność od platformy aplikacji internetowych Express.

Następnie utwórz w tym samym katalogu plik index.js i skopiuj do niego tę zawartość:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

Tworzy on podstawowy serwer WWW, który nasłuchuje na porcie określonym przez zmienną środowiskową PORT. Aplikacja jest teraz gotowa do skonteneryzowania, testowania i przesyłania do Container Registry.

Aby skonteneryzować przykładową aplikację, utwórz nowy plik o nazwie Dockerfile w tym samym katalogu co pliki źródłowe i skopiuj do niego tę zawartość:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

Teraz utwórz obraz kontenera za pomocą Cloud Build, uruchamiając następujące polecenie w katalogu zawierającym plik Dockerfile:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT to zmienna środowiskowa zawierająca Twój identyfikator projektu Google Cloud podczas działania w Cloud Shell. Możesz też ją uruchomić, uruchamiając gcloud config get-value project.

Po przekazaniu do rejestru zobaczysz komunikat SUCCESS z nazwą obrazu (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld). Obraz jest przechowywany w Container Registry i w razie potrzeby można go użyć ponownie.

Aby wyświetlić listę obrazów kontenera powiązanych z bieżącym projektem, użyj tego polecenia:

gcloud container images list

Jeśli chcesz uruchomić i przetestować aplikację lokalnie w Cloud Shell, możesz ją uruchomić za pomocą tego standardowego polecenia docker:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

W Cloud Shell kliknij Podgląd w przeglądarce i wybierz Podgląd na porcie 8080.

Otworzy się okno przeglądarki z komunikatem Hello World!.

Możesz też użyć curl localhost:8080.

Aby wdrożyć aplikację w kontenerze w Cloud Run, użyj tego polecenia (pamiętaj, aby dopasować ją do poprawnej nazwy obrazu utworzonej aplikacji lub użyć gotowego obrazu gcr.io/cloudrun/hello):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

Opcja wdrożenia --allow-unauthenticated umożliwia dostęp do aplikacji bez uwierzytelniania. Opcja wdrożenia --platform managed \ oznacza, że wysyłasz żądanie w pełni zarządzanego środowiska (nie infrastruktury Kubernetes przez Anthos).

Zaczekaj chwilę, aż wdrożenie zostanie ukończone. Po wykonaniu tych czynności wiersz polecenia wyświetli adres URL usługi.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

Wdrożony kontener możesz teraz otworzyć, otwierając adres URL usługi w przeglądarce:

Cloud Run automatycznie i poziomo skaluje obraz kontenera w górę, aby obsłużyć odebrane żądania, a następnie skaluje się w dół, gdy zapotrzebowanie spada. Płacisz tylko za wykorzystanie procesora, pamięci i sieci podczas obsługi żądań.

Chociaż usługa Cloud Run nie jest pobierana, gdy usługa nie jest używana, nadal mogą być naliczane opłaty za przechowywanie utworzonego obrazu kontenera.

Możesz usunąć swój projekt Google Cloud, by uniknąć opłat, co spowoduje, że przestaną być naliczane opłaty za wszystkie zasoby używane w tym projekcie, lub usunąć obraz helloworld za pomocą tego polecenia:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

Aby usunąć usługę Cloud Run, użyj tego polecenia:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

Gratulacje! Udało Ci się wdrożyć w Cloud Run aplikację spakowaną w obrazie kontenera.

Więcej informacji

Następnym krokiem jest zapoznanie się z artykułem Quickstart: Deploy to Cloud Run for Anthos on Google Cloud (Szybki start: wdrażanie w Cloud Run dla platformy Anthos w Google Cloud).

Aby dowiedzieć się więcej o tworzeniu bezstanowego kontenera HTTP odpowiedniego dla Cloud Run ze źródła kodu i przekazywaniu go do Container Registry, zapoznaj się z tymi zasobami:

Aby dowiedzieć się więcej o aplikacji Knative, głównym projekcie open source, zobacz Knative.