Wdrażanie witryny za pomocą Cloud Run

Uruchamianie witryn może być trudne z uwzględnieniem kosztów tworzenia instancji, maszyn wirtualnych, podów, usług i innych usług oraz zarządzania nimi. To dobre rozwiązanie w przypadku większych, wielopoziomowych aplikacji, ale jeśli chcesz, by Twoja witryna była wdrażana i widoczna, oznacza to dużo pracy.

Cloud Run, czyli implementacja Knative, umożliwia zarządzanie witryną i wdrażanie jej bez konieczności wykonywania dodatkowych czynności związanych z wdrożeniami opartymi na maszynach wirtualnych lub Kubernetes. Nie tylko jest to prostsze podejście z poziomu zarządzania, ale też możliwość skalowania do zera, gdy nie otrzymujesz żadnych żądań w swojej witrynie.

Cloud Run umożliwia nie tylko tworzenie bezserwerowych rozwiązań w kontenerach, ale również uruchamianie z własnych klastrów Google Kubernetes Engine (GKE) lub na w pełni zarządzanej platformie jako usługi (PaaS) udostępnianej przez Cloud Run. W tym ćwiczeniu z programowania przetestujesz ten drugi scenariusz.

Poniższy diagram przedstawia przepływ wdrożenia i hosting w Cloud Run. Zaczniesz od obrazu Dockera utworzonego w Cloud Build, który jest aktywowany w Cloud Shell. Następnie możesz wdrożyć 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 stworzysz

  • Strona statyczna, która jest uruchamiana w kontenerze Dockera.
  • Wersja tego kontenera, która znajduje się w Container Registry
  • Wdrożenie Cloud Run dla witryny statycznej

Czego potrzebujesz

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

Konfiguracja środowiska do samodzielnego ukończenia

Jeśli nie masz jeszcze konta Google, musisz je utworzyć. Następnie zaloguj się w Google Cloud Console 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ć. To pole będzie później nazywane PROJECT_ID.

Następnie musisz włączyć płatności w Cloud Console, aby używać zasobów Google Cloud i interfejsu Cloud Run API.

Włącz Cloud Run API

Kliknij Menu nawigacyjne > Interfejsy API i usługi. .

Wyszukaj hasło „"Cloud Run API” i kliknij Cloud Run API > Włącz.

Ć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 Czyszczenie na końcu). Więcej informacji znajdziesz w cenniku.

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

Cloud Shell

Google Cloud i Cloud Run można uruchamiać zdalnie z laptopa, ale Cloud Shell to środowisko wiersza poleceń działające w Google Cloud. Środowisko jest wstępnie skonfigurowane ze wszystkimi potrzebnymi bibliotekami i platformami klienta.

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.

Biorąc pod uwagę, że wdrażasz istniejącą witrynę, wystarczy skopiować źródło z repozytorium, aby można było skupić się na tworzeniu obrazów Dockera i wdrażaniu ich w Cloud Run.

Uruchom następujące polecenia, aby skopiować repozytorium do instancji Cloud Shell i przejść do odpowiedniego katalogu. Zainstalujesz też zależności Node.js, co pozwoli Ci przetestować aplikację przed wdrożeniem.

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

Spowoduje to skopiowanie repozytorium, wprowadzenie zmian w katalogu i zainstalowanie zależności wymaganych do lokalnego uruchomienia aplikacji. Uruchamianie skryptu może potrwać kilka minut.

Zachowaj ostrożność i przetestuj swoją aplikację. Uruchom następujące polecenie, aby uruchomić serwer WWW:

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 Podgląd na porcie 8080.

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

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

Pliki źródłowe są już gotowe, więc możesz schować aplikację z Dockera.

Normalnie trzeba wykonać 2 kroki, które obejmują utworzenie kontenera Dockera i przeniesienie go do rejestru, by zapisać obraz, z którego GKE może pobierać dane. Możesz jednak ułatwić sobie pracę, wykorzystując Cloud Build do utworzenia kontenera Dockera i umieszczenia obrazu w Container Registry przy użyciu jednego polecenia. Aby dowiedzieć się, jak ręcznie utworzyć plik Dockerfile i go przenieść, zobacz Krótkie wprowadzenie do Container Registry.

Cloud Build kompresuje pliki z katalogu i przenosi je do zasobnika Cloud Storage. Następnie podczas kompilacji tworzone są wszystkie pliki z zasobnika i używany jest plik Dockerfile, który znajduje się w tym samym katalogu na potrzeby procesu kompilacji Dockera. Ponieważ w przypadku obrazu Dockera określono flagę --tag z hostem gcr.io, wynikowy obraz Dockera zostanie przekazany do Container Registry.

Najpierw sprawdź, czy 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, ale po jego zakończeniu w terminalu pojawią się dane wyjściowe podobne do tych:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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 obejrzeć ten proces w czasie rzeczywistym, otwórz Cloud Console, a następnie kliknij Menu nawigacyjne ☰ > Cloud Build > Historia. Zobaczysz listę wszystkich swoich kompilacji, ale powinna tam być tylko ta utworzona przez Ciebie.

Jeśli klikniesz Identyfikator kompilacji, zobaczysz wszystkie szczegóły danej kompilacji, w tym dane z dziennika. Aby wyświetlić utworzony obraz kontenera, kliknij link obok pozycji Obraz.

