Wdrażanie i uruchamianie kontenera za pomocą Cloud Run w środowisku Node.js

1. Zanim zaczniesz

6a5cf23c8e20491f.png

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

Wymagania wstępne

Nie dotyczy

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa jest już zajęta i nie będzie Ci odpowiadać). W dalszej części tego ćwiczenia w programie będzie ona określana jako PROJECT_ID.

  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.

Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” W tym samouczku znajdziesz wskazówki, jak wyłączyć zasoby, aby uniknąć naliczania opłat. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Cloud Shell

Google Cloud można sterować zdalnie z laptopa, ale korzystasz z Cloud Shell – środowiska wiersza poleceń działającego w Google Cloud.

Ta maszyna wirtualna oparta na Debianie zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Oznacza to, że do tego ćwiczenia z programowania wystarczy przeglądarka (tak, działa ona na Chromebooku).

  1. Aby aktywować Cloud Shell z poziomu konsoli Cloud, kliknij Aktywuj Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (udostępnienie środowiska i połączenie z nim powinno zająć tylko chwilę).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Zrzut ekranu 2017-06-14 o 10.13.43 PM.png

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest już uwierzytelniony, a projekt jest już ustawiony na PROJECT_ID.

gcloud auth list

Dane wyjściowe polecenia

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

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Szukasz urządzenia PROJECT_ID? Sprawdź identyfikator użyty w krokach konfiguracji lub wyszukaj go w panelu Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell ustawia też domyślnie niektóre zmienne środowiskowe, które mogą być przydatne podczas uruchamiania kolejnych poleceń.

echo $GOOGLE_CLOUD_PROJECT

Dane wyjściowe polecenia

<PROJECT_ID>
  1. Na koniec 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 artykule Regiony i Strefy.

Włączanie interfejsu Cloud Run API

W Cloud Shell włącz Cloud Run API.

gcloud services enable run.googleapis.com

Powinien wyświetlić się komunikat podobny do tego:

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

3. Tworzenie przykładowej aplikacji

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

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

mkdir helloworld-nodejs
cd helloworld-nodejs

Utwórz plik package.json o takiej 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 internetowej usługi Express.

Następnie w tym samym katalogu utwórz 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);
});

Ten kod tworzy podstawowy serwer WWW, który nasłuchuje na porcie określonym przez zmienną środowiskową PORT. Możesz teraz skonteneryzować, przetestować swoją aplikację i przesłać ją do Container Registry.

4. Konteneryzowanie aplikacji i przesyłanie jej do Container Registry

Aby skonteneryzować przykładową aplikację, utwórz nowy plik o nazwie Dockerfile w tym samym katalogu, w którym znajdują się 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 to 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 identyfikator projektu Google Cloud uruchomiony w Cloud Shell. Możesz też go uzyskać, uruchamiając gcloud config get-value project.

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

Aby wyświetlić wszystkie obrazy kontenerów powiązane 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 to zrobić przy użyciu tego standardowego polecenia docker:

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

W Cloud Shell kliknij Podgląd w przeglądarce170b7a95be8c6296.png i wybierz Podejrzyj na porcie 8080.

3618ca3a4a135570.png

Otworzy się okno przeglądarki z napisem Hello World!

a0307f34cacf9e6a.png

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

5. Wdrożenie w Cloud Run

Skonteneryzowaną aplikację możesz wdrożyć w Cloud Run przy użyciu tego polecenia (pamiętaj, by dostosować je do nazwy obrazu odpowiednio do skompilowanej 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 wdrażania --allow-unauthenticated umożliwia dostęp do aplikacji bez uwierzytelniania. Opcja wdrażania --platform managed \ oznacza, że żądanie dotyczy w pełni zarządzanego środowiska (a nie infrastruktury Kubernetes za pomocą platformy Anthos).

Poczekaj chwilę na zakończenie wdrażania. Po zakończeniu w wierszu poleceń wyświetli się URL usługi.

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

Możesz teraz wyświetlić wdrożony kontener, otwierając URL usługi w przeglądarce:

63260b4d3aee42b8.png

Cloud Run automatycznie skaluje obraz kontenera w górę, aby obsługiwać otrzymane żądania, a następnie skaluje w dół, gdy zapotrzebowanie maleje. Płacisz tylko za procesor, pamięć i sieć wykorzystywane podczas obsługi żądań.

6. Czyszczenie danych

Cloud Run nie nalicza opłat, gdy usługa nie jest używana, ale może zostać pobrana opłata za przechowywanie utworzonego obrazu kontenera.

Możesz usunąć projekt Google Cloud, co spowoduje zatrzymanie naliczania opłat za wszystkie zasoby wykorzystywane w ramach tego projektu, lub po prostu usunąć obraz helloworld przy użyciu tego polecenia:

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

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

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

7. Gratulacje

Gratulacje! Wdrożyłeś(-aś) w Cloud Run aplikację spakowaną do obrazu kontenera.

Więcej informacji

Warto zapoznać się z krótkim wprowadzeniem: wdrażanie do Cloud Run for Anthos w Google Cloud (w języku angielskim).

Więcej informacji o tworzeniu na podstawie kodu bezstanowego kontenera HTTP, który będzie odpowiedni do zastosowania w Cloud Run, i przekazywaniu go do Container Registry znajdziesz w tych materiałach:

Aby dowiedzieć się więcej o Knative, podstawowym projekcie open source, przeczytaj Knative.