Pagrepaso sa Skaffold alang sa pagpalambo sa Kubernetes

Pagrepaso sa Skaffold alang sa pagpalambo sa Kubernetes

Usa ka tuig ug tunga ang milabay, kaniadtong Marso 5, 2018, gipagawas sa Google ang unang alpha nga bersyon sa Open Source nga proyekto niini alang sa CI/CD nga gitawag Skaffold, kansang tumong mao ang paghimo og "yano ug masubli nga pag-uswag sa Kubernetes" aron ang mga developers makatutok sa kalamboan imbes sa administrasyon. Unsa kaha ang makapainteres sa Skaffold? Ingon nga kini nahimo, kini adunay pipila ka mga limbong sa iyang manggas nga makahimo niini nga usa ka gamhanan nga himan alang sa developer, ug tingali bisan ang operations engineer. Atong masinati ang proyekto ug ang mga kapabilidad niini.

NB: By the way, nahisgotan na namo sa makadiyot ang bahin sa Skaffold sa among heneral pagsusi sa mga himan sa developer, kansang mga kinabuhi konektado sa Kubernetes.

Teorya. Katuyoan ug mga kapabilidad

Busa, sa kasagaran nga pagsulti, gisulbad sa Skaffold ang problema sa pag-automate sa siklo sa CI / CD (sa pagtukod, pagduso, pag-deploy nga mga yugto), nga nagtanyag sa developer nga dali nga feedback, i.e. ang abilidad nga dali nga makadawat sa resulta sa sunod nga mga pagbag-o sa code - sa porma sa usa ka updated nga aplikasyon nga nagdagan sa Kubernetes cluster. Ug mahimo kini nga molihok sa lainlaing mga sirkito (dev, entablado, produksiyon ...), diin ang Skaffold makatabang sa paghulagway sa katugbang nga mga linya sa tubo alang sa pag-rollout.

Ang source code ni Skaffold gisulat sa Go, giapod-apod sa ubos sa libre nga Apache License 2.0 (GitHub).

Atong tan-awon ang mga nag-unang gimbuhaton ug mga bahin. Ang una naglakip sa mosunod:

  • Ang Skaffold nagtanyag og mga himan para sa paghimo og CI/CD pipelines.
  • Gitugotan ka sa pag-monitor sa mga pagbag-o sa source code sa background ug pagpadagan sa usa ka awtomatiko nga proseso sa pag-assemble sa code ngadto sa mga imahen sa sulud, pagmantala niini nga mga imahe sa Docker Registry ug pag-deploy niini sa cluster sa Kubernetes.
  • Nag-synchronize sa mga file sa repository sa nagtrabaho nga direktoryo sa sudlanan.
  • Awtomatikong pagsulay gamit ang container-structure-test.
  • Mga pantalan sa unahan.
  • Nagbasa sa mga log sa usa ka aplikasyon nga nagdagan sa usa ka sudlanan.
  • Mga tabang sa pag-debug sa mga aplikasyon nga gisulat sa Java, Node.js, Python, Go.

Karon bahin sa mga bahin:

  • Ang Skaffold mismo walay mga bahin sa cluster-side. Sa ato pa, dili na kinahanglan pa nga i-configure ang Kubernetes aron magamit kini nga utility.
  • Lahi nga mga pipeline alang sa imong aplikasyon. Kinahanglan ba nimo nga i-roll out ang code sa lokal nga Minikube samtang nag-develop ka, ug dayon sa entablado o produksiyon? Alang niini nga katuyoan adunay mga profile ug mga pag-configure sa tiggamit, mga variable sa palibot ug mga bandila, nga nagtugot kanimo sa paghulagway sa lainlaing mga linya sa tubo alang sa usa ka aplikasyon.
  • CLI. Ang console utility ug configurations lang sa YAML. Sa Internet makit-an nimo ang mga pakisayran sa mga pagsulay sa paghimo eksperimento nga GUI, Apan, sa pagkakaron kini lagmit nagpasabot lang nga adunay nagkinahanglan kaniya, apan dili gayud.
  • Modularity. Ang Skaffold dili usa ka standalone harvester, apan naningkamot sa paggamit sa tagsa-tagsa nga mga module o kasamtangan nga mga solusyon alang sa piho nga mga buluhaton.

Ilustrasyon sa ulahi:

  • Sa yugto sa asembliya mahimo nimong gamiton:
    • lokal nga pagtukod sa docker, sa usa ka cluster gamit ang kaniko o sa Google Cloud Build;
    • Bazel sa lokal;
    • Jib Maven ug Jib Gradle sa lokal o sa Google Cloud Build;
    • custom build scripts nga modagan sa lokal. Kung kinahanglan nimo nga magpadagan og lain (mas flexible/pamilyar/...) nga solusyon sa pagtukod, kini gihulagway sa script aron ang Skaffold maglansad niini (pananglitan gikan sa dokumentasyon). Kini nagtugot kanimo sa paggamit sa bisan unsa nga kolektor nga matawag gamit ang usa ka script;
  • Sa yugto sa pagsulay, ang nahisgutan na container-structure-test;
  • Alang sa deployment gihatag ang mga musunud:
    • Kubectl;
    • Helm;
    • ipahiangay.

