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 jest rozwiązaniem bezserwerowym, które nie wymaga zarządzania infrastrukturą, dzięki czemu możesz skupić się na tym, co najważniejsze, czyli tworzeniu świetnych aplikacji. Usługa ta jest oparta na platformie Knative, co pozwala uruchamiać kontenery w Cloud Run (usługa w pełni zarządzana) lub w Cloud Run for Anthos. Celem tego laboratorium 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 użyj istniejącego. (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, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego laboratorium będzie on nazywany PROJECT_ID.

  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów Google Cloud.

Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Wykonaj instrukcje z sekcji „Czyszczenie”, w której znajdziesz informacje o tym, jak wyłączyć zasoby, aby uniknąć naliczenia opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Cloud Shell

Z Google Cloud możesz korzystać zdalnie na laptopie, ale w tym module będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud.

Ta maszyna wirtualna oparta na Debianie zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Oznacza to, że do ukończenia tego ćwiczenia potrzebujesz tylko przeglądarki (działa ona na Chromebooku).

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

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu PROJECT_ID.

gcloud auth list

Wynik polecenia

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

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli z jakiegoś powodu projekt nie jest ustawiony, po prostu wydaj to polecenie:

gcloud config set project <PROJECT_ID>

Szukasz urządzenia PROJECT_ID? Sprawdź, jakiego identyfikatora użyto w krokach konfiguracji, lub wyszukaj go w panelu konsoli Cloud:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

Wynik 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łącz Cloud Run API

W Cloud Shell włącz Cloud Run API.

gcloud services enable run.googleapis.com

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

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

3. Tworzenie przykładowej aplikacji

Utworzysz prostą aplikację Node.js na platformie Express, odpowiadającą na żądania HTTP.

Aby skompilować aplikację, użyj Cloud Shell do utworzenia nowego katalogu o nazwie helloworld-nodejs i przejdź do niego.

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, ten plik zawiera polecenie skryptu startowego i zależność od platformy Express umożliwiającej tworzenie aplikacji internetowych.

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

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. Aplikacja jest gotowa do skonteneryzowania, przetestowania i przesłania do Container Registry.

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

Żeby 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ę treść:

# 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 przy pomocy Cloud Build, uruchamiając podane poniżej polecenie z katalogu zawierającego Dockerfile:

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

$GOOGLE_CLOUD_PROJECT to zmienna środowiskowa zawierająca identyfikator Twojego projektu Google Cloud podczas uruchamiania w Cloud Shell. Możesz też uzyskać go, uruchamiając polecenie gcloud config get-value project.

Gdy kontener zostanie wypchnięty do rejestru, wyświetli się 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.

Użyj tego polecenia, aby sporządzić listę wszystkich obrazów kontenerów związanych z bieżącym projektem:

gcloud container images list

Jeśli chcesz uruchomić i przetestować aplikację lokalnie w Cloud Shell, możesz to zrobić 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ądarce170b7a95be8c6296.png i wybierz Podejrzyj na porcie 8080.

3618ca3a4a135570.png

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

a0307f34cacf9e6a.png

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

5. Wdrożenie w Cloud Run

Skonteneryzowaną aplikację możesz wdrożyć w Cloud Run przy pomocy tego polecenia (dostosuj je do prawidłowej nazwy obrazu aplikacji, którą utworzono, lub użyj 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 --allow-unauthenticated wdrożenia umożliwia dostęp do aplikacji bez uwierzytelniania. Opcja wdrożenia --platform managed \ oznacza, że prosisz o środowisko w pełni zarządzane (a nie infrastrukturę Kubernetes za pomocą Anthos).

Poczekaj chwilę na zakończenie wdrażania. Po zakończeniu operacji 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 zobaczyć wdrożony kontener, otwierając URL usługi w przeglądarce:

63260b4d3aee42b8.png

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

6. Czyszczenie danych

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

Możesz usunąć projekt Google Cloud, co spowoduje zaprzestanie naliczania opłat za wszelkie zasoby wykorzystywane w ramach tego projektu, albo usunąć tylko obraz helloworld przy użyciu 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

7. Gratulacje

Gratulacje! Wdrożono w Cloud Run aplikację spakowaną do obrazu kontenera.

Więcej informacji

Dobrym kolejnym krokiem będzie zapoznanie się z tym krótkim wprowadzeniem: Wdrażanie w Cloud Run for Anthos w Google Cloud.

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 (w języku angielskim):

Więcej informacji o Knative, projekcie open source, na którym opiera się ta usługa, znajdziesz w artykule Knative.