
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 , 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 , 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, 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 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ó , 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ï (). Això us permet utilitzar qualsevol col·lector que es pugui cridar mitjançant un script;
- En l'etapa de prova, el ja esmentat ;
- 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):

Com és l'obra de Skaffold en termes generals?
- 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.
- La imatge muntada es verifica mitjançant container-structure-test, s'etiqueta i s'envia al registre Docker.
- Després d'això, la imatge es desplega - es desplega al clúster de Kubernetes.
- 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.

Il·lustració de les principals etapes del funcionament del Skaffold
Pràctica. Provant Skaffold
Per demostrar l'ús de Skaffold, prendré un exemple de . A propòsit, 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.1Clonem el dipòsit de Skaffold amb els exemples necessaris:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesVaig 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 filesleeroy-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
buildespecifiquem 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.1MBCom 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 portskubectl 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 nomleeroy-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:

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 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 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 tal 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 — 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