Salamat niini, ang Skaffold matawag nga usa ka talagsaon balangkas alang sa pagtukod sa CI/CD. Ania ang usa ka pananglitan sa workflow kung gamiton kini (gikan sa dokumentasyon sa proyekto):

Pagrepaso sa Skaffold alang sa pagpalambo sa Kubernetes

Unsa ang hitsura sa trabaho ni Skaffold sa kinatibuk-ang termino?

  1. Gibantayan sa utility ang mga pagbag-o sa direktoryo sa source code. Kung ang mga pagbag-o gihimo sa mga file, kini gi-synchronize sa application pod sa Kubernetes cluster. Kung mahimo, nga wala’y pag-reassemble sa imahe. Kung dili, usa ka bag-ong imahe ang gitigum.
  2. Ang gitigum nga imahe gisusi gamit ang container-structure-test, gi-tag ug gipadala sa Docker Registry.
  3. Pagkahuman niini, ang imahe gi-deploy - gi-deploy sa Kubernetes cluster.
  4. Kung ang paglansad gisugdan gamit ang command skaffold dev, unya magsugod kami sa pagdawat og mga log gikan sa aplikasyon, ug ang Skaffold naghulat alang sa mga pagbag-o aron masubli pag-usab ang tanan nga mga aksyon.

Pagrepaso sa Skaffold alang sa pagpalambo sa Kubernetes
Ilustrasyon sa mga nag-unang yugto sa operasyon sa Skaffold

Pagpraktis. Gisulayan ang Skaffold

Aron ipakita ang paggamit sa Skaffold, magkuha ako usa ka pananglitan gikan sa GitHub project repository... By the way, didto Makita nimo ang daghang uban pang mga pananglitan nga nagkonsiderar sa lainlaing mga detalye. Buhaton nako ang tanang aksyon sa lokal sa Minikube. Yano ang pag-instalar ug mokabat ug pipila ka minuto, ug kinahanglan nimo ang kubectl aron makasugod.

I-install ang 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

Atong i-clone ang repository sa Skaffold uban ang gikinahanglan nga mga pananglitan:

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

Gipili nako ang usa ka pananglitan nga adunay duha ka pod, ang matag usa adunay usa ka gamay nga aplikasyon sa Go. Ang usa ka aplikasyon mao ang frontend (leeroy-web), nga nag-redirect sa hangyo ngadto sa ikaduhang aplikasyon - ang backend (leeroy-app). Atong tan-awon kon unsay hitsura niini:

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

Ang leeroy-app ug leeroy-web adunay Go code ug yano nga Dockerfiles alang sa paghimo niini nga code sa lokal:

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

Dili nako ihatag ang code sa aplikasyon - igo na aron mahibal-an kana leeroy-web modawat sa mga hangyo ug proxy kanila sa leeroy-app. Busa sa mga file Deployment.yaml naay Serbisyo para lang app (alang sa internal nga ruta). Pod nga pantalan web ipasa namo kini sa among kaugalingon para sa dali nga pag-access sa aplikasyon.

Giunsa kini tan-awon 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

Ang tanan nga mga yugto nga gihisgutan sa ibabaw gihulagway dinhi. Dugang sa kini nga config, adunay usa usab ka file nga adunay mga setting sa kalibutan - ~/.skaffold/config. Mahimo kining i-edit sa mano-mano o pinaagi sa CLI - pananglitan, sama niini:

skaffold config set --global local-cluster true

Kini nga sugo magtakda sa global nga variable local-cluster ngadto sa kahulogan true, nga human niana ang Skaffold dili mosulay sa pagduso sa mga hulagway ngadto sa hilit nga rehistro. Kung nag-develop ka sa lokal, mahimo nimong gamiton kini nga mando sa paghimo og mga imahe sa lokal.

