Wdrażanie witryny w Cloud Run

Utrzymanie działających witryn może być trudnym zadaniem ze względu na koszt związany z tworzeniem instancji maszyn wirtualnych, klastrów, podów i usług oraz zarządzaniem nimi. Jest to uzasadnione w przypadku dużych, wielowarstwowych aplikacji, ale dla kogoś, kto chce po prostu wdrożyć witrynę i udostępnić ją w internecie, wydaje się zbyt dużym obciążeniem.

Dzięki Cloud Run, implementacji platformy Knative w Google Cloud, możesz wdrażać witrynę i zarządzać nią bez wysiłku związanego z utrzymaniem infrastruktury, który jest potrzebny w przypadku wdrożeń opartych na maszynach wirtualnych lub Kubernetes. Takie podejście jest prostsze nie tylko z perspektywy zarządzania. Umożliwia ono również skalowanie do zera w przypadku braku żądań przychodzących do witryny.

Cloud Run nie tylko umożliwia bezserwerowe programowanie w kontenerach, ale też może działać we własnych klastrach Google Kubernetes Engine (GKE) lub we w pełni zarządzanym rozwiązaniu PaaS udostępnianym przez Cloud Run. W tym ćwiczeniu przetestujesz ten drugi scenariusz.

Na diagramie poniżej przedstawiono przepływ wdrażania i hostingu w Cloud Run. Najpierw w Cloud Build jest tworzony obraz Dockera, który jest aktywowany przy użyciu Cloud Shell. Następnie wdrażasz ten obraz w Cloud Run za pomocą polecenia w Cloud Shell.

Wymagania wstępne

Czego się nauczysz

  • Jak utworzyć obraz Dockera za pomocą Cloud Build i przesłać go do gcr.io
  • Jak wdrożyć obrazy Dockera w Cloud Run
  • Jak zarządzać wdrożeniami w Cloud Run
  • Jak skonfigurować punkt końcowy dla aplikacji w Cloud Run

Co utworzysz

  • witryna statyczna działająca w kontenerze Dockera;
  • Wersja tego kontenera, która znajduje się w Container Registry.
  • wdrożenie Cloud Run dla Twojej witryny statycznej;

Czego potrzebujesz

  • Konto Google z dostępem administracyjnym do tworzenia projektów lub projekt z rolą właściciela projektu

Samodzielne konfigurowanie środowiska

Jeśli nie masz jeszcze konta Google, musisz je utworzyć. Następnie zaloguj się w konsoli Google Cloud i kliknij Projekt > Utwórz projekt.

Zapamiętaj identyfikator projektu, który jest automatycznie wypełniany pod nazwą projektu. Identyfikator projektu to unikalna nazwa we wszystkich projektach Google Cloud, więc nazwa na zrzucie ekranu jest już zajęta i nie będzie działać w Twoim przypadku. Będzie on dalej występować jako PROJECT_ID.

Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów Google Cloud i włączyć interfejs Cloud Run API.

Włączanie interfejsu Cloud Run API

Kliknij Menu nawigacyjne ☰ > Interfejsy API i usługi > Panel informacyjny > Włącz interfejsy API i usługi. .

Wyszukaj „Cloud Run API”, a następnie kliknij Cloud Run API > Włącz.

Wykonanie tego laboratorium nie powinno kosztować więcej niż kilka dolarów, ale może okazać się droższe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz je uruchomione (patrz sekcja Czyszczenie na końcu). Więcej informacji znajdziesz w cenniku.

Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Cloud Shell

Z Google Cloud i Cloud Run możesz korzystać zdalnie na laptopie, ale w tym module użyjesz Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud. Środowisko jest wstępnie skonfigurowane ze wszystkimi potrzebnymi bibliotekami klienta i platformami.

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 uwierzytelniania. Oznacza to, że do ukończenia tego ćwiczenia potrzebujesz tylko przeglądarki (tak, działa ona na Chromebooku).

Aby aktywować Google Cloud Shell, w konsoli dewelopera kliknij przycisk w prawym górnym rogu (przygotowanie środowiska i połączenie z nim zajmie tylko kilka sekund):

activateCloudShell.png

Kliknij przycisk „Uruchom Cloud Shell”:

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

Po połączeniu z Cloud Shell zobaczysz, że jesteś już uwierzytelniony, a projekt jest już ustawiony na PROJECT_ID :

gcloud auth list

Wynik polecenia

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

Wynik polecenia

[core]
project = <PROJECT_ID>

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>

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:

Project_ID.png

WAŻNE: 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 dokumentacji regionów i stref (w języku angielskim).

Ponieważ wdrażana jest istniejąca witryna, wystarczy sklonować źródło z repozytorium, dzięki czemu będzie można skoncentrować się na tworzeniu obrazów Dockera i ich wdrażaniu w Cloud Run.

Uruchom te polecenia, aby sklonować repozytorium do instancji Cloud Shell i przejść do odpowiedniego katalogu. Zainstalujesz też zależności Node.js, aby móc przetestować aplikację przed wdrożeniem.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Spowoduje to sklonowanie repozytorium, zmianę katalogu i zainstalowanie zależności potrzebnych do lokalnego uruchomienia aplikacji. Działanie skryptu może potrwać kilka minut.

