Revisió de Skaffold per al desenvolupament de Kubernetes

Revisió de Skaffold per al desenvolupament de Kubernetes

Fa un any i mig, el 5 de març de 2018, Google va llançar la primera versió alfa del seu projecte de codi obert per a CI/CD anomenat Bastida, l'objectiu del qual era crear un "desenvolupament Kubernetes senzill i repetible" perquè els desenvolupadors poguessin centrar-se en el desenvolupament més que en l'administració. Què pot ser interessant de Skaffold? Com a resultat, té alguns trucs a la màniga que poden convertir-lo en una eina poderosa per al desenvolupador, i potser fins i tot per a l'enginyer d'operacions. Coneixem el projecte i les seves capacitats.

NB: Per cert, ja hem parlat breument de Skaffold al nostre general revisió de les eines de desenvolupament, les vides del qual estan connectades amb Kubernetes.

Teoria. Propòsit i capacitats

Així, en termes generals, Skaffold soluciona el problema d'automatitzar el cicle CI/CD (en les etapes de creació, impuls i desplegament), oferint al desenvolupador comentaris ràpids, és a dir. la capacitat de rebre ràpidament el resultat dels canvis de codi posteriors, en forma d'una aplicació actualitzada que s'executa al clúster de Kubernetes. I pot funcionar en diferents circuits (dev, stage, production...), per als quals Skaffold ajuda a descriure els pipelines corresponents per al desplegament.

El codi font de Skaffold està escrit a Go, Distribuït per sota la llicència gratuïta d'Apache 2.0 (GitHub).

Vegem les principals funcions i característiques. Els primers inclouen els següents:

  • Skaffold ofereix eines per crear canalitzacions CI/CD.
  • Us permet supervisar els canvis en el codi font en segon pla i executar un procés automatitzat d'acoblament de codi en imatges de contenidors, publicant aquestes imatges al registre Docker i desplegant-les al clúster de Kubernetes.
  • Sincronitza els fitxers del dipòsit amb el directori de treball del contenidor.
  • Proves automàticament mitjançant container-structure-test.
  • Ports d'enviament.
  • Llegeix els registres d'una aplicació que s'executa en un contenidor.
  • Ajuda a depurar aplicacions escrites en Java, Node.js, Python, Go.

Ara sobre les característiques:

  • Skaffold en si no té components del clúster. És a dir, no cal configurar encara més Kubernetes per utilitzar aquesta utilitat.
  • Diferents canonades per a la vostra aplicació. Necessites desplegar el codi al Minikube local mentre esteu desenvolupant i després posar-lo en escena o en producció? Amb aquesta finalitat n'hi ha perfils i configuracions d'usuari, variables d'entorn i senyaladors, que us permeten descriure diferents canalitzacions per a una aplicació.
  • CLI. Només utilitat de consola i configuracions a YAML. A Internet podeu trobar referències a intents de creació GUI experimental, però, de moment això probablement només vol dir que algú el necessita, però no realment.
  • Modularitat. Skaffold no és una recol·lectora autònoma, sinó que pretén utilitzar mòduls individuals o solucions existents per a tasques específiques.

Il·lustració d'aquest últim:

  • En l'etapa de muntatge podeu utilitzar:
    • Docker build localment, en un clúster amb kaniko o a Google Cloud Build;
    • Bazel localment;
    • Jib Maven i Jib Gradle localment o a Google Cloud Build;
    • els scripts de creació personalitzats s'executen localment. Si necessiteu executar una altra solució de compilació (més flexible/coneguda/...), es descriu a l'script perquè Skaffold l'iniciï (exemple de la documentació). Això us permet utilitzar qualsevol col·lector que es pugui cridar mitjançant un script;
  • En l'etapa de prova, el ja esmentat prova-estructura-contenidor;
  • Per al desplegament es proporcionen els següents:
    • Kubectl;
    • Timó;
    • personalitzar.

Gràcies a això, Skaffold es pot anomenar únic marc per construir CI/CD. Aquí teniu un exemple de flux de treball quan l'utilitzeu (de la documentació del projecte):

Revisió de Skaffold per al desenvolupament de Kubernetes

Com és l'obra de Skaffold en termes generals?

  1. La utilitat supervisa els canvis al directori del codi font. Si es fan modificacions als fitxers, es sincronitzen amb el pod d'aplicació al clúster de Kubernetes. Si és possible, sense tornar a muntar la imatge. En cas contrari, s'assembla una nova imatge.
  2. La imatge muntada es verifica mitjançant container-structure-test, s'etiqueta i s'envia al registre Docker.
  3. Després d'això, la imatge es desplega - es desplega al clúster de Kubernetes.
  4. Si el llançament s'ha inicialitzat amb l'ordre skaffold dev, llavors comencem a rebre registres de l'aplicació i Skaffold espera que els canvis tornin a repetir totes les accions.

Revisió de Skaffold per al desenvolupament de Kubernetes
Il·lustració de les principals etapes del funcionament del Skaffold

Pràctica. Provant Skaffold

Per demostrar l'ús de Skaffold, prendré un exemple de Repositori del projecte GitHub. A propòsit, allà Podeu trobar molts altres exemples que tinguin en compte diverses especificitats. Realitzaré totes les accions localment a Minikube. La instal·lació és senzilla i triga uns quants minuts, i necessitareu kubectl per començar.

Instal·leu 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

Clonem el dipòsit de Skaffold amb els exemples necessaris:

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