Balik sa skaffold.yaml:

  • Sa entablado build among gitino nga kinahanglan nimo nga kolektahon ug i-save ang imahe sa lokal. Human ang pagtukod midagan sa unang higayon, atong makita ang mosunod:
    // т.к. 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

    Sama sa imong nakita, gi-tag mismo ni Skaffold ang mga imahe. Pinaagi sa dalan, daghang mga palisiya sa pag-tag ang gisuportahan.

  • Dugang pa sa config kini gipakita context: ./leeroy-app/, i.e. gipiho ang konteksto diin gikolekta ang imahe.
  • Sa yugto sa pag-deploy, determinado nga gamiton namon ang kubectl ug maskara alang sa kinahanglan nga mga pagpakita.
  • PortForward: susama sa kung giunsa namon kanunay nga gipasa ang mga pantalan nga gigamit kubectl port-forward, naghatag kami mga instruksyon sa Skaffold sa pagtawag niini nga sugo. Sa kini nga kaso, ang lokal nga port 9000 gipasa sa 8080 sa Deployment nga adunay ngalan leeroy-web.

Panahon na sa paglansad skaffold dev: Ang team maghimo ug nagpadayon nga "feedback loop", i.e. dili lamang kini kolektahon ang tanan ug i-deploy kini sa cluster, apan isulti usab kanimo ang bahin sa kahimtang sa mga pod sa pagkakaron, pag-monitor sa mga pagbag-o ug pag-update sa kahimtang sa mga pod.

Ania ang resulta sa paglusad skaffold dev --port-forward sa diha nga reassembling:

Pagrepaso sa Skaffold alang sa pagpalambo sa Kubernetes

Una, imong makita nga ang cache gigamit. Sunod, ang aplikasyon gitigum, gipakatap, ug ang mga pantalan gipasa. Sukad gipiho --port-forward, Gipasa sa Skaffold ang pantalan sa web, ingon sa gipangutana kaniya, apan dinhi app iyang gilabay sa iyang kaugalingong pagkabuotan (pilia ang labing duol nga libre). Pagkahuman niini, nadawat namon ang una nga mga log gikan sa mga aplikasyon.

Atong susihon kung kini molihok?

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

Pag-usab sa file leeroy-app/app.go - pipila ka segundo ang milabay... ug:

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

Sa parehas nga oras, ang Skaffold mismo nagpakita sa parehas nga butang sa console sama sa kaniadto, gawas sa usa ka punto: gilukot lang kini. leeroy-app, ug dili tanan sa usa ka higayon.

Dugang praktis

Angayan usab nga isulti nga kung maghimo usa ka bag-ong proyekto, ang mga config para sa Skaffold mahimong ma-bootstrap gamit ang command init, nga sayon ​​kaayo. Dugang pa, mahimo nimong isulat ang daghang mga config: ipatuman ang pag-uswag sa default config, ug dayon i-roll out sa entablado gamit ang mando run (parehas nga proseso sa dev, dili lang mag-monitor sa mga kausaban), gamit ang laing config.

Sa katacoda naay giya Mas sayon ​​pa sa usa ka pananglitan. Apan nagtanyag kini usa ka andam nga sandbox nga adunay Kubernetes, usa ka aplikasyon ug Skaffold. Usa ka maayo nga kapilian kung interesado ka nga sulayan ang mga sukaranan sa imong kaugalingon.

Usa ka posible nga kaso sa paggamit alang sa Skaffold mao ang pagpahigayon sa pagpalambo sa usa ka hilit nga cluster. Dili tanan komportable nga nagpadagan sa Minikube sa ilang kaugalingon nga hardware, dayon gi-roll out ang aplikasyon ug gipaabut nga kini molihok nga igo ... Sa kini nga kaso, gisulbad sa Skaffold ang problema sa hingpit, nga mahimong makumpirma, pananglitan, sa mga inhenyero sa Reddit, ingon nga naa namo. nahisgutan na nagsulat sa among blog.

Ug sa niini nga publikasyon gikan sa Weaveworks makit-an nimo ang usa ka pananglitan sa paghimo og pipeline alang sa produksiyon.

konklusyon

Ang Skaffold usa ka kombenyente nga himan alang sa pagtukod sa mga pipeline nga naglambigit sa pagpalupad sa mga aplikasyon sa Kubernetes ug nag-una nga nakatutok sa mga panginahanglanon sa pag-uswag. Gipasayon ​​niini ang paghimo og usa ka "mubo" nga pipeline nga nagkonsiderar sa mga batakang panginahanglan sa developer, apan kung gusto, mahimo nimong organisahon ang mas dagkong mga proseso. Ingon usa sa tin-aw nga mga pananglitan sa paggamit sa Skaffold sa mga proseso sa CI / CD gihatag sa maong mga proyekto sa pagsulay sa 10 ka microservices gamit ang mga kapabilidad sa Kubernetes, gRPC, Istio ug OpenCensus Tracing.

Ang Skaffold aduna nay hapit 8000+ ka bituon sa GitHub, gimugna sa Google ug kabahin sa GoogleContainerTools — sa kinatibuk-an, sa pagkakaron adunay tanang rason sa pagtuo nga ang proyekto molambo nga malipayon hangtod sa hangtod.

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment