Google Compute Engine

1. Wprowadzenie

Cześć wszystkim, dziękuję za przybycie! Chcesz poznać Google Compute Engine?

W tym module poznamy Compute Engine na przykładzie aplikacji księgi gości.

Utworzysz instancje Compute Engine, wdrożysz nginx i na koniec umieścisz z przodu sieciowy system równoważenia obciążenia. Instancję Compute Engine możesz utworzyć w konsoli graficznej lub wierszu poleceń. W tym module dowiesz się, jak korzystać z wiersza poleceń.

ComputeEngine_128px.png

Google Compute Engine oferuje maszyny wirtualne działające w centrach danych Google połączonych z globalną siecią światłowodową. Dostępne narzędzia i procesy umożliwiają skalowanie od pojedynczych instancji po globalne, zrównoważone pod względem obciążenia przetwarzanie w chmurze.

Te maszyny wirtualne szybko się uruchamiają, mają pamięć masową Persistent Disk i zapewniają stałą wydajność. Maszyny są dostępne w wielu konfiguracjach, w tym w predefiniowanych rozmiarach, a także można je tworzyć za pomocą niestandardowych typów maszyn zoptymalizowanych pod kątem konkretnych potrzeb.

Maszyny wirtualne Compute Engine są też wykorzystywane przez kilka innych usług Google Cloud (Kubernetes Engine, Cloud Dataproc, Cloud Dataflow itp.).

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 ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz go w dowolnym momencie zaktualizować.
  • Identyfikator projektu musi być unikalny we wszystkich projektach Google Cloud i jest niezmienny (nie można go zmienić po ustawieniu). Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości modułów z kodem musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli Ci się nie podoba, wygeneruj inny losowy identyfikator lub spróbuj użyć własnego i sprawdź, czy jest dostępny. Po utworzeniu projektu jest on „zamrażany”.
  • Istnieje też trzecia wartość, czyli numer projektu, którego używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczenia opłat po zakończeniu tego samouczka, postępuj zgodnie z instrukcjami „czyszczenia” na końcu ćwiczenia. 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.

Google Cloud Shell

Z Google Cloud i Compute Engine można korzystać zdalnie na laptopie, ale w tym module użyjemy Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

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 b125d9eb26a46cc5.png (udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil).

1067942a9a93f70.png

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:

cc3895eeac80db2c.png

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.

3. Tworzenie maszyny Compute Engine

Jak wspomnieliśmy wcześniej, w tym laboratorium użyjemy wiersza poleceń gcloud. Wszystkie te czynności można wykonać w konsoli (dostępnej na stronie console.cloud.google.com).

Najpierw utwórzmy instancję z ustawieniami domyślnymi :

$ gcloud compute instances create myinstance
Created [...].
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

Zanotuj EXTERNAL_IP – będzie Ci później potrzebne.

Instancja jest tworzona z użyciem kilku wartości domyślnych :

  • Wybrana strefa. Wszystkie instancje znajdują się w strefie. Strefę możesz wybrać podczas tworzenia instancji za pomocą flagi --zone lub ustawić strefę domyślną (tak jak w przypadku konfiguracji początkowej) i pominąć flagę --zone.
  • Najnowszy obraz Debian GNU/Linux 9 (stretch). Jeśli używasz własnego niestandardowego obrazu, podaj tutaj jego nazwę. Na przykład: --image my-own-image.
  • n1-standard-1 Typ maszyny. Możesz wybrać inny typ maszyny, np. n1-highmem-4 lub n1-highcpu-6. Jeśli żaden z predefiniowanych typów maszyn nie spełnia Twoich potrzeb, użyj niestandardowego typu maszyny.
  • Główny dysk stały o takiej samej nazwie jak instancja. Ten dysk jest automatycznie podłączany do instancji.

Uruchom polecenie gcloud compute instances create --help, aby zobaczyć wszystkie dostępne opcje.

4. Włącz zaporę sieciową dla portu 80

Domyślnie Google Cloud Platform zezwala tylko na dostęp do kilku portów. Wkrótce zainstalujemy Nginx, więc najpierw włączmy port 80 w konfiguracji zapory.

$ gcloud compute firewall-rules create allow-80 --allow tcp:80
Created [...].
NAME: allow-80
NETWORK: default
DIRECTION: INGRESS
PRIORITY: 1000
ALLOW: tcp:80
DENY:
DISABLED: False

Spowoduje to utworzenie reguły zapory sieciowej o nazwie allow-80, która ma domyślną listę bloków adresów IP, które mogą nawiązywać połączenia przychodzące (--source-ranges), ustawioną na 0.0.0.0/0 (Wszędzie).

Uruchom polecenie gcloud compute firewall-rules create --help, aby zobaczyć wszystkie wartości domyślne i wszystkie dostępne opcje, w tym możliwość zastosowania reguł zapory sieciowej na podstawie tagów.

5. Łączenie się z instancją przez SSH

Aby połączyć się z instancją przez SSH z wiersza poleceń (wciąż z Cloud Shell) :

$ gcloud compute ssh myinstance
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.12345' (ECDSA) to the list of known hosts.
...

yourusername@myinstance:~#

To wszystko. Całkiem proste. (W wersji produkcyjnej wpisz hasło).

Możesz też połączyć się z instancją przez SSH bezpośrednio z konsoli ( console.cloud.google.com). W tym celu otwórz Compute Engine > Instancje maszyn wirtualnych i kliknij SSH.

bfbc03997a41946e.png

6. Instalowanie Nginx

Zaloguj się w myinstance, czyli nowo utworzonej instancji, i zainstaluj nginx:

$ sudo su - 
# apt update
# apt install -y nginx
# service nginx start
# exit

Sprawdź, czy serwer działa, używając polecenia curlmyinstance:

