Recenzja Skaffold pod kątem rozwoju Kubernetes

Recenzja Skaffold pod kątem rozwoju Kubernetes

Półtora roku temu, 5 marca 2018 roku, Google udostępniło pierwszą wersję alfa swojego projektu Open Source dla CI/CD o nazwie Rusztowanie, którego celem było stworzenie „prostego i powtarzalnego rozwoju Kubernetesa”, tak aby programiści mogli skupić się na rozwoju, a nie na administracji. Co może być interesującego w Skaffold? Jak się okazuje, ma kilka asów w zanadrzu, dzięki którym może stać się potężnym narzędziem dla programisty, a może nawet inżyniera operacyjnego. Zapoznajmy się z projektem i jego możliwościami.

NB: Swoją drogą, już krótko rozmawialiśmy o Skaffold w naszym generale przegląd narzędzi programistycznych, których życie jest związane z Kubernetesem.

Teoria. Cel i możliwości

Ogólnie rzecz biorąc, Skaffold rozwiązuje problem automatyzacji cyklu CI/CD (na etapach budowania, wypychania, wdrażania), oferując programiście szybką informację zwrotną, tj. możliwość szybkiego otrzymania wyniku kolejnych zmian w kodzie – w postaci zaktualizowanej aplikacji działającej w klastrze Kubernetes. Może także działać w różnych obwodach (programowanie, etap, produkcja...), dla których Skaffold pomaga opisać odpowiednie rurociągi do wdrożenia.

Kod źródłowy Skaffold jest napisany w Go, dystrybuowane przez na bezpłatnej licencji Apache 2.0 (GitHub).

Spójrzmy na główne funkcje i cechy. Do pierwszych należą:

  • Skaffold oferuje narzędzia do tworzenia potoków CI/CD.
  • Umożliwia monitorowanie zmian w kodzie źródłowym w tle i uruchamianie zautomatyzowanego procesu składania kodu w obrazy kontenerów, publikowania tych obrazów w Docker Registry i wdrażania ich w klastrze Kubernetes.
  • Synchronizuje pliki w repozytorium z katalogiem roboczym w kontenerze.
  • Automatycznie testuje za pomocą testu struktury kontenera.
  • Przekierowuje porty.
  • Odczytuje dzienniki aplikacji działającej w kontenerze.
  • Pomaga w debugowaniu aplikacji napisanych w Java, Node.js, Python, Go.

Teraz o funkcjach:

  • Sam Skffold nie ma komponentów po stronie klastra. Oznacza to, że nie ma potrzeby dalszej konfiguracji Kubernetesa, aby móc korzystać z tego narzędzia.
  • Różne potoki dla Twojej aplikacji. Czy musisz wdrożyć kod do lokalnego Minikube podczas tworzenia, a następnie na scenę lub do produkcji? W tym celu istnieją profile oraz konfiguracje użytkowników, zmienne środowiskowe i flagi, które pozwalają opisywać różne potoki dla jednej aplikacji.
  • CLI. Tylko narzędzie konsoli i konfiguracje w YAML. W Internecie można znaleźć wzmianki o próbach tworzenia eksperymentalny interfejs graficznyjednak w tej chwili najprawdopodobniej oznacza to po prostu, że ktoś go potrzebuje, ale tak naprawdę nie.
  • Modułowość. Skaffold nie jest samodzielnym harwesterem, lecz stara się wykorzystywać pojedyncze moduły lub istniejące rozwiązania do konkretnych zadań.

Ilustracja tego ostatniego:

  • Na etapie montażu możesz zastosować:
    • budowanie dockera lokalnie, w klastrze przy użyciu kaniko lub w Google Cloud Build;
    • Bazel lokalnie;
    • Jib Maven i Jib Gradle lokalnie lub w Google Cloud Build;
    • niestandardowe skrypty kompilacji działają lokalnie. Jeśli chcesz uruchomić inne (bardziej elastyczne/znane/...) rozwiązanie do kompilacji, jest to opisane w skrypcie, dzięki czemu Skaffold je uruchomi (przykład z dokumentacji). Pozwala to na użycie dowolnego kolektora, który można wywołać za pomocą skryptu;
  • Na etapie testów wspomniane już test struktury kontenera;
  • Do wdrożenia udostępniane są:
    • Kubectl;
    • Hełm;
    • dostosować.

Dzięki temu Skaffold można nazwać wyjątkowym ramy budowania CI/CD. Oto przykładowy przebieg pracy podczas korzystania z niego (z dokumentacji projektu):

