Жил хагасын өмнө буюу 5 оны 2018-р сарын XNUMX-нд Google CI/CD-д зориулсан Нээлттэй эхийн төслийн анхны альфа хувилбарыг гаргасан.
NB: Дашрамд хэлэхэд бид ерөнхийдөө Скаффолдын талаар товч ярьсан
Онол. Зорилго, чадвар
Тиймээс ерөнхийдөө Skaffold нь CI/CD циклийг автоматжуулах ( бүтээх, түлхэх, байрлуулах үе шатуудад) асуудлыг шийдэж, хөгжүүлэгчийн шуурхай санал хүсэлтийг санал болгодог. дараагийн кодын өөрчлөлтийн үр дүнг хурдан хүлээн авах чадвар - Kubernetes кластерт ажиллаж байгаа шинэчлэгдсэн програм хэлбэрээр. Мөн энэ нь өөр өөр хэлхээнд (хөгжүүлэгч, үе шат, үйлдвэрлэл ...) ажиллах боломжтой бөгөөд үүнд Skaffold нь нэвтрүүлэхэд тохирох дамжуулах хоолойнуудыг тайлбарлахад тусалдаг.
Skaffold-ийн эх код нь Go дээр бичигдсэн,
Үндсэн функц, онцлогуудыг авч үзье. Эхнийх нь дараахь зүйлийг агуулна.
- Skaffold нь CI/CD дамжуулах хоолой үүсгэх хэрэгслийг санал болгодог.
- Энэ нь танд эх кодын арын код дахь өөрчлөлтийг хянах, кодыг контейнерийн зураг болгон нэгтгэх, эдгээр зургийг Docker бүртгэлд нийтлэх, Кубернетес кластерт байрлуулах автомат процессыг ажиллуулах боломжийг олгоно.
- Репозитор дахь файлуудыг контейнер доторх ажлын лавлахтай синхрончилдог.
- Container-structure-test ашиглан автоматаар шалгана.
- Дамжуулах портууд.
- Контейнер дотор ажиллаж байгаа програмын бүртгэлийг уншина.
- Java, Node.js, Python, Go дээр бичигдсэн програмуудыг дибаг хийхэд тусална.
Одоо онцлог шинж чанаруудын талаар:
- Skaffold өөрөө кластер талын бүрэлдэхүүн хэсгүүдгүй. Өөрөөр хэлбэл, энэ хэрэгслийг ашиглахын тулд Kubernetes-ийг цаашид тохируулах шаардлагагүй болно.
- Таны хэрэглээний өөр өөр шугам хоолой. Та хөгжүүлж байх хугацаандаа орон нутгийн Minikube-д кодыг тарааж, дараа нь тайз эсвэл үйлдвэрлэлд оруулах шаардлагатай байна уу? Энэ зорилгоор байдаг
профайлууд Хэрэглэгчийн тохиргоо, орчны хувьсагч ба тугууд нь нэг програмын өөр өөр дамжуулах шугамыг дүрслэх боломжийг олгодог. - CLI. Зөвхөн YAML дахь консолын хэрэгсэл болон тохиргоонууд. Интернет дээр та үүсгэх оролдлогын лавлагаа олж болно
туршилтын GUI Гэсэн хэдий ч, одоогоор энэ нь хэн нэгэнд хэрэгтэй гэсэн үг юм, гэхдээ үнэндээ тийм биш. - Модульчлал. Skaffold нь бие даасан комбайн биш боловч тодорхой ажлуудад зориулж тусдаа модулиуд эсвэл одоо байгаа шийдлүүдийг ашиглахыг хичээдэг.
Сүүлчийн зураглал:
- Угсралтын үе шатанд та дараахь зүйлийг ашиглаж болно.
- docker-ыг орон нутагт, kaniko ашиглан кластерт эсвэл Google Cloud Build дээр бүтээх;
- Базел орон нутагт;
- Jib Maven болон Jib Gradle нарыг дотооддоо эсвэл Google Cloud Build дээр;
- захиалгат бүтээх скриптүүд нь орон нутагт ажилладаг. Хэрэв та өөр (илүү уян хатан/танил/...) бүтээх шийдлийг ажиллуулах шаардлагатай бол үүнийг Скаффолд ажиллуулахын тулд скриптэд тайлбарласан болно (
баримт бичгийн жишээ ). Энэ нь скрипт ашиглан дуудаж болох аливаа цуглуулагчийг ашиглах боломжийг танд олгоно;
- Туршилтын үе шатанд аль хэдийн дурдсан
чингэлэг-бүтэц-туршилт ; - Байршуулахын тулд дараахь зүйлийг хангана.
- Kubectl;
- жолоо;
- тохируулах.
Үүний ачаар Скаффолдыг өвөрмөц гэж нэрлэж болно CI/CD бүтээх хүрээ. Үүнийг ашиглах үеийн ажлын жишээ энд байна (төслийн баримт бичгээс):
Скаффолдын бүтээл ерөнхийдөө ямар харагддаг вэ?
- Уг хэрэгсэл нь эх кодын лавлах дахь өөрчлөлтийг хянадаг. Хэрэв файлд өөрчлөлт оруулсан бол тэдгээрийг Kubernetes кластер дахь програмын самбартай синхрончилно. Боломжтой бол зургийг дахин угсрахгүйгээр. Үгүй бол шинэ зураг угсарна.
- Угсарсан зургийг container-structure-test ашиглан шалгаж, шошголож, Docker Registry руу илгээнэ.
- Үүний дараа зургийг Kubernetes кластерт байрлуулна.
- Хэрэв эхлүүлэх командыг ашиглан эхлүүлсэн бол
skaffold dev
, дараа нь бид програмаас лог хүлээн авч эхлэх бөгөөд Skaffold бүх үйлдлийг дахин давтах өөрчлөлтийг хүлээж байна.
Скаффолдын үйл ажиллагааны үндсэн үе шатуудын зураглал
Дасгал хийх. Скаффолдыг оролдож байна
Skaffold-ийн хэрэглээг харуулахын тулд би жишээ авах болно
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
Скаффолдын агуулахыг шаардлагатай жишээнүүдээр хувилъя:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
Би тус бүр нь нэг жижиг Go програм агуулсан хоёр pods бүхий жишээг сонгосон. Нэг програм нь урд талын програм (leeroy-web) бөгөөд хүсэлтийг хоёр дахь программ руу чиглүүлдэг - backend (leeroy-app). Энэ нь юу болохыг харцгаая:
~/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 болон leeroy-web нь энэ кодыг дотооддоо бүтээхэд зориулсан Go код болон энгийн Docker файлуудыг агуулдаг:
~/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 .
Би програмын кодыг өгөхгүй - үүнийг мэдэхэд хангалттай leeroy-web
хүсэлтийг хүлээн авч, тэдэнд итгэмжлэгдсэн төлөөлөгч leeroy-app
. Тиймээс файлуудад Deployment.yaml
зөвхөн үйлчилгээ байдаг app
(дотоод чиглүүлэлтийн хувьд). Под порт web
Бид програм руу хурдан нэвтрэхийн тулд үүнийг өөрсдөдөө дамжуулах болно.
Үзсэн мэт харагдаж байна 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
Дээр дурдсан бүх үе шатуудыг энд тайлбарласан болно. Энэ тохиргооноос гадна глобал тохиргоотой файл бас бий. ~/.skaffold/config
. Үүнийг гараар эсвэл CLI ашиглан засварлаж болно - жишээлбэл:
skaffold config set --global local-cluster true
Энэ тушаал нь глобал хувьсагчийг тохируулах болно local-cluster
утга руу оруулна true
, үүний дараа Skaffold нь алсын бүртгэл рүү зураг оруулахыг оролдохгүй. Хэрэв та орон нутагт хөгжиж байгаа бол энэ командыг ашиглан зураг бүтээх боломжтой.
Буцах skaffold.yaml
:
- Тайзан дээр
build
Бид зургийг дотооддоо цуглуулж, хадгалах шаардлагатайг зааж өгсөн. Бүтэц анх удаагаа ажилласны дараа бид дараахь зүйлийг харах болно.// т.к. 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
Таны харж байгаагаар Скаффолд өөрөө зургуудыг тэмдэглэв. Дашрамд хэлэхэд, шошголох хэд хэдэн бодлогыг дэмждэг.
- Цаашид тохиргоонд үүнийг зааж өгсөн болно
context: ./leeroy-app/
, өөрөөр хэлбэл зураг цуглуулсан контекстийг зааж өгсөн болно. - Байршуулах үе шатанд бид kubectl болон шаардлагатай манифестэд зориулж маск ашиглахаар шийдсэн.
-
PortForward
: бид портуудыг ихэвчлэн ашигладагтай төстэйkubectl port-forward
, бид энэ командыг дуудах зааварчилгааг Skaffold-д өгдөг. Энэ тохиолдолд локал порт 9000 нь Deployment-д нэрээр 8080 руу дамжуулагдана.leeroy-web
.
Эхлэх цаг боллоо skaffold dev
: Баг нь байнгын "санал хүсэлтийн гогцоо" үүсгэх болно, өөрөөр хэлбэл. Энэ нь бүх зүйлийг цуглуулж кластерт байршуулаад зогсохгүй одоо байгаа хонхорцогуудын төлөв байдлын талаар танд хэлэх, өөрчлөлтийг хянах, хонгилын төлөвийг шинэчлэх болно.
Энд нээлтийн үр дүн байна skaffold dev --port-forward
дахин угсрах үед:
Эхлээд та кэшийг ашиглаж байгааг харж болно. Дараа нь програмыг угсарч, байрлуулж, портуудыг дамжуулна. Тодорхойлсоноос хойш --port-forward
, Скаффолд портыг дамжуулав web
, түүнээс асуусан шиг, гэхдээ энд app
тэр өөрийн үзэмжээр шидсэн (хамгийн ойрын үнэ төлбөргүйг сонгосон). Үүний дараа бид програмуудаас эхний бүртгэлийг хүлээн авдаг.
Энэ нь ажиллаж байгаа эсэхийг шалгацгаая?
~/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!!!
Файлыг өөрчилж байна leeroy-app/app.go
- хэдхэн секунд өнгөрөхөд... мөн:
~/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!!!
Үүний зэрэгцээ, Скаффолд өөрөө консол дээр өмнөхтэй ижил зүйлийг харуулсан бөгөөд нэг зүйлийг эс тооцвол: энэ нь зөвхөн гарч ирсэн. leeroy-app
, мөн бүгдийг нэг дор биш.
Илүү дадлага хийх
Шинэ төсөл үүсгэх үед Skaffold-ийн тохиргоог тушаалыг ашиглан ачаалах боломжтой гэдгийг дурдах нь зүйтэй. init
, энэ нь маш тохиромжтой. Нэмж дурдахад та хэд хэдэн тохиргоог бичиж болно: анхдагч тохиргоон дээр хөгжүүлэлтийг хийж, дараа нь командын тусламжтайгаар шат руу шилжүүлээрэй. run
(ижил процесс dev
, зүгээр л өөрчлөлтийг хянахгүй), өөр тохиргоо ашиглан.
Катакода дээр байдаг
Скаффолдыг ашиглах боломжтой нэг тохиолдол бол алсын кластер дээр хөгжүүлэлт хийх явдал юм. Хүн бүр Minikube-г өөрийн техник хэрэгслээр ажиллуулж, дараа нь програмаа хөгжүүлж, зохих ёсоор ажиллахыг хүлээх нь тийм ч таатай байдаггүй... Энэ тохиолдолд Skaffold нь асуудлыг төгс шийддэг бөгөөд үүнийг жишээ нь Reddit инженерүүд баталж чадна. аль хэдийн хэлэлцсэн
Тэгээд бас
дүгнэлт
Skaffold нь Kubernetes-д програмуудыг нэвтрүүлэхийг хамарсан дамжуулах хоолой барихад тохиромжтой хэрэгсэл бөгөөд үндсэндээ хөгжлийн хэрэгцээнд анхаарлаа хандуулдаг. Энэ нь хөгжүүлэгчийн үндсэн хэрэгцээг харгалзан "богино" дамжуулах хоолойг бий болгоход хялбар болгодог, гэхдээ хэрэв хүсвэл илүү том процессуудыг зохион байгуулж болно. CI/CD процесст Skaffold ашиглах тод жишээнүүдийн нэг
Skaffold нь GitHub дээр аль хэдийн бараг 8000 гаруй одтой, Google-ийн хөгжүүлсэн бөгөөд нэг хэсэг юм.
PS
Мөн манай блог дээрээс уншина уу:
- «
Kubernetes дээр ажиллаж байгаа программ хөгжүүлэгчдэд зориулсан хэрэгслүүд "; - «
werf - Кубернетес дэх CI / CD-д зориулсан манай хэрэгсэл (тойм болон видео тайлан) "; - «
Garden v0.10.0: Таны зөөврийн компьютерт Kubernetes хэрэггүй "; - «
Kubernetes зөвлөмж ба заль мэх: орон нутгийн хөгжил ба Телепрезенцийн тухай ".
Эх сурвалж: www.habr.com