$ curl -s localhost | grep nginx
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
<a href="http://nginx.org/">nginx.org</a>.<br/>
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>

Aby znaleźć zewnętrzny adres IP instancji, wyświetl listę instancji w interfejsie internetowym:

dcc4e56e82ba2603.png

Zakończ sesję SSH i uruchom to polecenie w Cloud Shell:

$ gcloud compute instances list
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

Następnie przejdź do http://EXTERNAL_IP/, gdzie EXTERNAL_IP to publiczny adres IP instancji myinstance. Powinna się wyświetlić strona nginx:

49b52b9354041f3b.png

7. Skrypt startowy

Zamiast konfigurować instancję za każdym razem, możesz użyć skryptu startowego, aby zainicjować ją podczas uruchamiania.

Utwórz plik o nazwie startup.sh z następującą treścią (możesz użyć ulubionego edytora tekstu: vim, nano lub emacs):

#! /bin/bash
apt-get update
apt-get install -y nginx
service nginx start
sed -i -- 's/nginx/Google Cloud Platform - '"$HOSTNAME"'/' /var/www/html/index.nginx-debian.html

Aby utworzyć nową instancję maszyny wirtualnej za pomocą tego skryptu startowego, wpisz :

$ gcloud compute instances create nginx \
         --metadata-from-file startup-script=startup.sh 
Created [...].
NAME: nginx
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

Otwórz http://EXTERNAL_IP/, aby zobaczyć zaktualizowaną stronę główną. Jeśli strona nie wyświetli się od razu, spróbuj ponownie po kilku sekundach. Gospodarz może nadal uruchamiać nginx.

8. Tworzenie klastra serwerów

Aby utworzyć klaster serwerów, musisz najpierw utworzyć szablon instancji. Po utworzeniu szablonu instancji możesz utworzyć grupę instancji, aby zarządzać liczbą instancji do utworzenia.

Najpierw utwórz szablon instancji, który używa skryptu startowego :

$ gcloud compute instance-templates create nginx-template \
         --metadata-from-file startup-script=startup.sh
Created [...].
NAME: nginx-template
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
CREATION_TIMESTAMP: 2022-03-18T15:10:37.621-07:00

Po drugie, utwórzmy pulę docelową. Pula docelowa stanowi pojedynczy punkt dostępu do wszystkich instancji w grupie i jest niezbędna do równoważenia obciążenia, które zostanie opisane w kolejnych krokach.

$ gcloud compute target-pools create nginx-pool
Created [...].
NAME: nginx-pool
REGION: us-central1
SESSION_AFFINITY: NONE
BACKUP:
HEALTH_CHECKS:

Na koniec utwórz grupę instancji za pomocą szablonu:

$ gcloud compute instance-groups managed create nginx-group \
         --base-instance-name nginx \
         --size 2 \
         --template nginx-template \
         --target-pool nginx-pool
Created [...].
NAME: nginx-group
LOCATION: us-central1-f
SCOPE: zone
BASE_INSTANCE_NAME: nginx
SIZE: 0
TARGET_SIZE: 2
INSTANCE_TEMPLATE: nginx-template
AUTOSCALED: no

Spowoduje to utworzenie 2 dodatkowych instancji maszyn wirtualnych, których nazwy poprzedza prefiks nginx-.

Powinny być teraz widoczne wszystkie utworzone instancje.

$ gcloud compute instances list
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx-frpl
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx-ztg4
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

9. Tworzenie systemu równoważenia obciążenia sieci

W Google Cloud Platform jest kilka rodzajów systemów równoważenia obciążenia, m.in.:

Utwórzmy regionalny sieciowy system równoważenia obciążenia obsługujący naszą grupę instancji:

$ gcloud compute forwarding-rules create nginx-lb \
         --ports 80 \
         --target-pool nginx-pool
Created [...].

$ gcloud compute forwarding-rules list
NAME: nginx-lb
REGION: us-central1
IP_ADDRESS: X.X.X.X
IP_PROTOCOL: TCP
TARGET: us-central1/targetPools/nginx-pool

Następnie możesz otworzyć system równoważenia obciążenia w przeglądarce, wpisując http://IP_ADDRESS/, gdzie IP_ADDRESS jest adresem wyświetlonym w wynikach wykonania poprzedniego polecenia.

Ze względu na czas nie utworzymy dziś systemu równoważenia obciążenia HTTP.

10. Zwalnianie miejsca w klastrze

Nie zapomnij wyłączyć klastra, w przeciwnym razie będzie on nadal działać i generować koszty. Te polecenia usuną instancje Google Compute Engine, grupę instancji, grupę kierowania i system równoważenia obciążenia.

$ gcloud compute forwarding-rules delete nginx-lb

$ gcloud compute instance-groups managed delete nginx-group

$ gcloud compute target-pools delete nginx-pool

$ gcloud compute instance-templates delete nginx-template

$ gcloud compute instances delete nginx

$ gcloud compute instances delete myinstance

$ gcloud compute firewall-rules delete allow-80

Każde z powyższych poleceń powinno wyświetlić prośbę o potwierdzenie usunięcia zasobu.

11. Co dalej?

Gratulacje! Udało Ci się ukończyć to ćwiczenie z Compute Engine.

Więcej funkcji Compute Engine

Google Compute Engine ma wiele funkcji. Możesz zapoznać się z tymi artykułami :

Google Kubernetes Engine

Google Kubernetes Engine (GKE) to hostowana i w pełni zarządzana usługa Kubernetes w Google Cloud. Dostępnych jest kilka ćwiczeń z programowania, które pomogą Ci rozpocząć pracę z GKE. Na początek polecamy ten :

Prześlij nam swoją opinię

  • Poświęć chwilę na wypełnienie naszej krótkiej ankiety.