1. Cele
Skaffold to narzędzie, które obsługuje przepływ pracy podczas kompilowania, przesyłania i wdrażania aplikacji. Za pomocą Skaffold możesz łatwo skonfigurować lokalny obszar roboczy programowania, usprawnić wewnętrzną pętlę programowania, a także zintegrować swoje narzędzia z innymi narzędziami, takimi jak Kustomize i Helm, które ułatwiają zarządzanie plikami manifestu Kubernetes.
W tym samouczku poznasz podstawowe pojęcia związane ze Skaffold, użyjesz go do automatyzacji wewnętrznej pętli programisty, a następnie wdrożysz aplikację.
W ramach ćwiczenia:
- Konfigurowanie i włączanie Skaffolda na potrzeby lokalnego środowiska programistycznego
- Tworzenie i uruchamianie prostej aplikacji golang
- Zarządzanie wdrażaniem aplikacji lokalnych za pomocą Skaffold
- Wyrenderuj pliki manifestu i wdróż aplikację
2. Zanim rozpoczniesz
Przygotowuję obszar roboczy
- Otwórz edytor Cloud Shell, klikając ten adres URL:
https://shell.cloud.google.com
Zezwalaj na pliki cookie innych firm. Kliknij „Strona nie działa” i następnie „Zezwalaj na pliki cookie”.
- Jeśli jeszcze tego nie zrobiono, w oknie terminala sklonuj źródło aplikacji za pomocą tego polecenia:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- Przejdź do katalogu sklonowanego repozytorium:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
- Aby ustawić obszar roboczy Cloud Shell jako bieżący katalog, uruchom to polecenie:
cloudshell workspace .
Przygotowuję projekt
- Sprawdź, czy Twój projekt Google Cloud jest prawidłowo skonfigurowany, uruchamiając to polecenie:
gcloud config set project {{project-id}}
3. Pierwsze kroki z Skaffold
- Aby utworzyć plik konfiguracji Skaffold najwyższego poziomu (
skaffold.yaml
), uruchom to polecenie:
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
name: getting-started-kustomize
build:
tagPolicy:
gitCommit:
ignoreChanges: true
artifacts:
- image: skaffold-kustomize
context: app
docker:
dockerfile: Dockerfile
deploy:
kustomize:
paths:
- overlays/dev
profiles:
- name: staging
deploy:
kustomize:
paths:
- overlays/staging
- name: prod
deploy:
kustomize:
paths:
- overlays/prod
EOF
- Otwórz plik
skaffold.yaml
w panelu IDE. Jest to plik konfiguracji najwyższego poziomu, który definiuje potok Skaffold.
Zwróć uwagę na format YAML podobny do Kubernetes i następujące sekcje pliku YAML:
build
deploy
profiles
Te sekcje określają sposób kompilacji i wdrażania aplikacji oraz profile dla każdego celu wdrożenia.
Pełną listę etapów Skaffold znajdziesz w dokumentacji dotyczącej etapów przepływu Skaffold.
4. Kompilacja
Sekcja build
zawiera konfigurację, która określa sposób kompilacji aplikacji. W takim przypadku możesz zobaczyć konfigurację obsługi tagów git
oraz sekcję artifacts
definiującą obrazy kontenerów tworzące aplikację.
W tej sekcji znajdziesz też odniesienie do Dockerfile
, które służy do tworzenia obrazów. Skaffold dodatkowo obsługuje inne narzędzia do kompilacji, takie jak Jib
, Maven
, Gradle
, natywne Buildpacks
czy Bazel
, a także skrypty niestandardowe. Więcej informacji o tej konfiguracji znajdziesz w dokumentacji Skaffold Build.
5. Wdróż
Sekcja deploy
zawiera konfigurację określającą sposób wdrażania aplikacji. W tym przypadku możesz zobaczyć przykład wdrożenia domyślnego, który konfiguruje Skaffold do używania narzędzia Kustomize
.
Narzędzie Kustomize
umożliwia generowanie plików manifestu Kubernetes poprzez połączenie zestawu plików YAML typowych komponentów (w katalogu base
) z co najmniej 1 „nakładką”, która zwykle odpowiada co najmniej 1 docelowi wdrożenia (dev, test, staging i production lub podobne).
W tym przykładzie możesz zobaczyć 2 nakładki dla 3 docelowych wersji: dev, staging i prod. Nakładka dev będzie używana podczas lokalnego tworzenia wersji, a nakładki staging i prod podczas wdrażania za pomocą Skaffold.
6. Profile
Sekcja profiles
zawiera konfigurację, która definiuje kompilację, testy i wdrażanie w różnych kontekstach. Różne konteksty to zwykle różne środowiska w systemie wdrażania aplikacji, takie jak staging
lub prod
w tym przykładzie. Oznacza to, że możesz łatwo zarządzać plikami manifestu, których zawartość musi się różnić w zależności od środowisk docelowych, bez konieczności powtarzania powtarzalnej konfiguracji.
Konfiguracja w sekcji profiles
może zastąpić lub zaktualizować dowolne elementy z konfiguracji głównej (np. sekcje build
, test
lub deploy
).
Na przykład otwórz plik overlays > prod > deployment.yaml
. Zwróć uwagę, że liczba replik aplikacji jest ustawiona na 3, co zastępuje konfigurację podstawową.
poruszać się po kodzie źródłowym aplikacji,
- Otwórz plik
app > main.go
w oknie IDE. To jest prosta aplikacja golang, która zapisuje ciąg znaków w funkcjistdout
co sekundę. - Zwróć uwagę, że aplikacja wyświetla też nazwę poda Kubernetes, w którym została uruchomiona.
Wyświetlanie pliku Dockerfile
- Otwórz plik
app > Dockerfile
w panelu IDE. Ten plik zawiera sekwencję dyrektyw służących do kompilowania obrazu kontenera aplikacji dla plikumain.go
. Odwołuje się do niego plikskaffold.yaml
najwyższego poziomu.
7. Tworzenie za pomocą Skaffold
Konfigurowanie środowiska Kubernetes
- Aby sprawdzić, czy lokalny klaster Kubernetes działa i jest skonfigurowany, uruchom to polecenie:
minikube start
Może to potrwać kilka minut. Jeśli klaster został uruchomiony, powinieneś zobaczyć taki komunikat:
Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
- Uruchom to polecenie, aby utworzyć przestrzenie nazw Kubernetes dla
dev
,staging
iprod
:
kubectl apply -f namespaces.yaml
Powinny się wyświetlić te dane wyjściowe:
namespace/dev created namespace/staging created namespace/prod created
Korzystanie ze Skaffold na potrzeby programowania lokalnego
- Uruchom to polecenie, aby utworzyć aplikację i wdrożyć ją w lokalnym klastrze Kubernetes w Cloud Shell:
skaffold dev
Powinien rozpocząć się proces kompilacji kontenera aplikacji, który może potrwać minutę, a potem dane wyjściowe aplikacji powinny powtarzać się co sekundę:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx
Pamiętaj, że dokładna nazwa podgrupy będzie się różnić od podanych powyżej ogólnych wyników.
Wprowadzanie zmian w aplikacji
Aplikacja działa już w lokalnym klastrze Kubernetes, więc możesz wprowadzić zmiany w kodzie. Skaffold automatycznie ponownie skompiluje i wdroży aplikację w klastrze.
- Otwórz plik
app > main.go
w panelu IDE i zmień ciąg wyjściowy:
"Hello world from pod %s!\n"
do:
"Hello Skaffold world from pod %s!\n"
Po wprowadzeniu zmiany Skaffold powinien ponownie utworzyć obraz i wdrożyć go na klastrze. Zmiana w wyjściu powinna być widoczna w oknie terminala.
- Teraz w pliku „app > main.go” w panelu IDE zmień wiersz:
time.Sleep(time.Second * 1)
to
time.Sleep(time.Second * 10)
Powinna się ponownie skompilować i wdrożyć aplikacja, a wiersz wyjściowy powinien pojawiać się co 10 sekund.
Wprowadzanie zmian w konfiguracji Kubernetes
Następnie wprowadzisz zmianę w konfiguracji Kubernetes, a kolejna Skaffold zostanie automatycznie wdrożona ponownie.
- Otwórz plik
base > deployment.yaml
w IDE i zmień wiersz:
replicas: 1
to
replicas: 2
Po ponownym wdrożeniu aplikacji powinny działać 2 pody – każdy z inną nazwą.
- Teraz zmień ten sam wiersz w pliku
base > deployment.yaml
na:
replicas: 1
Jeden z podów powinien być usunięty z usługi, aby pozostał tylko jeden.
- Na koniec naciśnij
Ctrl-C
w oknie terminala, aby zatrzymać lokalny proces programowania Skaffold.
Tworzenie wersji
Następnie utwórz wersję, budując obraz wersji i wdrażając go w klastrze.
- Aby utworzyć wersję, uruchom to polecenie:
skaffold build --file-output artifacts.json
To polecenie skompiluje ostateczny obraz (jeśli to konieczne) i wyśle szczegóły wersji do pliku artifacts.json
.
Jeśli do wdrożenia w klastrach chcesz użyć narzędzia takiego jak Cloud Deploy, ten plik zawiera informacje o wersji. Oznacza to, że artefaktów nie można zmienić na drodze do życia.
- Aby wyświetlić zawartość pliku
artifacts.json
, uruchom to polecenie:
cat artifacts.json | jq
Pamiętaj, że plik zawiera odwołanie do obrazu, który zostanie użyty w ostatecznym wdrożeniu.
Wdrażanie w środowisku testowym
- Aby wdrożyć wersję za pomocą profilu
staging
, uruchom to polecenie:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail
Po zakończeniu wdrażania powinny pojawić się dane wyjściowe z 2 modułów podobne do tych:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
- Aby zatrzymać wyświetlanie danych wyjściowych Skaffold, naciśnij Ctrl+C w oknie terminala.
- Aby sprawdzić, czy aplikacja działa w klastrze, uruchom to polecenie:
kubectl get all --namespace staging
Powinny się pojawić 2 różne nazwy podów, ponieważ profil staging
aplikacji określa, że w wdrożeniu powinny być 2 repliki.
Wdrażanie w gałęzi produkcyjnej
- Aby wdrożyć wersję za pomocą profilu
prod
, uruchom to polecenie:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail
Po zakończeniu wdrażania powinny pojawić się dane wyjściowe z 3 modułów podobne do tych:
[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
- Naciśnij Ctrl+C w oknie terminala, aby zatrzymać dane wyjściowe Skaffold.
Powinny być widoczne 3 różne nazwy podów, ponieważ w profilu prod
aplikacji powinny istnieć 3 repliki we wdrożeniu.
- Aby sprawdzić, czy aplikacja działa w klastrze, uruchom to polecenie:
kubectl get all --namespace prod
Powinny się wyświetlić dane wyjściowe zawierające wiersze podobne do tych, które pokazują wdrożenie produkcyjne:
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/skaffold-kustomize-prod 3/3 3 3 16m
Powinny być też uruchomione 3 pody aplikacji.
NAME READY STATUS RESTARTS AGE pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx 1/1 Running 0 10m pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx 1/1 Running 0 10m pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx 1/1 Running 0 10m
8. Gratulacje!
Gratulacje! Ukończyłeś/ukończyłaś moduł laboratoryjny Understanding Skaffold
i wiesz, jak skonfigurować Skaffold i używać go do lokalnego programowania i wdrażania aplikacji.
Co dalej:
Dowiedz się więcej o Skaffold:
Czyszczenie
- Uruchom to polecenie, aby wyłączyć klaster lokalny:
minikube delete