Po skonteneryzowaniu witryny i przekazaniu jej do Container Registry nadszedł czas na wdrożenie w Cloud Run.

Istnieją 2 sposoby wdrażania w Cloud Run:

  • Cloud Run (w pełni zarządzanym) to model PaaS, w którym zarządza się cały cykl życia kontenera. Ta metoda zostanie wykorzystana w tym ćwiczeniu z programowania.
  • Cloud Run dla platformy Anthos to dodatkowa warstwa kontroli, dzięki której możesz przenieść klastry i pody z GKE. Więcej informacji znajdziesz w artykule Konfigurowanie Cloud Run dla platformy Anthos w Google Cloud.

Przykłady z wiersza poleceń będą znajdować się w Cloud Shell przy użyciu skonfigurowanych przez Ciebie wcześniej zmiennych środowiskowych.

Wiersz poleceń

Uruchom następujące polecenie, aby wdrożyć aplikację:

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

Pojawi się prośba o wskazanie regionu, w którym chcesz wyświetlać reklamy. Wybierz region w pobliżu, a następnie zaakceptuj domyślną sugerowaną nazwę usługi (monolith).

Na potrzeby testów zezwól na wysyłanie do aplikacji nieuwierzytelnionych żądań. Wpisz w pytaniu y.

Sprawdzanie wdrożenia

Aby sprawdzić, czy wdrożenie zostało utworzone, uruchom to polecenie. Pod status może potrzebować kilku minut na Running:

gcloud run services list

Wybierz [1] Cloud Run (usługa w pełni zarządzana).

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 obejmują kilka elementów. Widać wdrożenie, a także nazwę użytkownika, który je wdrożył (Twój adres e-mail), oraz adres URL, którego możesz użyć, aby uzyskać dostęp do aplikacji. Wygląda na to, że wszystko zostało utworzone.

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

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

Domyślnie aplikacja Cloud Run ma wartość równoczesności równą 80, co oznacza, że każda instancja kontenera może jednocześnie obsłużyć 80 żądań. To duże odchylenie od funkcji jako modelu usługi (FaaS), w którym jedna instancja przetwarza jedno żądanie naraz.

Wdróż ponownie ten sam obraz kontenera z wartością równoczesności równą 1 (tylko do celów testowych) 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 uruchomieniu polecenia sprawdź Cloud Console, aby zobaczyć wynik.

Aby zobaczyć szczegóły, kliknij panel monolith w panelu Cloud Run.

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

]

Mimo że taka konfiguracja jest wystarczająca do testowania, w większości przypadków produkcyjnych będziesz mieć kontenery obsługujące wiele równoczesnych żądań.

Teraz przywróć pierwotną równoczesność bez ponownego wdrażania. Możesz ustawić wartość równoczesności na wartość 80 lub 0, co spowoduje usunięcie wszystkich ograniczeń równoczesności i zostanie ustawiona na maksymalną wartość domyślną, która w momencie zapisu nie wynosi 80.

Uruchom następujące 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

Zwróć uwagę, że utworzono nową wersję, ruch został przekierowany, a równoczesność ma z powrotem wartość 80.

Zespół marketingowy poprosił Cię o zmianę strony głównej witryny firmy. Ich zdaniem powinna zawierać więcej informacji o firmie i jej ofercie. W tej sekcji dodasz do strony głównej jakiś tekst, aby zadowalać zespół marketingowy.

Wygląda na to, że jeden z Twoich programistów utworzył już zmiany o nazwie pliku index.js.new. Możesz skopiować ten plik do index.js, a zmiany zostaną automatycznie zastosowane. Postępuj zgodnie z instrukcjami, aby wprowadzić odpowiednie zmiany.

Uruchom następujące polecenia, skopiuj zaktualizowany plik na poprawną nazwę i wydrukuj jego zawartość, aby sprawdzić zmiany:

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 monolitu:

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

Po zaktualizowaniu kodu musisz ponownie utworzyć kontener Dockera i opublikować go w Rejestrze kontenerów. Możesz użyć tego samego polecenia co wcześniej, ale tym razem nie zaktualizujesz etykiety 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ę i zapewnić jej brak.

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

Cloud Run traktuje każde wdrożenie jako nową wersję, która zostanie przełączona do trybu online, a ruch do niego zostanie przekierowany.

Wykonaj kolejne zestawy instrukcji, aby zaktualizować witrynę.

Wiersz poleceń

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

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

Sprawdzanie wdrożenia

Sprawdź aktualizację wdrożenia, uruchamiając następujące polecenie:

gcloud run services describe monolith --platform managed 

Dane wyjściowe będą wyglądać tak:

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

Zobaczysz, że Twoja usługa używa teraz najnowszej wersji obrazu wdrożonego w nowej wersji.

Aby sprawdzić zmiany, przejdź jeszcze raz pod zewnętrzny adres URL usługi Cloud Run i zauważ, że tytuł aplikacji został zaktualizowany.

Uruchom następujące polecenie, aby wyświetlić listę usług i sprawdzić adres IP, jeśli je zapomnisz:

gcloud run services list

Twoja witryna powinna teraz wyświetlać 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