ڏيڍ سال اڳ، 5 مارچ 2018 تي، گوگل CI/CD لاءِ پنهنجي اوپن سورس پروجيڪٽ جو پهريون الفا ورزن جاري ڪيو. اسڪافولڊ، جنهن جو مقصد ”سادو ۽ ٻيهر قابل ڪبرنيٽس ڊولپمينٽ“ ٺاهڻ هو ته جيئن ڊولپرز انتظاميه بدران ترقي تي ڌيان ڏئي سگهن. Skaffold بابت ڇا دلچسپ ٿي سگهي ٿو؟ جيئن ته اهو نڪتو، ان ۾ ڪجهه چالون آهن ان جي آستين تي جيڪي ان کي ڊولپر لاء هڪ طاقتور اوزار ٺاهي سگهن ٿا، ۽ شايد شايد آپريشن انجنيئر پڻ. اچو ته پروجيڪٽ ۽ ان جي صلاحيتن سان واقف ٿي وڃو.
NB: رستي ۾، اسان اڳ ۾ ئي اسان جي جنرل ۾ Skaffold جي باري ۾ مختصر ڳالهه ٻولهه ڪئي آهي ڊولپر اوزار جو جائزو، جن جون زندگيون ڪبرنيٽس سان ڳنڍيل آهن.
نظريو. مقصد ۽ صلاحيتون
تنهن ڪري، عام طور تي ڳالهائڻ، Skaffold CI / CD چڪر کي خودڪار ڪرڻ جو مسئلو حل ڪري ٿو (تعمير، ڌڪ، ٺهڪندڙ مرحلن تي)، ڊولپر کي فوري موٽ پيش ڪندي، يعني. بعد ۾ ڪوڊ تبديلين جو نتيجو جلدي حاصل ڪرڻ جي صلاحيت - ڪبرنيٽس ڪلستر ۾ هلندڙ هڪ اپڊيٽ ٿيل ايپليڪيشن جي صورت ۾. ۽ اهو مختلف سرڪٽس ۾ ڪم ڪري سگهي ٿو (ديو، اسٽيج، پيداوار ...)، جنهن لاء اسڪافولڊ رول آئوٽ لاء لاڳاپيل پائپ لائنن کي بيان ڪرڻ ۾ مدد ڪري ٿي.
Skaffold جو سورس ڪوڊ Go ۾ لکيل آهي، طرفان ورهايل مفت Apache لائسنس 2.0 (GitHub) جي شرطن جي تحت.
اچو ته مکيه ڪمن ۽ خاصيتن تي نظر رکون. پهرين ۾ هيٺيان شامل آهن:
توهان کي پس منظر ۾ سورس ڪوڊ ۾ تبديلين جي نگراني ڪرڻ جي اجازت ڏئي ٿي ۽ ڪنٽينر تصويرن ۾ ڪوڊ گڏ ڪرڻ جي هڪ خودڪار عمل کي هلائڻ، انهن تصويرن کي ڊاڪر رجسٽري ۾ شايع ڪرڻ ۽ انهن کي ڪبرنيٽس ڪلستر تي ترتيب ڏيڻ جي اجازت ڏئي ٿي.
ڪنٽينر ۾ ڪم ڪندڙ ڊاريڪٽري سان مخزن ۾ فائلن کي هم وقت سازي ڪري ٿو.
ڪنٽينر-ڍانچي-ٽيسٽ استعمال ڪندي خودڪار طور تي ٽيسٽ.
بندرگاهن کي اڳتي وڌايو.
ڪنٽينر ۾ هلندڙ ايپليڪيشن جا لاگ پڙهي ٿو.
Java, Node.js, Python, Go ۾ لکيل ايپليڪيشنن کي ڊيبگ ڪرڻ ۾ مدد ڪري ٿي.
هاڻي خاصيتن جي باري ۾:
Skaffold پاڻ وٽ ڪو به ڪلستر-سائيڊ اجزاء ناهي. اهو آهي، هن افاديت کي استعمال ڪرڻ لاء ڪبرنيٽس کي وڌيڪ ترتيب ڏيڻ جي ڪا ضرورت ناهي.
توهان جي اپليڪيشن لاء مختلف پائپ لائنون. ڇا توهان کي ڪوڊ رول آئوٽ ڪرڻ جي ضرورت آهي مقامي Minikube ڏانهن جڏهن توهان ترقي ڪري رهيا آهيو، ۽ پوءِ اسٽيج يا پيداوار لاءِ؟ هن مقصد لاء موجود آهن پروفائلز ۽ صارف جي ترتيب، ماحولياتي متغير ۽ جھنڊا، جيڪي توھان کي ھڪڙي ايپليڪيشن لاء مختلف پائپ لائنون بيان ڪرڻ جي اجازت ڏين ٿيون.
CLI. YAML ۾ صرف ڪنسول افاديت ۽ ترتيب. انٽرنيٽ تي توهان کي پيدا ڪرڻ جي ڪوششن جا حوالا ڳولي سگهو ٿا تجرباتي GUIجڏهن ته، هن وقت گهڻو ڪري هن جو مطلب اهو آهي ته ڪنهن کي هن جي ضرورت آهي، پر حقيقت ۾ نه.
مودالي. اسڪافولڊ هڪ اسٽينڊل هارويسٽر نه آهي، پر خاص ڪمن لاءِ انفرادي ماڊل يا موجوده حل استعمال ڪرڻ جي ڪوشش ڪندو آهي.
آخري جو مثال:
اسيمبلي اسٽيج تي توهان استعمال ڪري سگهو ٿا:
ڊاڪر مقامي طور تي تعمير ڪريو، ڪلستر ۾ ڪنيڪو استعمال ڪندي يا گوگل ڪلائوڊ بلڊ ۾؛
مقامي طور تي بيزل؛
Jib Maven ۽ Jib Gradle مقامي طور تي يا گوگل ڪلائوڊ بلڊ ۾؛
ڪسٽم بلڊ اسڪرپٽ مقامي طور تي هلن ٿيون. جيڪڏهن توهان کي ڪنهن ٻئي (وڌيڪ لچڪدار/واقف/...) تعمير حل هلائڻ جي ضرورت آهي، اهو اسڪرپٽ ۾ بيان ڪيو ويو آهي ته جيئن اسڪافولڊ ان کي لانچ ڪري (دستاويز مان مثال). هي توهان کي ڪنهن به ڪليڪٽر کي استعمال ڪرڻ جي اجازت ڏئي ٿو جنهن کي اسڪرپٽ استعمال ڪندي سڏيو وڃي ٿو.
هن جي مهرباني، Skaffold هڪ منفرد سڏيو ڪري سگهجي ٿو CI/CD تعمير ڪرڻ لاء فريم ورڪ. هتي هڪ مثال ڪم فلو آهي جڏهن ان کي استعمال ڪندي (پروجيڪٽ جي دستاويزن مان):
Skaffold جي ڪم کي عام اصطلاحن ۾ ڇا نظر اچي ٿو؟
يوٽيليٽي مانيٽر ڪري ٿو تبديلين کي ماخذ ڪوڊ ڊاريڪٽري ۾. جيڪڏهن تبديليون فائلن ۾ ڪيون وينديون آهن، اهي ڪبرنيٽس ڪلستر ۾ ايپليڪيشن پوڊ سان هم وقت سازي ٿينديون آهن. جيڪڏهن ممڪن هجي، تصوير کي ٻيهر گڏ ڪرڻ کان سواء. ٻي صورت ۾، هڪ نئين تصوير گڏ ڪئي وئي آهي.
گڏ ڪيل تصوير کي چڪاس ڪيو ويو آهي ڪنٽينر-اسٽرڪچر-ٽيسٽ استعمال ڪندي، ٽيگ ڪيو ويو ۽ ڊاڪر رجسٽري ڏانهن موڪليو ويو.
ان کان پوء، تصوير لڳايو ويو آهي - ڪبرنيٽس ڪلستر ۾ مقرر ڪيو ويو آهي.
جيڪڏهن لانچ شروع ڪيو ويو حڪم استعمال ڪندي skaffold dev، پوءِ اسان اپليڪيشن مان لاگز حاصل ڪرڻ شروع ڪندا آهيون، ۽ اسڪافولڊ سڀني عملن کي ٻيهر ورجائڻ لاءِ تبديلين جو انتظار ڪري ٿو.
Skaffold آپريشن جي مکيه مرحلن جو مثال
مشق. ڪوشش ڪري رهيو آهي Skaffold
Skaffold جي استعمال کي ظاهر ڪرڻ لاء، مان هڪ مثال وٺندس GitHub پروجيڪٽ مخزن. ايئن ته، اتي توھان ڪيترائي ٻيا مثال ڳولي سگھو ٿا جيڪي مختلف وضاحتن کي مدنظر رکن ٿا. مان سڀ عمل مقامي طور تي Minikube ۾ انجام ڏيندس. انسٽاليشن سادو آهي ۽ ڪجهه منٽ لڳن ٿا، ۽ توهان کي شروع ڪرڻ لاءِ kubectl جي ضرورت پوندي.
leeroy-app ۽ leeroy-web تي مشتمل آهي Go ڪوڊ ۽ سادي Dockerfiles هن ڪوڊ کي مقامي طور تي تعمير ڪرڻ لاءِ:
~/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/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
PortForwardجيئن ته اسان عام طور تي بندرگاهن کي استعمال ڪندي اڳتي وڌون ٿا kubectl port-forward، اسان Skaffold کي هدايتون ڏيون ٿا ھن حڪم کي سڏڻ لاءِ. انهي صورت ۾، مقامي بندرگاهن 9000 کي 8080 جي نالي سان ترتيب ڏيڻ ۾ موڪليو ويو آهي. leeroy-web.
اهو شروع ڪرڻ جو وقت آهي skaffold dev: ٽيم ٺاهي ويندي هڪ جاري "فيڊبڪ لوپ"، يعني. نه رڳو اهو سڀ ڪجهه گڏ ڪندو ۽ ان کي ڪلستر ۾ ترتيب ڏيندو، پر توهان کي هن وقت پوڊس جي حالت بابت پڻ ٻڌائيندو، تبديلين جي نگراني ڪندو ۽ پوڊ جي حالت کي اپڊيٽ ڪندو.
هتي لانچ جو نتيجو آهي skaffold dev --port-forward جڏهن ٻيهر گڏ ڪرڻ:
پهرين، توهان ڏسي سگهو ٿا ته ڪيش استعمال ڪيو پيو وڃي. اڳيون، ايپليڪيشن گڏ ڪئي وئي، ترتيب ڏني وئي، ۽ بندرگاهن کي اڳتي وڌايو ويو. جڏهن کان بيان ڪيو ويو آهي --port-forward، Skaffold بندرگاهه ڏانهن اڳتي وڌايو 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!!!
~/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 لاء configs کي استعمال ڪندي بوٽ اسٽريپ ڪري سگهجي ٿو. init، جيڪو تمام آسان آهي. ان کان علاوه، توھان لکي سگھوٿا ڪيترائي ترتيب: ڊفالٽ ترتيب تي ترقي ڪريو، ۽ پوءِ ڪمانڊ سان اسٽيج ڏانھن رول آئوٽ ڪريو run (ساڳي عمل dev، صرف تبديلين جي نگراني نٿو ڪري)، هڪ مختلف ترتيب استعمال ڪندي.
ڪيٽاڪوڊا تي آهي رهنمائي ڪندڙ اهو هڪ مثال سان اڃا به آسان آهي. پر اهو پيش ڪري ٿو تيار ٿيل سينڊ باڪس ڪبرنيٽس، هڪ ايپليڪيشن ۽ اسڪافولڊ سان. هڪ بهترين اختيار جيڪڏهن توهان دلچسپي رکو ٿا ته تمام بنيادي شيون پاڻ کي ڪوشش ڪرڻ ۾.
Skaffold لاءِ هڪ ممڪن استعمال وارو ڪيس ريموٽ ڪلسٽر تي ترقي ڪرڻ آهي. هرڪو پنهنجي هارڊويئر تي Minikube هلائڻ ۾ آسان ناهي، پوءِ ايپليڪيشن کي رول آئوٽ ڪرڻ ۽ ان کي مناسب طريقي سان ڪم ڪرڻ جي اميد رکي ٿو... انهي صورت ۾، اسڪافولڊ اهو مسئلو مڪمل طور تي حل ڪري ٿو، جنهن جي تصديق ٿي سگهي ٿي، مثال طور، Reddit انجنيئرز، جيئن اسان وٽ آهي. اڳ ۾ ئي بحث ڪيو ويو آهي لکيو اسان جي بلاگ ۾.
اسڪافولڊ پائپ لائنز جي تعمير لاءِ هڪ آسان اوزار آهي جنهن ۾ ڪبرنيٽس تائين ايپليڪيشنن کي رولنگ ڪرڻ شامل آهي ۽ بنيادي طور تي ترقي جي ضرورتن تي مرکوز آهي. اهو "ننڍي" پائپ لائن ٺاهڻ ۾ ڪافي آسان بڻائي ٿو جيڪا ڊولپر جي بنيادي ضرورتن کي مدنظر رکي ٿي، پر جيڪڏهن گهربل هجي، توهان وڏي عمل کي منظم ڪري سگهو ٿا. جيئن CI/CD عملن ۾ Skaffold استعمال ڪرڻ جا واضح مثال ڏنو ويو آهي جيئن ته هڪ ٽيسٽ پروجيڪٽ Kubernetes، gRPC، Istio ۽ OpenCensus Tracing جي صلاحيتن کي استعمال ڪندي 10 مائڪرو سروسز مان.
Skaffold اڳ ۾ ئي GitHub تي لڳ ڀڳ 8000+ ستارا آهن، گوگل پاران ٺاهيل آهي ۽ ان جو حصو آهي گوگل ڪنٽينر ٽولز - عام طور تي، هن وقت يقين ڪرڻ جو هر سبب آهي ته پروجيڪٽ ڪڏهن به خوشيء سان ترقي ڪندو.