1. Przegląd
W tym module dowiesz się, jak skonfigurować potok trybu ciągłego dostarczania dla GKE za pomocą Cloud Build. W tym module pokazujemy, jak wywoływać zadania Cloud Build w przypadku różnych zdarzeń Git, a także prosty wzorzec automatycznych wydań kanaryjnych w GKE.
Wykonaj te czynności:
- Tworzenie aplikacji GKE
- Automatyzacja wdrażania w przypadku gałęzi Git
- Automatyzacja wdrożeń w przypadku głównej gałęzi Git
- Automatyzacja wdrożeń w przypadku tagów Git
2. Zanim zaczniesz
Aby skorzystać z tego przewodnika, musisz mieć projekt Google Cloud. Możesz utworzyć nowy projekt lub wybrać już utworzony:
- Wybierz lub utwórz projekt Google Cloud.
- Włącz płatności w projekcie.
3. Przygotowywanie środowiska
- Utwórz zmienne środowiskowe, których będziesz używać w tym samouczku:
export PROJECT_ID=$(gcloud config get-value project) export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') export ZONE=us-central1-b export CLUSTER=gke-progression-cluster export APP_NAME=myapp - Włącz te interfejsy API:
- Menedżer zasobów
- GKE
- Cloud Source Repositories
- Cloud Build
- Container Registry
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ sourcerepo.googleapis.com \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ --async - Sklonuj przykładowe źródło i przejdź do katalogu modułu:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression cd gke-progression/labs/gke-progression rm -rf ../../.git - Zastąp wartości zmiennych w przykładowym repozytorium swoimi wartościami
PROJECT_ID: w tym kroku utworzysz instancje różnych plików konfiguracyjnych, które są unikalne dla Twojego bieżącego środowiska. Aby sprawdzić przykład aktualizowanych szablonów, uruchom to polecenie: Wykonaj podstawienie zmiennych, uruchamiając to polecenie.cat k8s/deployments/dev/frontend-dev.yaml.tmpl Aby sprawdzić, jak wygląda plik po zastąpieniu, uruchom to polecenie.for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; donecat k8s/deployments/dev/frontend-dev.yaml - Jeśli nie używasz jeszcze Git w Cloud Shell, ustaw wartości
user.nameiuser.email, których chcesz używać:git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_USERNAME" - Przechowuj kod z przykładowego repozytorium w Cloud Source Repositories:
gcloud source repos create gke-progression git init git config credential.helper gcloud.sh git remote add gcp https://source.developers.google.com/p/$PROJECT_ID/r/gke-progression git branch -m main git add . && git commit -m "initial commit" git push gcp main - Utwórz klaster GKE.
gcloud container clusters create ${CLUSTER} \ --project=${PROJECT_ID} \ --zone=${ZONE} - Przyznaj Cloud Build uprawnienia do klastra.Cloud Build będzie wdrażać aplikację w klastrze GKE i potrzebuje do tego uprawnień.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
Środowisko jest gotowe.
4. Tworzenie aplikacji GKE
W tej sekcji skompilujesz i wdrożysz początkową aplikację produkcyjną, której będziesz używać w tym samouczku.
- Skompiluj aplikację za pomocą Cloud Build:
gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/ - Ręczne wdrażanie w środowiskach Canary i produkcyjnych:utwórz wdrożenia i usługi produkcyjne oraz Canary za pomocą poleceń
kubectl apply. Usługa wdrożona w tym miejscu będzie kierować ruch zarówno do wdrożenia do wczesnych testów, jak i do wdrożenia w środowisku produkcyjnym.kubectl create ns production kubectl apply -f k8s/deployments/prod -n production kubectl apply -f k8s/deployments/canary -n production kubectl apply -f k8s/services -n production - Sprawdź liczbę uruchomionych podów. Upewnij się, że masz 4 uruchomione pody frontendu, w tym 3 do obsługi ruchu produkcyjnego i 1 do wersji testowych. Oznacza to, że zmiany w wersji do wczesnych testów będą miały wpływ tylko na 1 z 4 użytkowników (25%).
kubectl get pods -n production -l app=$APP_NAME -l role=frontend - Pobierz zewnętrzny adres IP usług produkcyjnych.
Gdy system równoważenia obciążenia zwróci adres IP, przejdź do następnego kroku.kubectl get service $APP_NAME -n production - Zapisz zewnętrzny adres IP do późniejszego użycia.
export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services $APP_NAME) - Sprawdź aplikację. Sprawdź dane wyjściowe wersji usługi. Powinien brzmieć „Hello World v1.0”.
curl http://$PRODUCTION_IP
Gratulacje! Przykładowa aplikacja została wdrożona. Następnie skonfigurujesz aktywatory, które będą ciągle wdrażać zmiany.
5. Automatyzacja wdrażania w przypadku gałęzi Git
W tej sekcji skonfigurujesz wyzwalacz, który będzie wykonywać zadanie Cloud Build po zatwierdzeniu zmian w dowolnej gałęzi innej niż main. Użyty tutaj plik Cloud Build automatycznie utworzy przestrzeń nazw i wdrożenie dla wszystkich istniejących i nowych gałęzi, co umożliwi programistom wyświetlanie podglądu kodu przed integracją z gałęzią główną.
- Skonfiguruj regułę:kluczowym elementem tej reguły jest użycie parametru
branchNamedo dopasowaniamainoraz parametruinvertRegex, który jest ustawiony na wartość „true” (prawda) i zmienia wzorzecbranchName, aby dopasować wszystko, co nie jestmain. Wbuild/branch-trigger.jsonznajdziesz te wiersze. Dodatkowo kilka ostatnich wierszy pliku Cloud Build używanego z tym aktywatorem tworzy przestrzeń nazw o nazwie gałęzi, która wywołała zadanie, a następnie wdraża aplikację i usługę w nowej przestrzeni nazw. W"branchName": "main", "invertRegex": true
build/branch-cloudbuild.yamlznajdziesz te wiersze: Teraz, gdy znasz już używane mechanizmy, utwórz aktywator za pomocą polecenia gcloud poniżej.kubectl get ns ${BRANCH_NAME} || kubectl create ns ${BRANCH_NAME} kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/deployments/dev kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/servicesgcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/branch-trigger.json - Aby sprawdzić aktywator, otwórz stronę Aktywatory Cloud Build w konsoli.Otwórz Aktywatory
- Tworzenie nowej gałęzi:
git checkout -b new-feature-1 - Zmodyfikuj kod, aby wskazywał wersję 1.1.Edytuj
src/app.pyi zmień odpowiedź z 1.0 na 1.1.@app.route('/') def hello_world(): return 'Hello World v1.1' - Zatwierdź zmianę i wypchnij ją do repozytorium zdalnego:
git add . && git commit -m "updated" && git push gcp new-feature-1 - Aby sprawdzić postęp kompilacji, otwórz stronę Historia Cloud Build w konsoli.Otwórz KompilacjePo zakończeniu kompilacji przejdź do następnego kroku.
- Pobierz zewnętrzny adres IP nowo wdrożonej usługi gałęzi.
Gdy system równoważenia obciążenia zwróci adres IP, przejdź do następnego kroku.kubectl get service $APP_NAME -n new-feature-1 - Zapisz zewnętrzny adres IP do późniejszego użycia.
export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=new-feature-1 services $APP_NAME) - Sprawdź aplikację. Sprawdź dane wyjściowe wersji usługi. Powinien brzmieć „Hello World v1.0”.
curl http://$BRANCH_IP
6. Automatyzacja wdrażania w przypadku głównej gałęzi Git
Zanim kod zostanie udostępniony w środowisku produkcyjnym, często jest on udostępniany niewielkiej części ruchu na żywo, a dopiero potem cały ruch jest przenoszony do nowej bazy kodu.
W tej sekcji zaimplementujesz aktywator, który jest aktywowany, gdy kod zostanie zatwierdzony w gałęzi głównej. Wywołanie wdraża wdrożenie do wczesnych testów, które otrzymuje 25% całego aktualnego natężenia ruchu do nowej wersji.
- Skonfiguruj aktywator dla głównej gałęzi:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json - Aby sprawdzić nowy aktywator, otwórz stronę Aktywatory Cloud Build w konsoli.Otwórz Aktywatory
- Scal gałąź z linią główną i wypchnij do repozytorium zdalnego:
git checkout main git merge new-feature-1 git push gcp main - Aby sprawdzić postęp kompilacji, otwórz stronę Historia Cloud Build w konsoli.Kliknij KompilacjePo zakończeniu kompilacji przejdź do następnego kroku.
- Sprawdź wiele odpowiedzi z serwera. Uruchom to polecenie i zwróć uwagę, że około 25% odpowiedzi zawiera nową odpowiedź Hello World w wersji 1.1.
Gdy wszystko będzie gotowe, naciśnijwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+c, aby wyjść z pętli.
7. Automatyzowanie wdrożeń w przypadku tagów Git
Po sprawdzeniu wdrożenia do wczesnych testów na niewielkiej części aktualnego natężenia ruchu wdrażasz je na pozostałej części aktualnego natężenia ruchu.
W tej sekcji skonfigurujesz aktywator, który uruchamia się, gdy utworzysz tag w repozytorium. Wywołanie oznacza obraz odpowiednim tagiem, a następnie wdraża aktualizacje w środowisku produkcyjnym, zapewniając, że 100% ruchu uzyskuje dostęp do otagowanego obrazu.
- Skonfiguruj regułę uruchamiającą tag:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/tag-trigger.json - Aby sprawdzić nowy aktywator, otwórz stronę Aktywatory Cloud Build w konsoli.Otwórz Aktywatory
- Utwórz nowy tag i wypchnij go do repozytorium zdalnego:
git tag 1.1 git push gcp 1.1 - Aby sprawdzić postęp kompilacji, otwórz stronę Historia Cloud Build w konsoli.Otwórz kompilacje
- Sprawdź wiele odpowiedzi z serwera. Uruchom to polecenie i zwróć uwagę, że 100% odpowiedzi zawiera nową odpowiedź Hello World w wersji 1.1. Może to chwilę potrwać, ponieważ nowe pody są wdrażane i sprawdzane w GKE.
Gdy wszystko będzie gotowe, naciśnijwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+c, aby wyjść z pętli.Gratulacje! W Cloud Build utworzono aktywatory CI/CD dla gałęzi i tagów, aby wdrażać aplikacje w GKE.
8. Czyszczenie
Usuwanie projektu
- W Cloud Console otwórz stronę Zarządzanie zasobami.
- Z listy projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
- W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.