Przeprowadź testy i sprawdź aplikację. Aby uruchomić serwer WWW, wykonaj to polecenie:

cd ~/monolith-to-microservices/monolith
npm start

Dane wyjściowe:

Monolith listening on port 8080!

Aby wyświetlić podgląd aplikacji, kliknij Podgląd w przeglądarce i wybierz Podejrzyj na porcie 8080.

Otworzy się nowe okno, w którym zobaczysz, jak będzie wyglądać strona internetowa sklepu Fancy Store.

Po wyświetleniu witryny możesz zamknąć to okno. Aby zatrzymać proces serwera WWW, naciśnij CONTROL+C (Command+C na komputerze Macintosh) w oknie terminala.

Po przygotowaniu plików źródłowych nadszedł czas na umieszczenie aplikacji w kontenerze Dockera.

Zwykle ten proces składa się z 2 kroków obejmujących utworzenie kontenera Dockera i przeniesienie go do rejestru w celu zapisania obrazu pobieranego potem przez GKE. Możesz jednak ułatwić sobie zadanie, korzystając z Cloud Build, aby za pomocą jednego polecenia utworzyć kontener Dockera i umieścić obraz w Container Registry. Aby prześledzić proces ręcznego tworzenia pliku Dockerfile i jego przenoszenia, zapoznaj się z krótkim wprowadzeniem do Container Registry.

Cloud Build skompresuje pliki znajdujące się w katalogu i przeniesie je do zasobnika Cloud Storage. Następnie w procesie kompilacji wszystkie pliki z zasobnika razem z plikiem Dockerfile, który znajduje się w tym samym katalogu, zostaną użyte do uruchomienia procesu kompilacji Dockera. Ponieważ dla obrazu Dockera określono flagę --tag z hostem gcr.io, wynikowy obraz Dockera zostanie przeniesiony do Container Registry.

Najpierw musisz się upewnić, że masz włączony interfejs Cloud Build API. Uruchom następujące polecenie, aby włączyć ten interfejs:

gcloud services enable cloudbuild.googleapis.com

Po włączeniu interfejsu API uruchom w Cloud Shell to polecenie, aby rozpocząć proces kompilacji:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

Ten proces może potrwać kilka minut, a po jego zakończeniu w terminalu pojawią się dane wyjściowe podobne do tych poniżej:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

Aby wyświetlić historię kompilacji lub obserwować ten proces w czasie rzeczywistym, otwórz konsolę Cloud, a następnie kliknij Menu nawigacyjne ☰> Cloud Build > Historia. Znajdziesz tam listę wszystkich utworzonych do tej pory kompilacji. Na razie powinna być tam widoczna tylko 1 kompilacja utworzona przed chwilą.

Po kliknięciu identyfikatora kompilacji zostaną wyświetlone wszystkie szczegóły kompilacji, w tym dane wyjściowe dzienników. Utworzony obraz kontenera możesz wyświetlić, klikając link obok pozycji Obraz.

Po umieszczeniu witryny w kontenerze i przeniesieniu kontenera do Container Registry nadszedł czas na przeprowadzenie wdrożenia w Cloud Run.

Są 2 sposoby wdrażania w Cloud Run:

  • Cloud Run (usługa w pełni zarządzana) to model PaaS, w którym zarządzany jest cały cykl życia kontenera. W tym ćwiczeniu użyjesz tej metody.
  • Cloud Run for Anthos to usługa Cloud Run z dodatkową warstwą kontroli, która umożliwia użycie własnych klastrów i podów z GKE. Więcej informacji znajdziesz w artykule Konfigurowanie Cloud Run dla platformy Anthos w Google Cloud.

Przykłady wiersza poleceń będą podane w Cloud Shell z użyciem zmiennych środowiskowych, które zostały skonfigurowane wcześniej.

Wiersz poleceń

Aby wdrożyć aplikację, uruchom to polecenie:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

Pojawi się prośba o określenie regionu, w którym ma działać aplikacja. Wybierz region, który znajduje się najbliżej Ciebie, a następnie zaakceptuj sugerowaną domyślną nazwę usługi (monolith).

Na potrzeby testów zezwól na przesyłanie nieuwierzytelnionych żądań do aplikacji. W odpowiedzi na pytanie wpisz y.

Sprawdzanie wdrożenia

Aby sprawdzić, czy wdrożenie zostało utworzone, uruchom to polecenie. Może minąć kilka chwil, zanim Pod status zmieni się na Running:

gcloud run services list

Wybierz [1] Cloud Run (fully managed).

Dane wyjściowe:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

Dane wyjściowe pokazują kilka elementów. Widać wdrożenie, a także nazwę użytkownika, który je wdrożył (adres e-mail) oraz adres URL umożliwiający dostęp do aplikacji. Wygląda na to, że wszystko zostało utworzone.

Otwórz adres URL widoczny na liście usług w przeglądarce. Powinna się pojawić ta sama witryna, której podgląd był wyświetlany lokalnie.