Recenzja Skaffold pod kątem rozwoju Kubernetes

Jak ogólnie wygląda praca Skaffolda?

  1. Narzędzie monitoruje zmiany w katalogu kodu źródłowego. Jeśli w plikach zostaną wprowadzone modyfikacje, zostaną one zsynchronizowane z aplikacją w klastrze Kubernetes. Jeśli to możliwe, bez ponownego składania obrazu. W przeciwnym razie tworzony jest nowy obraz.
  2. Złożony obraz jest sprawdzany za pomocą testu struktury kontenera, oznaczany i wysyłany do rejestru Docker.
  3. Następnie obraz jest wdrażany – wdrażany w klastrze Kubernetes.
  4. Jeśli uruchomienie zostało zainicjowane za pomocą polecenia skaffold dev, wówczas zaczynamy odbierać logi z aplikacji, a Skaffold czeka na zmiany, aby powtórzyć wszystkie czynności jeszcze raz.

Recenzja Skaffold pod kątem rozwoju Kubernetes
Ilustracja przedstawiająca główne etapy działania Skaffold

Ćwiczyć. Próbuję Skafolda

Aby zademonstrować użycie Skaffold, wezmę przykład z Repozytorium projektu GitHub. Przy okazji, w tym samym miejscu Można znaleźć wiele innych przykładów uwzględniających różną specyfikę. Wszystkie czynności wykonam lokalnie w Minikube. Instalacja jest prosta i zajmuje kilka minut, a do rozpoczęcia będziesz potrzebować kubectl.

Zainstaluj Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1

Sklonujmy repozytorium Skaffold z niezbędnymi przykładami:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

Wybrałem przykład z dwoma kapsułami, z których każdy zawiera jedną małą aplikację Go. Jedna aplikacja to frontend (leeroy-web), który przekierowuje żądanie do drugiej aplikacji – backendu (leeroy-app). Zobaczmy jak to wygląda:

~/skaffold/examples/microservices # tree
.
├── leeroy-app
│   ├── app.go
│   ├── Dockerfile
│   └── kubernetes
│       └── deployment.yaml
├── leeroy-web
│   ├── Dockerfile
│   ├── kubernetes
│   │   └── deployment.yaml
│   └── web.go
├── README.adoc
└── skaffold.yaml
 
4 directories, 8 files

leeroy-app i leeroy-web zawierają kod Go i proste pliki Dockerfile do lokalnego budowania tego kodu:

~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
 
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .

Nie będę podawać kodu aplikacji – wystarczy to wiedzieć leeroy-web akceptuje żądania i przekazuje je leeroy-app. Dlatego w plikach Deployment.yaml dostępna jest tylko usługa app (dla routingu wewnętrznego). Port kapsuły web przekażemy go sobie w celu szybkiego dostępu do aplikacji.

Jak to wygląda skaffold.yaml:

~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
    - image: leeroy-web
      context: ./leeroy-web/
    - image: leeroy-app
      context: ./leeroy-app/
deploy:
  kubectl:
    manifests:
      - ./leeroy-web/kubernetes/*
      - ./leeroy-app/kubernetes/*
portForward:
  - resourceType: deployment
    resourceName: leeroy-web
    port: 8080
    localPort: 9000

Wszystkie powyższe etapy zostały opisane tutaj. Oprócz tej konfiguracji znajduje się również plik z ustawieniami globalnymi - ~/.skaffold/config. Można go edytować ręcznie lub za pomocą interfejsu CLI - na przykład w ten sposób:

skaffold config set --global local-cluster true

To polecenie ustawi zmienną globalną local-cluster w znaczenie true, po czym Skaffold nie będzie już próbował przesyłać obrazów do zdalnego rejestru. Jeśli tworzysz lokalnie, możesz użyć tego polecenia do lokalnego tworzenia obrazów.

Wrócić do skaffold.yaml:

  • Na scenie build określamy, że musisz zebrać i zapisać obraz lokalnie. Po pierwszym uruchomieniu kompilacji zobaczymy:
    // т.к. Minikube создает кластер в отдельной виртуальной машине,
    // придется проникнуть внутрь, чтобы найти образы
    # minikube ssh
    $ docker images
    REPOSITORY                                TAG                                                                IMAGE ID            CREATED             SIZE 
    leeroy-app                                7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e   7d55a5080359        4 hours ago         13MB 
    leeroy-app                                v0.37.1-171-g0270a0c-dirty                                         7d55a5080359        4 hours ago         13MB
    leeroy-web                                5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681   5063bfb29d98        5 hours ago         13.1MB
    leeroy-web                                v0.37.1-171-g0270a0c-dirty                                         5063bfb29d98        5 hours ago         13.1MB

    Jak widać, Skaffold sam oznaczył zdjęcia. Nawiasem mówiąc, obsługiwanych jest kilka zasad tagowania.

  • W dalszej części konfiguracji jest to wskazane context: ./leeroy-app/, tj. określony jest kontekst, w jakim obraz jest gromadzony.
  • Na etapie wdrożenia ustala się, że do niezbędnych manifestów będziemy używać kubectl i maski.
  • PortForward: podobnie jak zwykle przekazujemy porty za pomocą kubectl port-forward, wydajemy polecenie Skaffoldowi, aby wywołał to polecenie. W tym przypadku port lokalny 9000 jest przekazywany do 8080 we wdrożeniu z nazwą leeroy-web.

Czas wystartować skaffold dev: Zespół utworzy ciągłą „pętlę informacji zwrotnej”, tj. nie tylko zbierze wszystko i wdroży w klastrze, ale także poinformuje Cię o aktualnym stanie podów, będzie monitorować zmiany i aktualizować stan podów.

Oto wynik uruchomienia skaffold dev --port-forward podczas ponownego montażu:

Recenzja Skaffold pod kątem rozwoju Kubernetes

Po pierwsze, widać, że pamięć podręczna jest używana. Następnie aplikacja jest składana, wdrażana, a porty przekazywane. Ponieważ określono --port-forward, Skaffold przekierował port do web, jak go proszono, ale tutaj app rzucił według własnego uznania (wybrał najbliższy wolny). Po tym otrzymujemy pierwsze logi z aplikacji.

Sprawdźmy, czy to działa?

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-6998dfcc95-2nxvf   1/1     Running   0          103s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!

Modyfikowanie pliku leeroy-app/app.go - mija kilka sekund... i:

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-ffd79d986-l6nwp    1/1     Running   0          11s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!

W tym samym czasie sam Skaffold wyświetlał w konsoli to samo, co poprzednio, z wyjątkiem jednego punktu: pojawił się tylko leeroy-appi nie wszystko na raz.

Więcej praktyki

Warto również wspomnieć, że podczas tworzenia nowego projektu konfiguracje dla Skaffold można załadować za pomocą polecenia init, co jest bardzo wygodne. Ponadto możesz napisać kilka konfiguracji: przeprowadź programowanie na domyślnej konfiguracji, a następnie wprowadź ją na scenę za pomocą polecenia run (ten sam proces co dev, po prostu nie monitoruje zmian), używając innej konfiguracji.

Na katacodzie jest руководство Na przykładzie jest jeszcze łatwiej. Ale oferuje gotowy sandbox z Kubernetesem, aplikacją i Skaffoldem. Świetna opcja, jeśli chcesz samodzielnie wypróbować podstawy.

Jednym z możliwych przypadków użycia Skaffold jest prowadzenie programowania w zdalnym klastrze. Nie każdy czuje się komfortowo uruchamiając Minikube na własnym sprzęcie, a następnie wdrażając aplikację i oczekując, że będzie poprawnie działać... W tym przypadku Skaffold rozwiązuje problem doskonale, co mogą potwierdzić np. inżynierowie Reddita, jak mamy już omówione napisał na naszym blogu.

Oraz w tę publikację z Weaveworks można znaleźć przykład tworzenia rurociągu do produkcji.

wniosek

Skaffold to wygodne narzędzie do budowania potoków, które obejmują wdrażanie aplikacji na Kubernetes i są skupione przede wszystkim na potrzebach programistycznych. Dzięki temu dość łatwo jest stworzyć „krótki” potok uwzględniający podstawowe potrzeby programisty, ale w razie potrzeby można zorganizować większe procesy. Jako jeden z wyraźnych przykładów wykorzystania Skaffold w procesach CI/CD jest podawany takie projekt testowy z 10 mikroserwisów wykorzystujących możliwości Kubernetes, gRPC, Istio i OpenCensus Tracing.

Skaffold ma już prawie 8000 gwiazdek na GitHubie, jest rozwijany przez Google i jest częścią Narzędzia GoogleContainerTools — ogólnie rzecz biorąc, w tej chwili są podstawy sądzić, że projekt będzie się rozwijać długo i szczęśliwie.

PS

Przeczytaj także na naszym blogu:

Źródło: www.habr.com

Dodaj komentarz