Spis treści
Chmura pozwala znacznie odciążyć zespoły IT. Jej zarządzane usługi przejmują lwią część prac utrzymaniowych, pozostawiając więcej przestrzeni na rozwój. Pozwalają szybciej wdrażać i modyfikować aplikacje, zapewniają wysoką dostępność poprzez skalowanie w odpowiedzi na bieżące zapotrzebowanie oraz prowadzą do optymalizacji kosztów dzięki rozliczeniom w modelu pay-as-you-use. Szczególnie popularnymi usługami wśród przedsiębiorstw, jak też indywidualnych specjalistów, są te z wachlarza Compute & Serverless – usługi maszyn wirtualnych i platform developerskich.
Compute & Serverless: moc obliczeniowa chmury Google
Google Cloud Platform oferuje blisko 200 zarządzanych usług chmurowych, w tym maszyny wirtualne oraz platformy developerskie (grupa Compute & Serverless). To usługi, które dają dostęp do niemal nieograniczonej mocy obliczeniowej Google oraz specyfikacji, której konfiguracja w modelu on-premise byłaby bardzo kosztowna.
Do usług Compute & Serverless należą między innymi:
- Compute Engine – usługa maszyn wirtualnych w modelu Infrastructure as a Service,
- App Engine – platforma developerska służąca do pisania i deployowania kodu, z zautomatyzowanymi procesami obsługi infrastruktury,
- Google Kubernetes Engine – Kubernetes w chmurze, czyli platforma orkiestracji kontenerów i klastrów,
- Cloud Run – bezserwerowa usługa dedykowana tworzeniu i rozwijaniu aplikacji w kontenerach,
- Cloud Functions – usługa w modelu Function as a Service, która daje możliwość zamieszczenia oraz wywołania i wykonania kodu funkcji w odpowiedzi na określony event.
Co to jest Cloud Run?
Cloud Run to oparta na Knative zarządzana platforma chmurowa, która umożliwia szybkie tworzenie i wdrażanie aplikacji w kontenerach. Jest bezserwerowa, co oznacza, że użytkownik nie musi doglądać żadnego elementu infrastruktury – konserwacji fizycznych maszyn, aktualizacji oprogramowania, równoważenia obciążenia czy skalowania. Skupia się jedynie na pisaniu kodu w dowolnej, wybranej przez siebie technologii, z użyciem ulubionych bibliotek czy własnych plików binarnych.
Funkcjonalności Cloud Run
- Dowolna technologia. Ponieważ usługa operuje na kontenerach, umożliwia tworzenie kodu aplikacji z użyciem dowolnego języka programowania (m.in. Go, Python, Java, Ruby czy Node.js), bibliotek czy plików binarnych.
- Wykorzystanie możliwości kontenerów. Cloud Run pobiera dowolne obrazy kontenerów i dobrze integruje się z takimi technologiami jak Cloud Build, Artifact Registry czy Docker.
- Integracja z innymi usługami chmurowymi. Ponieważ Cloud Run jest elementem Google Cloud Platform, relatywnie łatwo jest stworzyć jedno zintegrowane środowisko wykorzystujące kilka czy nawet kilkanaście innych usług GCP.
- Brak ograniczenia do jednej chmury. Usługa bazuje na otwartoźródłowej technologii Knative oraz na kontenerach, dzięki czemu zasoby mają zapewnioną przenośność, co uniemożliwia uzależnienie się od jednego dostawcy chmurowego (cloud lock-in).
- W pełni zarządzana usługa. Raz skonfigurowana nie wymaga ponownych aktualizacji, by prawidłowo zarządzać środowiskiem aplikacji.
- Natychmiastowe automatyczne skalowanie. W sytuacjach zwiększonego obciążenia usługa skaluje się w górę, by zapewnić wysoką dostępność, a w momencie spadku ruchu zmniejsza liczbę funkcjnujących intancji, zapewniają tym samym koszty adekwatne do zużycia.
- Stabilność dzięki redundancji. Zasoby uruchomione w Cloud Run w modelu regional są nieustannie przesyłane pomiędzy zonami, by zapewnić trwałość danych nawet w obliczu awarii serwerowni Google Cloud.
- Bezpieczeństwo. Usługa Binary Authorization pozwala wdrażać jedynie zaufane obrazy kontenerów. Zasoby są uruchamiane w odizolowanych środowiskach, z określonymi tożsamościami i poziomami dostępu. Do zabezpieczenia możesz użyć własnego klucza szyfrowana, a danymi dostępu zarządzać poprzez usługę Secret Manager.
- Kontrola i monitoring. Usługa jest zintegrowana z narzędziami Cloud Monitoring, Cloud Logging, Cloud Trace i Error Reporting w celu zapewnienia dobrej kondycji aplikacji. Poziom użycia usługi można monitorować w GUI Metrics, wraz z logami z kontenerów. Ponadto Cloud Run posiada wbudowaną funkcjonalność umożlwiaijaącą szybkie przywrócenie poprzedniej wersji kontenera (rollback).
Przykłady użycia Cloud Run
Serwis internetowy
Przy użyciu usługi Cloud Run można utworzyć dynamicznie renderowane strony HTTP, angażując takie technologie jak nginx, ExpressJS czy django, a bazę danych posiadać w Cloud SQL.
Aplikacja dla działów back-office
Działania administracyjne w organizacjach często obejmują prace na arkuszach kalkulacyjncych czy w programach zewnętrznych dostawców. Z pomocą Cloud Run można utworzyć aplikację wspierającą integracje między programami, usprawniającą zarządzanie dostępami wśród użytkowników czy obieg dokumentacji w organizacji.
Automatyczne generowanie dokumentów
Cloud Run w połączeniu z Cloud Schedulerem pozwala zbudować aplikację wykonującą automatycznie cykliczne akcje – na przykład generowanie co miesiąc faktury. Ponieważ do Cloud Run można wdrożyć kontenery zawierające dowolne (również własne) pliki binarne, aplikacja może angażować narzędzia do tworzenia plików PDF, np. LibreOffice.
Ponieważ usługa jest rozliczana za użycie, w sytuacji gdy aplikacja nie jest używana, nie ponosi się żadnych opłat (o ile dolny limit skalowania wynosi 0). W przykładzie wyżej, opłata za Cloud Run będzie naliczana tylko raz w miesiącu, w momencie generowania faktury.
Tutorial – uruchomienie usługi i wdrożenie kontenera
Poniższy tutorial wskazuje, w jaki sposób utworzyć prostą aplikację Hello World, spakować ją do obrazu kontenera, a następnie wdrożyć obraz w Cloud Run. Wspierane są wszystkie języki programowania, które można uruchomić w kontenerze.
Czyli w skrócie: Aplikacja.py → Kontener → Cloud Run
Zanim zaczniesz
1. Zaloguj się do konsoli Google Cloud Platform – console.cloud.google.com.
2. Upewnij się, że płatności w Twoim projekcie są włączone (zakładka Billing).
3. Zainstaluj i zainicjuj Cloud SDK.
Utworzenie aplikacji Hello World
1. Utwórz katalog i przejdź do niego.
mkdir helloworld
cd helloworld
2. Stwórz plik main.py i wklej do niego poniższą treść:
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "World")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
Powyższy kod uruchamia prosty serwer www Gunicorn z aplikacją, która zwraca tekst „Hello World” po otrzymaniu zapytania HTTP. Port, na którym nasłuchuje aplikacja, jest zdefiniowany przez zmienną środowiskową lub jest to 8080.
3. Następnie utwórz plik requirements.txt, w którym wpiszesz niezbędne zależności (moduły) potrzebne do uruchomienia aplikacji. Poniżej treść pliku:
Flask==2.0.1
gunicorn==20.1.0
4. Dockerfile to plik definiujący kontener, między innymi to, co ma się dziać po jego uruchomieniu. W tym przypadku uruchamia webserwer Gunicorn, który nasłuchuje na porcie zdefiniowanym przez zmienną środowiskową PORT.
Jako obraz bazowy używany jest oficjalny lekki obraz Python – https://hub.docker.com/_/python
FROM python:3.9-slim
Poniższa dyrektywa pozwala, by logi Python pojawiały się od razu logach Knative:
ENV PYTHONUNBUFFERED True
Za pomocą tej funkcji odbywa się kopiowanie lokalnego kodu do obrazu kontenera:
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
Instalowanie zależności produkcyjnych odbywa się za pomocą:
RUN pip install --no-cache-dir -r requirements.txt
Uruchomienie webserwera Gunicorn następuje w trakcie uruchamiania kontenera.
Dla środowisk uruchomieniowych z procesorem wielordzeniowym warto zwiększyć liczbę workerów (gunicorn) do wartości równiej liczbie rdzeni. Timeout workerów jest ustawiony na 0, aby umożliwić usłudze Cloud Run skalowanie instancji:
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
5. Następnie dodaj plik .dockerignore, aby wykluczyć kopiowanie określonych plików. Treść pliku:
Dockerfile
README.md
*.pyc
*.pyo
*.pyd
__pycache__
.pytest_cache
Sposób 1: Wdrożenie aplikacji w Cloud Run z lokalnego środowiska
Żeby przeprowadzić wdrożenie w usłudze Cloud Run, musisz posiadać odpowiednie uprawnienia na projekcie GCP – „Owner” lub „Editor”.
1. W katalogu z aplikacją wpisz poniższą komendę:
gcloud run deploy
2. Jeśli pojawi się monit o włączeniu API, należy wpisać y, aby je uruchomić.
3. Gdy pojawi się pytanie o lokalizację kodu źródłowego, wciśnij klawisz Enter, aby wdrożyć bieżący folder.
4. Po wyświetleniu pytania o nazwę usługi wciśnij klawisz Enter, aby zaakceptować domyślną nazwę helloworld.
5. Jeśli pojawi się pytanie o włączenie interfejsu Artifact Registry API, wystarczy nacisnąć y.
6. Gdy zostaniesz poproszony o podanie regionu, wskaż nazwę lokalizacji (na przykład europe-central2). Tutaj znajduje się lista regionów Cloud Run.
7. Na pytanie o nieuwierzytelnione wywoływanie odpowiedz y. Dzięki temu każdy znający URL usługi będzie mógł się do niej dostać.
8. Następnie należy poczekać chwilę, aż wdrożenie zostanie zakończone. W przypadku powodzenia, wiersz poleceń wyświetli adres URL usługi.
9. Sprawdź, czy rzeczywiście usługa działa, wklejając w przeglądarce zwrócony adres URL.
10. Jeśli dotarłeś do tego miejsca, to gratulacje! Właśnie wdrożyłeś obraz kontenera z kodu źródłowego w Cloud Run. Cloud Run automatycznie skaluje usługę w górę w razie wzrostu zapotrzebowania, czyli dodaje kolejne instancje. Kiedy obciążenie spadnie, to również liczba instancji się redukuje, dzięki czemu nie będziesz przepłacać za usługę.
Sposób 2: Wdrożenie w konsoli z rejestru kontenerów
W Cloud Run aplikacje można też wdrożyć inaczej, z poziomu graficznego UI konsoli. Jako źródło kodu można wskazać obraz, wcześniej przygotowany i przesłany do repozytorium (Cloud Artifacts Registry lub Cloud Container Registry) albo wybrać repozytorium kodu źródłowego. Poniżej znajduje się krótka instrukcja, jak przeprowadzić wdrożenie z użyciem repozytorium obrazów:
1. Przejdź do folderu z aplikacją Hello World, którą wcześniej przygotowałeś.
2. Zbuduj obraz, podając komendę docker build.
Po prawidłowej budowie obrazu powinien pokazać się komunikat:
Successfully built [ID obrazu]
W przypadku projektu z tutoriala jest to:
Successfully built ad890e53825e
3. Warto sprawdzić, czy obraz uruchamia się prawidłowo lokalnie. W tym celu wywołaj komendę:
docker run -p 8080 -e PORT=8080 [ID obrazu]
Po przejściu do przeglądarki, na adres localhost po zdefiniowanym wcześniej porcie (w tym przypadku 127.0.0.1:8080), powinieneś zobaczyć efekt wdrożenia:
4. Kolejnym krokiem jest otagowanie obrazu tak, aby można go było wysłać do container registry:
docker tag SOURCE_IMAGE HOSTNAME/PROJECT-ID/IMAGE
W przypadku opisanym w tutorialu komenda wygląda następująco:
docker tag ad890e53825e eu.gcr.io/preemptible-vm-instances/helloworld-2
5. Następnie należy wysłać obraz do rejestru kontenerów:
docker push eu.gcr.io/preemptible-vm-instances/helloworld-2
Jeśli akcja zakończyła się powodzeniem, w terminalu powinieneś zobaczyć taki widok:
Aby sprawdzić, czy obraz rzeczywiście znajduje się w repozytorium, wystarczy wpisać:
gcloud container images list-tags eu.gcr.io/preemptible-vm-instances/helloworld-2
Komendę należy zmodyfikować o region, w którym jest uruchomiona usługa, nazwę projektu oraz nazwę obrazu.
Terminal powinien zwrócić wartości:
DIGEST: 44682cb07278
TAGS: latest
6. Jeśli już masz obraz w rejestrze, nie pozostaje nic innego, jak przejść do konsoli graficznej i wdrożyć kontener.
Po przejściu do konsoli, do zakładki Cloud Run, kliknij Create Service.
7. W panelu konfiguracyjnym kliknij Select…
…i wybierz obraz kontenera.
8. Następnie wskaż region, w którym mają być wdrożone usługi:
9. Kolejnym krokiem jest wybór procesora. Wskaż, czy procesor ma być alokowany tylko podczas zapytania, czy zawsze. Jeśli chcesz płacić tylko za rzeczywiste zużycie, lepsza będzie pierwsza opcja.
Zdefiniuj też wartości automatycznego skalowania – minimalną i maksymalną liczbę instancji. Jeśli ustawisz minimalny limit 1 (lub wyższy), będziesz płacić za usługę, nawet gdy nie będzie używana, ale usługa będzie uruchamiać się szybciej dzięki pominięciu Cold Start. Jeśli nie chcesz płacić za nieużywaną usługę, ustaw dolny limit 0. Zwróć szczególną usługę na górny limit skalowania – bezpiecznie jest ustawić niewysoką liczbę instancji (tutaj możesz przeczytać o niepotrzebnie wysokim rachunku za usługę w wyniku zbyt wysokiego górnego limitu skalowania).
10. Zdefiniuj, czy ruch do usługi ma być uwierzytelniany oraz czy dopuszczony jest ruch wewnętrzny (sieć VPS) czy ruch publiczny.
11. Kliknij Create i zaczekaj, aż usługa się uruchomi.
12. Jeśli zobaczysz podobny widok, jak na poniższym zrzucie ekranu, to oznacza, że usługa jest aktywna.
Możesz sprawdzić jej działanie, wchodząc na wygenerowany URL.
13. Wdrożenie aplikacji na Google Cloud Run zakończyło się powodzeniem. W następnym kroku możesz skonfigurować Continous Deployment do Cloud Run, by zautomatyzować wdrożenia. Możesz też zarządzać ruchem między wersjami, by prowadzić testy A/B aplikacji. Oprócz obsługi zapytań HTTPS, można zdefiniować zdarzenia, które będą wyzwalać obraz – obecnie dostępnych jest ponad 90 eventów spośród różnych usług GCP.
Ile kosztuje Cloud Run? Koszty usługi
Usługa jest rozliczana w modelu pay-as-you-use w ujęciu sekundowym. W kosztach uwzględnione są CPU, pamięć, liczba zapytań oraz użycie sieci. Usługa ma bezpłatny odnawialny miesięczny limit Free Tier.
CPU | Pamięć | Zapytania | |
Koszt | 0,00002400 USD za sekundę vCPU | 0,00000250 USD za GB na sekundę | 0,40 USD za milion requestów |
Free Tier (limity miesięczne) | 180 000 sekund vCPU | 360 000 GB na sekundę | 2 miliony requestów |
By otrzymać dokładną estymację, możesz skorzystać z kalkulatora Google Cloud Platform.