Teraz wdróż ponownie swoją aplikację, ale tym razem zmodyfikuj jeden z parametrów.

Domyślnie aplikacja w Cloud Run będzie miała równoczesność o wartości 80, co oznacza, że poszczególne instancje kontenerów będą równocześnie obsługiwać maksymalnie 80 żądań. To duże odchylenie od modelu funkcji jako usługi (FaaS), w którym jedna instancja równocześnie obsługuje jedno żądanie.

Wdróż ponownie ten sam obraz kontenera z wartością równoczesności równą 1 (tylko na potrzeby testowania) i zobacz, co się stanie.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

Odpowiedz na kolejne pytania tak samo jak za pierwszym razem. Po pomyślnym zakończeniu polecenia sprawdź wynik w konsoli Google Cloud.

W panelu Cloud Run kliknij usługę monolith, aby wyświetlić szczegóły.

Kliknij kartę Wersje. Powinny być teraz widoczne 2 utworzone wersje. Kliknij monolith-00002 i sprawdź szczegóły. Wartość równoczesności powinna zostać zmniejszona do 1.

]

Mimo że taka konfiguracja jest wystarczająca na potrzeby testowania, w większości scenariuszy produkcyjnych kontenery będą obsługiwały wiele żądań równoczesnych.

Teraz przywróć oryginalną wartość równoczesności bez ponownego wdrażania aplikacji. Wartość równoczesności możesz ustawić na domyślną wartość 80 lub 0, co spowoduje usunięcie wszelkich ograniczeń równoczesności albo ustawić dla niej domyślną maksymalną wartość (która w momencie pisania tego artykułu wynosi 80).

Uruchom to polecenie w Cloud Shell, aby zaktualizować bieżącą wersję:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

Zauważysz, że została utworzona inna wersja, ruch został przekierowany, a równoczesność ma z powrotem wartość 80.

Zespół marketingowy poprosił Cię o zmianę strony głównej witryny firmowej. Ich zdaniem powinna zawierać więcej informacji o firmie i produktach, które sprzedaje. W tej sekcji dodasz trochę tekstu do strony głównej, aby zadowolić dział marketingu.

Wygląda na to, że jeden z Twoich programistów przygotował już odpowiednie zmiany i umieścił je w pliku o nazwie index.js.new. Wystarczy skopiować ten plik do index.js, a zmiany zostaną automatycznie zastosowane. Wykonaj instrukcje, aby wprowadzić odpowiednie zmiany.

Uruchom te polecenia, aby skopiować zaktualizowany plik z poprawną nazwą, a następnie wyświetlić jego zawartość w celu sprawdzenia dokonanych zmian:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

Wynikowy kod powinien wyglądać podobnie do tego:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

Zaktualizowane zostały komponenty React, ale musisz jeszcze utworzyć aplikację React, by wygenerować pliki statyczne. Uruchom to polecenie, by utworzyć aplikację React i skopiować ją do katalogu publicznego usługi monolith:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

Po zaktualizowaniu kodu musisz ponownie utworzyć kontener Dockera i opublikować go w Container Registry. Możesz użyć tego samego polecenia co wcześniej, ale tym razem zaktualizujesz etykietę wersji.

Uruchom to polecenie, aby aktywować nową kompilację Cloud Build ze zaktualizowaną wersją obrazu 2.0.0:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

W następnej sekcji użyjesz tego obrazu, aby zaktualizować aplikację z zerowym czasem przestoju.

Zmiany zostały wprowadzone i dział marketingu jest zadowolony z aktualizacji. Nadszedł czas, aby zaktualizować witrynę bez przerw dla użytkowników.

Cloud Run traktuje każde wdrożenie jako nową wersję, która zostanie przełączona w tryb online, a następnie zostanie do niej przekierowany ruch.

Aby zaktualizować witrynę, wykonaj kolejne instrukcje.

Wiersz poleceń

W wierszu poleceń możesz ponownie wdrożyć usługę, aby zaktualizować obraz do nowej wersji, za pomocą tego polecenia:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

Sprawdzanie wdrożenia

Aby sprawdzić aktualizację wdrożenia, uruchom to polecenie:

gcloud run services describe monolith --platform managed 

Dane wyjściowe wyglądają tak:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

Widać tutaj, że usługa korzysta teraz z najnowszej wersji obrazu wdrożonego w nowej wersji.

Aby sprawdzić zmiany, ponownie przejdź do zewnętrznego adresu URL usługi w Cloud Run i zwróć uwagę na zaktualizowany tytuł aplikacji.

Jeśli zapomnisz adresu IP, uruchom to polecenie, aby wyświetlić listę usług i adres IP:

gcloud run services list

W Twojej witrynie powinien być teraz widoczny tekst dodany do komponentu strony głównej.

Usuwanie obrazów Container Registry

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

Usuwanie artefaktów Cloud Build z Cloud Storage

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

Usunięcie usługi Cloud Run

gcloud run services delete monolith --platform managed

Udało Ci się wdrożyć, przeskalować i zaktualizować witrynę za pomocą Cloud Run.

Więcej informacji