Adolygiad o Skaffold ar gyfer datblygiad Kubernetes

Adolygiad o Skaffold ar gyfer datblygiad Kubernetes

Flwyddyn a hanner yn ôl, ar Fawrth 5, 2018, rhyddhaodd Google y fersiwn alffa gyntaf o'i brosiect CI / CD Ffynhonnell Agored o'r enw Sgaffald, a'i nod oedd creu “datblygiad Kubernetes syml ac ailadroddadwy” fel y gallai datblygwyr ganolbwyntio ar ddatblygu yn hytrach na gweinyddu. Beth allai fod yn ddiddorol am Skaffold? Fel mae'n digwydd, mae ganddo ychydig o driciau i fyny ei lawes a all ei wneud yn arf pwerus i'r datblygwr, ac efallai hyd yn oed y peiriannydd gweithrediadau. Gadewch i ni ddod yn gyfarwydd â'r prosiect a'i alluoedd.

NB: Gyda llaw, rydym eisoes wedi siarad yn fyr am Skaffold yn ein cyffredinol adolygiad o offer datblygwyr, y mae eu bywydau yn gysylltiedig â Kubernetes.

Damcaniaeth. Pwrpas a galluoedd

Felly, yn gyffredinol, mae Skaffold yn datrys y broblem o awtomeiddio'r cylch CI/CD (yn y camau adeiladu, gwthio, defnyddio), gan gynnig adborth prydlon i'r datblygwr, h.y. y gallu i dderbyn canlyniad newidiadau cod dilynol yn gyflym - ar ffurf cais wedi'i ddiweddaru sy'n rhedeg yn y clwstwr Kubernetes. A gall weithio mewn gwahanol gylchedau (dev, llwyfan, cynhyrchu ...), y mae Skaffold yn helpu i ddisgrifio'r piblinellau cyfatebol ar gyfer cyflwyno.

Mae cod ffynhonnell Skaffold wedi'i ysgrifennu yn Go, dosbarthu gan o dan y Drwydded Apache 2.0 am ddim (GitHub).

Gadewch i ni edrych ar y prif swyddogaethau a nodweddion. Mae'r cyntaf yn cynnwys y canlynol:

  • Mae Skaffold yn cynnig offer ar gyfer creu piblinellau CI/CD.
  • Yn eich galluogi i fonitro newidiadau yn y cod ffynhonnell yn y cefndir a rhedeg proses awtomataidd o gydosod cod i ddelweddau cynhwysydd, gan gyhoeddi'r delweddau hyn yng Nghofrestrfa Docker a'u defnyddio i glwstwr Kubernetes.
  • Yn cydamseru ffeiliau yn yr ystorfa â'r cyfeiriadur gweithio yn y cynhwysydd.
  • Profion yn awtomatig gan ddefnyddio prawf strwythur cynhwysydd.
  • Ymlaen porthladdoedd.
  • Yn darllen logiau rhaglen sy'n rhedeg mewn cynhwysydd.
  • Yn helpu i ddadfygio cymwysiadau a ysgrifennwyd yn Java, Node.js, Python, Go.

Nawr am y nodweddion:

  • Nid oes gan Skaffold ei hun unrhyw gydrannau ochr clwstwr. Hynny yw, nid oes angen ffurfweddu Kubernetes ymhellach i ddefnyddio'r cyfleustodau hwn.
  • Piblinellau gwahanol ar gyfer eich cais. Oes angen i chi gyflwyno'r cod i Minikube lleol tra'ch bod chi'n datblygu, ac yna i'r llwyfan neu'r cynhyrchiad? At y diben hwn mae proffiliau a chyfluniadau defnyddwyr, newidynnau amgylchedd a baneri, sy'n eich galluogi i ddisgrifio gwahanol bibellau ar gyfer un cais.
  • CLI. Dim ond cyfleustodau consol a ffurfweddau yn YAML. Ar y Rhyngrwyd gallwch ddod o hyd i gyfeiriadau at ymdrechion i greu GUI arbrofol, fodd bynnag, ar hyn o bryd mae hyn yn fwyaf tebygol yn unig yn golygu bod rhywun ei angen, ond nid mewn gwirionedd.
  • Modiwlaidd. Nid yw Skaffold yn gynaeafwr annibynnol, ond mae'n ymdrechu i ddefnyddio modiwlau unigol neu atebion presennol ar gyfer tasgau penodol.

Darlun o'r olaf:

  • Yn y cam cydosod gallwch ddefnyddio:
    • adeiladu docwyr yn lleol, mewn clwstwr gan ddefnyddio kaniko neu yn Google Cloud Build;
    • Bazel yn lleol;
    • Jib Maven a Jib Gradle yn lleol neu yn Google Cloud Build;
    • sgriptiau adeiladu arfer yn rhedeg yn lleol. Os oes angen i chi redeg datrysiad adeiladu arall (mwy hyblyg/cyfarwydd/...), fe'i disgrifir yn y sgript fel bod Skaffold yn ei lansio (enghraifft o ddogfennaeth). Mae hyn yn caniatáu i chi ddefnyddio unrhyw gasglwr y gellir ei alw gan ddefnyddio sgript;
  • Yn y cam profi, y crybwyllwyd eisoes cynhwysydd-strwythur-prawf;
  • Ar gyfer defnydd, darperir y canlynol:
    • Kubectl;
    • Llyw;
    • addasu.

Diolch i hyn, gellir galw Skaffold yn unigryw fframwaith ar gyfer adeiladu CI/CD. Dyma enghraifft o lif gwaith wrth ei ddefnyddio (o ddogfennaeth y prosiect):

Adolygiad o Skaffold ar gyfer datblygiad Kubernetes

Sut olwg sydd ar waith Skaffold yn gyffredinol?

  1. Mae'r cyfleustodau'n monitro newidiadau yn y cyfeiriadur cod ffynhonnell. Os gwneir addasiadau i'r ffeiliau, cânt eu cysoni â'r pod cais yng nghlwstwr Kubernetes. Os yn bosibl, heb ail-osod y ddelwedd. Fel arall, mae delwedd newydd yn cael ei chydosod.
  2. Mae'r ddelwedd sydd wedi'i ymgynnull yn cael ei wirio gan ddefnyddio prawf strwythur-cynhwysydd, ei dagio a'i anfon i Gofrestrfa'r Docwyr.
  3. Ar ôl hyn, mae'r ddelwedd yn cael ei defnyddio - yn cael ei defnyddio yng nghlwstwr Kubernetes.
  4. Os cychwynnwyd y lansiad gan ddefnyddio'r gorchymyn skaffold dev, yna rydym yn dechrau derbyn logiau o'r cais, ac mae Skaffold yn aros am newidiadau i ailadrodd yr holl gamau gweithredu eto.

Adolygiad o Skaffold ar gyfer datblygiad Kubernetes
Darlun o brif gamau gweithrediad Skaffold

Ymarfer. Ceisio Skaffold

I ddangos y defnydd o Skaffold, cymeraf enghraifft o Ystorfa prosiect GitHub... Gyda llaw, yn yr un lle Gallwch ddod o hyd i lawer o enghreifftiau eraill sy'n ystyried gwahanol fanylion. Byddaf yn perfformio pob gweithred yn lleol yn Minikube. Mae'r gosodiad yn syml ac yn cymryd ychydig funudau, a bydd angen kubectl arnoch i ddechrau.

Gosod 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

Gadewch i ni glonio ystorfa Skaffold gyda'r enghreifftiau angenrheidiol:

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

Dewisais enghraifft gyda dau god, pob un yn cynnwys un cais Go bach. Un cymhwysiad yw'r frontend (leeroy-web), sy'n ailgyfeirio'r cais i'r ail gymhwysiad - y pen ôl (leeroy-app). Gawn ni weld sut olwg sydd arno:

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

mae leeroy-app a leeroy-web yn cynnwys cod Go a Dockerfiles syml ar gyfer adeiladu'r cod hwn yn lleol:

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

Ni fyddaf yn rhoi cod y cais - mae'n ddigon gwybod hynny leeroy-web yn derbyn ceisiadau ac yn eu dirprwyo iddynt leeroy-app. Felly yn y ffeiliau Deployment.yaml dim ond ar gyfer app (ar gyfer llwybro mewnol). Porth pod web byddwn yn ei anfon ymlaen atom ein hunain i gael mynediad cyflym i'r cais.

Mae'n edrych fel 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

Disgrifir yr holl gamau uchod yma. Yn ogystal â'r ffurfwedd hon, mae yna hefyd ffeil gyda gosodiadau byd-eang - ~/.skaffold/config. Gellir ei olygu â llaw neu drwy'r CLI - er enghraifft, fel hyn:

skaffold config set --global local-cluster true

Bydd y gorchymyn hwn yn gosod y newidyn byd-eang local-cluster i mewn i ystyr true, ac ar ôl hynny ni fydd Skaffold yn ceisio gwthio delweddau i'r gofrestrfa bell. Os ydych chi'n datblygu'n lleol, gallwch chi ddefnyddio'r gorchymyn hwn i adeiladu delweddau yn lleol.

Nôl i skaffold.yaml:

  • Ar y llwyfan build rydym yn nodi bod angen i chi gasglu a chadw'r ddelwedd yn lleol. Ar ôl i'r gwaith adeiladu redeg am y tro cyntaf, byddwn yn gweld y canlynol:
    // т.к. 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

    Fel y gwelwch, tagiodd Skaffold y delweddau ei hun. Gyda llaw, cefnogir sawl polisi tagio.

  • Ymhellach yn y ffurfwedd fe'i nodir context: ./leeroy-app/, h.y. nodir y cyd-destun y cesglir y ddelwedd ynddo.
  • Ar y cam defnyddio, mae'n benderfynol y byddwn yn defnyddio kubectl a mwgwd ar gyfer y maniffestau angenrheidiol.
  • PortForward: yn debyg i sut yr ydym fel arfer yn anfon porthladdoedd ymlaen gan ddefnyddio kubectl port-forward, rydym yn rhoi cyfarwyddiadau i Skaffold i alw'r gorchymyn hwn. Yn yr achos hwn, mae porthladd lleol 9000 yn cael ei anfon ymlaen i 8080 mewn Defnydd gyda'r enw leeroy-web.

Mae'n amser lansio skaffold dev: Bydd y tîm yn creu “dolen adborth” barhaus, h.y. nid yn unig y bydd yn casglu popeth a'i anfon i'r clwstwr, ond bydd hefyd yn dweud wrthych am gyflwr y codennau ar hyn o bryd, yn monitro newidiadau ac yn diweddaru cyflwr y codennau.

Dyma ganlyniad y lansiad skaffold dev --port-forward wrth ail-gydosod:

Adolygiad o Skaffold ar gyfer datblygiad Kubernetes

Yn gyntaf, gallwch weld bod y storfa yn cael ei ddefnyddio. Nesaf, mae'r cais yn cael ei ymgynnull, ei ddefnyddio, ac mae porthladdoedd yn cael eu hanfon ymlaen. Ers y nodwyd --port-forward, Anfonodd Skaffold y porthladd i web, fel y gofynwyd iddo, ond yma app taflodd yn ôl ei ddisgresiwn ei hun (dewisodd yr un rhydd agosaf). Ar ôl hyn, rydym yn derbyn y logiau cyntaf o'r ceisiadau.

Gadewch i ni wirio a yw'n gweithio?

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

Addasu'r ffeil leeroy-app/app.go - ychydig eiliadau yn mynd heibio... a:

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

Ar yr un pryd, roedd Skaffold ei hun yn arddangos yr un peth yn y consol ag o'r blaen, ac eithrio un pwynt: dim ond ei gyflwyno leeroy-app, ac nid i gyd ar unwaith.

Mwy o ymarfer

Mae'n werth nodi hefyd, wrth greu prosiect newydd, y gellir cychwyn cyfluniadau ar gyfer Skaffold gan ddefnyddio'r gorchymyn init, sy'n gyfleus iawn. Yn ogystal, gallwch ysgrifennu sawl ffurfweddiad: cyflawni datblygiad ar y ffurfweddiad rhagosodedig, ac yna ei gyflwyno i'r llwyfan gyda'r gorchymyn run (yr un broses â dev, nid yw'n monitro newidiadau), gan ddefnyddio ffurfwedd wahanol.

Ar katacoda mae arweinyddiaeth Mae hyd yn oed yn haws gydag enghraifft. Ond mae'n cynnig blwch tywod parod gyda Kubernetes, cais a Skaffold. Opsiwn gwych os oes gennych ddiddordeb mewn rhoi cynnig ar y pethau sylfaenol eich hun.

Un achos defnydd posibl ar gyfer Skaffold yw cynnal datblygiad ar glwstwr anghysbell. Nid yw pawb yn gyfforddus yn rhedeg Minikube ar eu caledwedd eu hunain, yna'n cyflwyno'r cymhwysiad a disgwyl iddo weithio'n ddigonol ... Yn yr achos hwn, mae Skaffold yn datrys y broblem yn berffaith, y gellir ei gadarnhau, er enghraifft, gan beirianwyr Reddit, fel sydd gennym ni. a drafodwyd eisoes писали yn ein blog.

Ac yn y cyhoeddiad hwn o Weaveworks gallwch ddod o hyd i enghraifft o greu piblinell ar gyfer cynhyrchu.

Casgliad

Mae Skaffold yn offeryn cyfleus ar gyfer adeiladu piblinellau sy'n cynnwys cyflwyno ceisiadau i Kubernetes ac sy'n canolbwyntio'n bennaf ar anghenion datblygu. Mae'n ei gwneud hi'n eithaf hawdd creu piblinell “byr” sy'n ystyried anghenion sylfaenol y datblygwr, ond os dymunir, gallwch drefnu prosesau mwy. Fel un o'r enghreifftiau clir o ddefnyddio Skaffold mewn prosesau CI/CD yn cael ei roi o'r fath prosiect prawf o 10 microwasanaeth gan ddefnyddio galluoedd Kubernetes, gRPC, Istio ac OpenCensus Tracing.

Mae gan Skaffold eisoes bron i 8000+ o sêr ar GitHub, mae wedi'i ddatblygu gan Google ac mae'n rhan o GoogleContainerTools — yn gyffredinol, ar hyn o bryd mae pob rheswm i gredu y bydd y prosiect yn datblygu’n hapus byth wedyn.

PS

Darllenwch hefyd ar ein blog:

Ffynhonnell: hab.com

Ychwanegu sylw