Vaig triar un exemple amb dues beines, cadascuna conté una petita aplicació Go. Una aplicació és la interfície (leeroy-web), que redirigeix ​​la sol·licitud a la segona aplicació: el backend (leeroy-app). Vegem com es veu:

~/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 contenen codi Go i fitxers Dockerfiles senzills per crear aquest codi localment:

~/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 .

No donaré el codi de l'aplicació; n'hi ha prou amb saber-ho leeroy-web accepta sol·licituds i les envia leeroy-app. Per tant als fitxers Deployment.yaml hi ha un servei només per app (per a l'encaminament intern). Port de pod web l'enviarem a nosaltres mateixos per accedir ràpidament a l'aplicació.

Sembla que 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

Totes les etapes esmentades anteriorment es descriuen aquí. A més d'aquesta configuració, també hi ha un fitxer amb la configuració global: ~/.skaffold/config. Es pot editar manualment o mitjançant la CLI, per exemple, així:

skaffold config set --global local-cluster true

Aquesta ordre establirà la variable global local-cluster en sentit true, després del qual Skaffold no intentarà enviar imatges al registre remot. Si esteu desenvolupant localment, podeu utilitzar aquesta ordre per crear imatges localment.

Tornar skaffold.yaml:

  • A l'escenari build especifiquem que cal recollir i desar la imatge localment. Després que la construcció s'executi per primera vegada, veurem el següent:
    // т.к. 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

    Com podeu veure, Skaffold va etiquetar les imatges ell mateix. Per cert, s'admeten diverses polítiques d'etiquetatge.

  • Més endavant a la configuració s'indica context: ./leeroy-app/, és a dir s'especifica el context en què es recull la imatge.
  • En l'etapa de desplegament, es determina que utilitzarem kubectl i una màscara per als manifests necessaris.
  • PortForward: semblant a com normalment fem servir els ports kubectl port-forward, donem instruccions a Skaffold perquè cridi aquesta ordre. En aquest cas, el port local 9000 es reenvia al 8080 a Deployment amb el nom leeroy-web.

És hora de llançar-se skaffold dev: l'equip crearà un "bucle de retroalimentació" en curs, és a dir. no només recopilarà tot i el desplegarà al clúster, sinó que també us informarà sobre l'estat dels pods en aquest moment, supervisarà els canvis i actualitzarà l'estat dels pods.

Aquí teniu el resultat del llançament skaffold dev --port-forward en tornar a muntar:

Revisió de Skaffold per al desenvolupament de Kubernetes

Primer, podeu veure que la memòria cau s'està utilitzant. A continuació, l'aplicació es munta, es desplega i es reenvien els ports. Des que s'especifica --port-forward, Skaffold va reenviar el port a web, com li van demanar, però aquí app tirava al seu criteri (escollia el lliure més proper). Després d'això, rebem els primers registres de les aplicacions.

Comprovem si funciona?

~/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!!!

Modificació del fitxer leeroy-app/app.go - Passen uns segons... 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!!!

Al mateix temps, el mateix Skaffold mostrava el mateix a la consola que abans, amb l'excepció d'un punt: només es va desplegar leeroy-app, i no tots alhora.

Més pràctica

També val la pena esmentar que quan es crea un projecte nou, les configuracions per a Skaffold es poden arrencar mitjançant l'ordre init, que és molt convenient. A més, podeu escriure diverses configuracions: dur a terme el desenvolupament de la configuració predeterminada i, a continuació, llançar-la a l'etapa amb l'ordre run (mateix procés que dev, simplement no supervisa els canvis), utilitzant una configuració diferent.

A la katacoda hi ha lideratge Amb un exemple és encara més fàcil. Però ofereix una caixa de sorra preparada amb Kubernetes, una aplicació i Skaffold. Una opció fantàstica si esteu interessats a provar les bases.

Un possible cas d'ús per a Skaffold és dur a terme el desenvolupament en un clúster remot. No tothom se sent còmode executant Minikube amb el seu propi maquinari, després desplegar l'aplicació i esperar que funcioni adequadament... En aquest cas, Skaffold resol el problema a la perfecció, cosa que es pot confirmar, per exemple, pels enginyers de Reddit, com hem fet. ja comentat писали al nostre blog.

I en aquesta publicació a Weaveworks podeu trobar un exemple de creació d'un pipeline per a la producció.

Conclusió

Skaffold és una eina convenient per crear canalitzacions que impliquen desplegar aplicacions a Kubernetes i se centren principalment en les necessitats de desenvolupament. Fa que sigui bastant fàcil crear un pipeline "curt" que tingui en compte les necessitats bàsiques del desenvolupador, però si ho desitja, podeu organitzar processos més grans. Com un dels exemples clars de l'ús de Skaffold en processos CI/CD és donat tal projecte de prova de 10 microserveis utilitzant les capacitats de Kubernetes, gRPC, Istio i OpenCensus Tracing.

Skaffold ja té gairebé 8000 estrelles a GitHub, està desenvolupat per Google i forma part de GoogleContainerTools — en general, de moment hi ha moltes raons per creure que el projecte es desenvoluparà feliç per sempre.

PS

Llegeix també al nostre blog:

Font: www.habr.com

Compreu allotjament fiable per a llocs amb protecció DDoS, servidors VPS VDS 🔥 Compra allotjament web fiable amb protecció DDoS, servidors VPS VDS | ProHoster