डेढ़ साल पहले, 5 मार्च, 2018 को, Google ने CI/CD के लिए अपने ओपन सोर्स प्रोजेक्ट का पहला अल्फा संस्करण जारी किया था जिसे कहा जाता है मचान, जिसका लक्ष्य "सरल और दोहराने योग्य कुबेरनेट्स विकास" बनाना था ताकि डेवलपर्स प्रशासन के बजाय विकास पर ध्यान केंद्रित कर सकें। स्केफोल्ड के बारे में क्या दिलचस्प हो सकता है? जैसा कि यह पता चला है, इसमें कुछ तरकीबें हैं जो इसे डेवलपर और शायद ऑपरेशन इंजीनियर के लिए भी एक शक्तिशाली उपकरण बना सकती हैं। आइए परियोजना और इसकी क्षमताओं से परिचित हों।
NB: वैसे, हम पहले ही अपने सामान्य तौर पर स्केफोल्ड के बारे में संक्षेप में बात कर चुके हैं डेवलपर टूल की समीक्षा, जिनका जीवन कुबेरनेट्स से जुड़ा हुआ है।
लिखित। उद्देश्य और क्षमताएं
तो, आम तौर पर बोलते हुए, स्केफोल्ड सीआई/सीडी चक्र (बिल्ड, पुश, तैनाती चरणों पर) को स्वचालित करने की समस्या को हल करता है, जो डेवलपर को त्वरित प्रतिक्रिया प्रदान करता है, यानी। बाद के कोड परिवर्तनों के परिणाम को शीघ्रता से प्राप्त करने की क्षमता - कुबेरनेट्स क्लस्टर में चल रहे एक अद्यतन एप्लिकेशन के रूप में। और यह विभिन्न सर्किट (डेवलपमेंट, स्टेज, प्रोडक्शन...) में काम कर सकता है, जिसके लिए स्केफोल्ड रोलआउट के लिए संबंधित पाइपलाइनों का वर्णन करने में मदद करता है।
स्केफ़ोल्ड का स्रोत कोड गो में लिखा गया है, द्वारा वितरित मुफ़्त अपाचे लाइसेंस 2.0 (GitHub) के तहत।
आइए मुख्य कार्यों और विशेषताओं पर नजर डालें। पहले में निम्नलिखित शामिल हैं:
स्केफोल्ड सीआई/सीडी पाइपलाइन बनाने के लिए उपकरण प्रदान करता है।
आपको पृष्ठभूमि में स्रोत कोड में परिवर्तनों की निगरानी करने और कंटेनर छवियों में कोड को इकट्ठा करने, इन छवियों को डॉकर रजिस्ट्री में प्रकाशित करने और उन्हें कुबेरनेट्स क्लस्टर में तैनात करने की एक स्वचालित प्रक्रिया चलाने की अनुमति देता है।
कंटेनर में कार्यशील निर्देशिका के साथ रिपॉजिटरी में फ़ाइलों को सिंक्रनाइज़ करता है।
कंटेनर-संरचना-परीक्षण का उपयोग करके स्वचालित रूप से परीक्षण करता है।
फॉरवर्ड पोर्ट.
किसी कंटेनर में चल रहे एप्लिकेशन के लॉग को पढ़ता है।
Java, Node.js, Python, Go में लिखे गए एप्लिकेशन को डीबग करने में मदद करता है।
अब सुविधाओं के बारे में:
स्केफोल्ड में स्वयं कोई क्लस्टर-साइड घटक नहीं है. अर्थात्, इस उपयोगिता का उपयोग करने के लिए Kubernetes को और अधिक कॉन्फ़िगर करने की आवश्यकता नहीं है।
आपके एप्लिकेशन के लिए अलग-अलग पाइपलाइन. क्या आपको विकास करते समय कोड को स्थानीय मिनिक्यूब में और फिर स्टेज या उत्पादन में रोल आउट करने की आवश्यकता है? इस उद्देश्य के लिए वहाँ हैं प्रोफाइल और उपयोगकर्ता कॉन्फ़िगरेशन, पर्यावरण चर और झंडे, जो आपको एक एप्लिकेशन के लिए विभिन्न पाइपलाइनों का वर्णन करने की अनुमति देते हैं।
सीएलआई. YAML में केवल कंसोल उपयोगिता और कॉन्फ़िगरेशन। इंटरनेट पर आप सृजन के प्रयासों के संदर्भ पा सकते हैं प्रायोगिक जीयूआईहालाँकि, फिलहाल इसका मतलब यह है कि किसी को उसकी ज़रूरत है, लेकिन वास्तव में नहीं।
प्रतिरूपकता. स्केफोल्ड एक स्टैंडअलोन हार्वेस्टर नहीं है, बल्कि इसका उद्देश्य विशिष्ट कार्यों के लिए व्यक्तिगत मॉड्यूल या मौजूदा समाधानों का उपयोग करना है।
उत्तरार्द्ध का चित्रण:
असेंबली चरण में आप इसका उपयोग कर सकते हैं:
कनिको या Google क्लाउड बिल्ड का उपयोग करके क्लस्टर में स्थानीय रूप से डॉकर का निर्माण;
स्थानीय स्तर पर बाज़ेल;
जिब मावेन और जिब ग्रैडल स्थानीय रूप से या Google क्लाउड बिल्ड में;
कस्टम बिल्ड स्क्रिप्ट स्थानीय रूप से चलती हैं। यदि आपको कोई अन्य (अधिक लचीला/परिचित/...) बिल्ड समाधान चलाने की आवश्यकता है, तो इसे स्क्रिप्ट में वर्णित किया गया है ताकि स्केफोल्ड इसे लॉन्च कर सके (दस्तावेज़ीकरण से उदाहरण). यह आपको किसी भी संग्राहक का उपयोग करने की अनुमति देता है जिसे स्क्रिप्ट का उपयोग करके कॉल किया जा सकता है;
इसके लिए धन्यवाद, स्केफोल्ड को अद्वितीय कहा जा सकता है सीआई/सीडी के निर्माण के लिए रूपरेखा. इसका उपयोग करते समय वर्कफ़्लो का एक उदाहरण यहां दिया गया है (परियोजना दस्तावेज़ से):
स्केफ़ोल्ड का कार्य सामान्य शब्दों में कैसा दिखता है?
उपयोगिता स्रोत कोड निर्देशिका में परिवर्तनों की निगरानी करती है। यदि फ़ाइलों में संशोधन किए जाते हैं, तो उन्हें कुबेरनेट्स क्लस्टर में एप्लिकेशन पॉड के साथ सिंक्रनाइज़ किया जाता है। यदि संभव हो तो, छवि को पुनः संयोजित किए बिना। अन्यथा, एक नई छवि इकट्ठी हो जाती है।
एकत्रित छवि को कंटेनर-स्ट्रक्चर-टेस्ट का उपयोग करके जांचा जाता है, टैग किया जाता है और डॉकर रजिस्ट्री को भेजा जाता है।
इसके बाद, छवि को कुबेरनेट्स क्लस्टर में तैनात किया गया है।
यदि लॉन्च को कमांड का उपयोग करके आरंभ किया गया था skaffold dev, फिर हम एप्लिकेशन से लॉग प्राप्त करना शुरू करते हैं, और स्केफ़ोल्ड सभी क्रियाओं को फिर से दोहराने के लिए परिवर्तनों की प्रतीक्षा करता है।
स्केफ़ोल्ड ऑपरेशन के मुख्य चरणों का चित्रण
अभ्यास। स्केफोल्ड की कोशिश कर रहा हूँ
स्केफोल्ड के उपयोग को प्रदर्शित करने के लिए, मैं इसका एक उदाहरण लूंगा GitHub प्रोजेक्ट रिपॉजिटरी. वैसे, उसी जगह पर आप कई अन्य उदाहरण पा सकते हैं जो विभिन्न विशिष्टताओं को ध्यान में रखते हैं। मैं मिनीक्यूब में स्थानीय स्तर पर सभी कार्य निष्पादित करूंगा। इंस्टॉलेशन सरल है और इसमें कुछ मिनट लगते हैं, और आरंभ करने के लिए आपको कुबेक्टल की आवश्यकता होगी।
आइए आवश्यक उदाहरणों के साथ स्केफोल्ड के भंडार का क्लोन बनाएं:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
मैंने दो पॉड्स वाला एक उदाहरण चुना, जिनमें से प्रत्येक में एक छोटा गो एप्लिकेशन था। एक एप्लिकेशन फ्रंटएंड (लीरॉय-वेब) है, जो अनुरोध को दूसरे एप्लिकेशन - बैकएंड (लीरॉय-ऐप) पर रीडायरेक्ट करता है। आइए देखें कि यह कैसा दिखता है:
लेरॉय-ऐप और लेरॉय-वेब में स्थानीय स्तर पर इस कोड के निर्माण के लिए गो कोड और सरल डॉकरफाइल्स शामिल हैं:
~/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. इसे मैन्युअल रूप से या सीएलआई के माध्यम से संपादित किया जा सकता है - उदाहरण के लिए, इस तरह:
skaffold config set --global local-cluster true
यह कमांड ग्लोबल वेरिएबल सेट करेगा local-cluster अर्थ में true, जिसके बाद स्केफोल्ड छवियों को दूरस्थ रजिस्ट्री में धकेलने का प्रयास नहीं करेगा। यदि आप स्थानीय स्तर पर विकास कर रहे हैं, तो आप स्थानीय स्तर पर छवियां बनाने के लिए इस कमांड का उपयोग कर सकते हैं।
पर वापस 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/, अर्थात। वह संदर्भ निर्दिष्ट किया गया है जिसमें छवि एकत्र की गई है।
परिनियोजन चरण में, यह निर्धारित किया जाता है कि हम आवश्यक मैनिफ़ेस्ट के लिए कुबेक्टल और एक मास्क का उपयोग करेंगे।
PortForward: उसी प्रकार जैसे हम आम तौर पर पोर्ट का उपयोग करके अग्रेषित करते हैं kubectl port-forward, हम स्केफोल्ड को इस कमांड को कॉल करने के निर्देश देते हैं। इस मामले में, स्थानीय पोर्ट 9000 को नाम के साथ परिनियोजन में 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, और एक ही बार में नहीं।
अधिक अभ्यास
यह भी उल्लेखनीय है कि एक नया प्रोजेक्ट बनाते समय, स्काफोल्ड के लिए कॉन्फ़िगरेशन को कमांड का उपयोग करके बूटस्ट्रैप किया जा सकता है init, जो बहुत सुविधाजनक है. इसके अलावा, आप कई कॉन्फ़िगरेशन लिख सकते हैं: डिफ़ॉल्ट कॉन्फ़िगरेशन पर विकास करें, और फिर कमांड के साथ स्टेज पर रोल आउट करें run (जैसी ही प्रक्रिया dev, बस परिवर्तनों की निगरानी नहीं करता है), एक अलग कॉन्फ़िगरेशन का उपयोग कर रहा है।
काटाकोडा पर है नेतृत्व एक उदाहरण से यह और भी आसान है. लेकिन यह कुबेरनेट्स, एक एप्लिकेशन और स्केफोल्ड के साथ एक तैयार सैंडबॉक्स प्रदान करता है। यदि आप बुनियादी बुनियादी बातों को स्वयं आज़माने में रुचि रखते हैं तो यह एक बढ़िया विकल्प है।
स्केफ़ोल्ड के लिए एक संभावित उपयोग मामला दूरस्थ क्लस्टर पर विकास करना है। हर कोई अपने स्वयं के हार्डवेयर पर मिनिक्यूब चलाने में सहज नहीं है, फिर एप्लिकेशन को रोल आउट करना और यह उम्मीद करना कि यह पर्याप्त रूप से काम करेगा... इस मामले में, स्केफोल्ड समस्या को पूरी तरह से हल करता है, जिसकी पुष्टि की जा सकती है, उदाहरण के लिए, Reddit इंजीनियरों द्वारा, जैसा कि हमारे पास है पहले ही चर्चा हो चुकी है писали हमारे ब्लॉग में।
में और यह प्रकाशन वीववर्क्स से आप उत्पादन के लिए पाइपलाइन बनाने का एक उदाहरण पा सकते हैं।
निष्कर्ष
स्केफ़ोल्ड पाइपलाइनों के निर्माण के लिए एक सुविधाजनक उपकरण है जिसमें कुबेरनेट्स के लिए एप्लिकेशन रोल आउट करना शामिल है और मुख्य रूप से विकास आवश्यकताओं पर केंद्रित है। इससे "छोटी" पाइपलाइन बनाना काफी आसान हो जाता है जो डेवलपर की बुनियादी जरूरतों को ध्यान में रखता है, लेकिन यदि आप चाहें, तो आप बड़ी प्रक्रियाओं को व्यवस्थित कर सकते हैं। सीआई/सीडी प्रक्रियाओं में स्केफोल्ड का उपयोग करने के स्पष्ट उदाहरणों में से एक के रूप में दिया हुआ है ऐसा परीक्षण परियोजना कुबेरनेट्स, जीआरपीसी, इस्तियो और ओपनसेंसस ट्रेसिंग की क्षमताओं का उपयोग करते हुए 10 माइक्रोसर्विसेज में से।
स्केफोल्ड के पास GitHub पर पहले से ही लगभग 8000+ सितारे हैं, जो Google द्वारा विकसित किया गया है और इसका हिस्सा है GoogleContainerTools - सामान्य तौर पर, इस समय यह विश्वास करने का हर कारण है कि परियोजना हमेशा के लिए खुशी से विकसित होगी।