नोंद. अनुवाद: मायक्रोसर्व्हिस आर्किटेक्चर खालील ऍप्लिकेशन्ससाठी आधुनिक पायाभूत सुविधांमध्ये सर्व्हिस मेश निश्चितपणे एक उपयुक्त उपाय बनले आहेत. जरी Istio हे अनेक DevOps अभियंत्यांच्या ओठावर असले तरी, हे एक नवीन उत्पादन आहे जे प्रदान केलेल्या क्षमतांच्या दृष्टीने सर्वसमावेशक असले तरी, त्याच्याशी परिचित होण्यासाठी बराच वेळ लागेल. दूरसंचार कंपनी ऑरेंज नेटवर्क्समधील मोठ्या क्लायंटसाठी क्लाउड कंप्युटिंगसाठी जबाबदार असलेले जर्मन अभियंता रिनोर मालोकू यांनी सामग्रीची एक अद्भुत मालिका लिहिली आहे जी तुम्हाला इस्टिओमध्ये जलद आणि खोलवर जाण्याची परवानगी देते. इस्टिओ सर्वसाधारणपणे काय करू शकतो आणि आपण ते आपल्या स्वत: च्या डोळ्यांनी पटकन कसे पाहू शकता यासह तो त्याच्या कथेची सुरुवात करतो.
इस्टिओ — Google, IBM आणि Lyft च्या संघांच्या सहकार्याने विकसित केलेला मुक्त स्रोत प्रकल्प. हे मायक्रोसर्व्हिसेस-आधारित ऍप्लिकेशन्समध्ये उद्भवणाऱ्या गुंतागुंतीचे निराकरण करते, जसे की:
वाहतूक व्यवस्थापन: कालबाह्य, पुन्हा प्रयत्न, लोड बॅलन्सिंग;
सुरक्षा: अंतिम वापरकर्ता प्रमाणीकरण आणि अधिकृतता;
निरीक्षणक्षमता: ट्रेसिंग, मॉनिटरिंग, लॉगिंग.
या सर्वांचे निराकरण अनुप्रयोग स्तरावर केले जाऊ शकते, परंतु त्यानंतर तुमच्या सेवा यापुढे “मायक्रो” राहणार नाहीत. या समस्यांचे निराकरण करण्यासाठी सर्व अतिरिक्त प्रयत्न म्हणजे कंपनीच्या संसाधनांचा अपव्यय आहे ज्याचा थेट व्यवसाय मूल्यासाठी वापर केला जाऊ शकतो. चला एक उदाहरण पाहू:
प्रकल्प व्यवस्थापक: फीडबॅक वैशिष्ट्य जोडण्यासाठी किती वेळ लागतो?
विकसक: दोन स्प्रिंट.
खासदार: काय?... हे फक्त CRUD आहे!
R: CRUD करणे हा सोपा भाग आहे, परंतु तरीही आम्हाला वापरकर्ते आणि सेवा प्रमाणित आणि अधिकृत करणे आवश्यक आहे. नेटवर्क अविश्वसनीय असल्याने, आपल्याला वारंवार विनंत्या लागू करणे आवश्यक आहे, तसेच सर्किट ब्रेकर नमुना ग्राहकांमध्ये. तसेच, संपूर्ण सिस्टीम क्रॅश होणार नाही याची खात्री करण्यासाठी, तुम्हाला कालबाह्यता आणि बल्कहेड्स(उल्लेखित दोन्ही नमुन्यांबद्दल अधिक तपशीलांसाठी, लेखात नंतर पहा - अंदाजे भाषांतर.), आणि समस्या शोधण्यासाठी, मॉनिटरिंग, ट्रेसिंग, […]
खासदार: अरे, मग उत्पादन सेवेमध्ये हे वैशिष्ट्य समाविष्ट करूया.
मला वाटते की कल्पना स्पष्ट आहे: एक सेवा जोडण्यासाठी आवश्यक पावले आणि प्रयत्नांची संख्या प्रचंड आहे. या लेखात, सेवांमधून Istio वर नमूद केलेल्या सर्व क्लिष्टता (जे व्यवसाय तर्क म्हणून हेतू नाही) कसे काढून टाकते ते आम्ही पाहू.
शेरा: हा लेख असे गृहीत धरतो की तुम्हाला कुबर्नेट्सचे कार्य ज्ञान आहे. अन्यथा, मी वाचण्याची शिफारस करतो कुबर्नेट्सशी माझा परिचय आणि त्यानंतरच ही सामग्री वाचणे सुरू ठेवा.
Istio कल्पना
Istio नसलेल्या जगात, एक सेवा दुसर्याला थेट विनंती करते आणि अयशस्वी झाल्यास, सेवेने ती स्वतः हाताळली पाहिजे: नवीन प्रयत्न करा, कालबाह्य प्रदान करा, सर्किट ब्रेकर उघडा इ.
Kubernetes मध्ये नेटवर्क रहदारी
Istio एक विशेष उपाय ऑफर करते, नेटवर्क संप्रेषणामध्ये हस्तक्षेप करून सेवांपासून पूर्णपणे विभक्त आणि कार्य करते. आणि अशा प्रकारे ते लागू करते:
चुकीची सहनशीलता: प्रतिसादातील स्थिती कोडच्या आधारावर, विनंती अयशस्वी झाली की नाही हे समजते आणि ते पुन्हा कार्यान्वित करते.
कॅनरी रोलआउट्स: सेवेच्या नवीन आवृत्तीवर विनंत्यांची केवळ निश्चित टक्केवारी पुनर्निर्देशित करते.
देखरेख आणि मेट्रिक्स: सेवेला प्रतिसाद देण्यासाठी किती वेळ लागला?
ट्रेसिंग आणि निरीक्षणक्षमता: प्रत्येक विनंतीवर विशेष शीर्षलेख जोडते आणि त्यांना संपूर्ण क्लस्टरमध्ये ट्रेस करते.
सुरक्षा: JWT टोकन पुनर्प्राप्त करते, वापरकर्त्यांना प्रमाणीकृत करते आणि अधिकृत करते.
या फक्त काही शक्यता आहेत (खरोखर फक्त काही!) तुम्हाला वेधण्यासाठी. आता तांत्रिक तपशीलात जाऊया!
Istio आर्किटेक्चर
Istio सर्व नेटवर्क ट्रॅफिकमध्ये अडथळा आणते आणि प्रत्येक पॉडमध्ये साइडकार कंटेनरच्या स्वरूपात एक स्मार्ट प्रॉक्सी टाकून त्यावर नियमांचा संच लागू करते. सर्व क्षमता सक्रिय करणारे प्रॉक्सी फॉर्म a डेटा प्लेन, आणि ते वापरून गतिशीलपणे कॉन्फिगर केले जाऊ शकतात नियंत्रण विमान.
डेटा प्लेन
पॉड्समध्ये घातलेल्या प्रॉक्सी इस्टिओला आम्हाला आवश्यक असलेल्या गरजा सहजपणे पूर्ण करण्यास अनुमती देतात. उदाहरणार्थ, पुन्हा प्रयत्न आणि सर्किट ब्रेकर फंक्शन्स तपासू.
एन्व्हॉयमध्ये पुन्हा प्रयत्न आणि सर्किट ब्रेकिंग कसे लागू केले जातात
सारांश
दूत (आम्ही साइडकार कंटेनरमध्ये असलेल्या प्रॉक्सीबद्दल बोलत आहोत, जे म्हणून वितरीत केले जाते स्वतंत्र उत्पादन - अंदाजे अनुवाद.) सेवेच्या पहिल्या उदाहरणास विनंती पाठवते आणि अयशस्वी होते.
दूत साइडकार पुन्हा प्रयत्न करतो (पुन्हा प्रयत्न करा). (1)
विनंती अयशस्वी झाली आणि ती कॉल केलेल्या प्रॉक्सीकडे परत केली जाते.
हे सर्किट ब्रेकर उघडते आणि त्यानंतरच्या विनंत्यांसाठी पुढील सेवेला कॉल करते. (2)
याचा अर्थ असा की तुम्हाला दुसरी पुन्हा प्रयत्न करण्याची लायब्ररी वापरण्याची गरज नाही, तुम्हाला सर्किट ब्रेकिंग आणि सर्व्हिस डिस्कवरीची प्रोग्रामिंग भाषा X, Y किंवा Z मध्ये स्वतःची अंमलबजावणी करण्याची गरज नाही. हे सर्व आणि बरेच काही बॉक्सच्या बाहेर उपलब्ध आहे. Istio मध्ये आणि आवश्यक नाही नाही कोडमधील बदल.
छान! आता तुम्हाला Istio सह प्रवासाला जायचे असेल, परंतु तरीही तुमच्या मनात काही शंका आहेत, खुले प्रश्न आहेत. जर हा जीवनातील सर्व प्रसंगांसाठी एक सार्वत्रिक उपाय असेल, तर तुम्हाला एक नैसर्गिक शंका आहे: तथापि, प्रत्यक्षात असे सर्व उपाय कोणत्याही परिस्थितीत अयोग्य असल्याचे दिसून येते.
आणि शेवटी तुम्ही विचाराल: "ते सानुकूल करण्यायोग्य आहे का?"
आता तुम्ही समुद्राच्या प्रवासासाठी तयार आहात, चला कंट्रोल प्लेनशी परिचित होऊ या.
नियंत्रण विमान
यात तीन घटक असतात: पायलट, मिक्सर и किल्ला, जे मार्ग रहदारीसाठी दूतांना कॉन्फिगर करण्यासाठी, धोरणांची अंमलबजावणी करण्यासाठी आणि टेलिमेट्री डेटा संकलित करण्यासाठी एकत्र काम करतात. योजनाबद्धरित्या हे सर्व असे दिसते:
डेटा प्लेनसह नियंत्रण विमानाचा परस्परसंवाद
दूत (म्हणजे डेटा प्लेन) वापरून कॉन्फिगर केले जातात कुबर्नेट्स सीआरडी (सानुकूल संसाधन व्याख्या) Istio द्वारे परिभाषित आणि विशेषत: या उद्देशासाठी आहे. तुमच्यासाठी याचा अर्थ असा आहे की ते परिचित वाक्यरचना असलेले कुबर्नेट्समधील दुसरे संसाधन असल्याचे दिसून येते. एकदा तयार झाल्यानंतर, हे संसाधन नियंत्रण विमानाद्वारे उचलले जाईल आणि दूतांना लागू केले जाईल.
Istio सेवांचा संबंध
आम्ही सेवांशी इस्टिओचा संबंध वर्णन केला आहे, परंतु उलट नाही: सेवा इस्टिओशी कशा संबंधित आहेत?
प्रामाणिकपणे सांगायचे तर, सेवांना इस्टिओच्या उपस्थितीची जाणीव असते जसे मासे पाण्याचे असतात जेव्हा ते स्वतःला विचारतात, "तरीही पाणी काय आहे?"
अशा प्रकारे, आपण कार्यरत क्लस्टर घेऊ शकता आणि Istio घटक तैनात केल्यानंतर, त्यामध्ये असलेल्या सेवा कार्य करत राहतील आणि हे घटक काढून टाकल्यानंतर, सर्वकाही पुन्हा ठीक होईल. हे स्पष्ट आहे की या प्रकरणात आपण Istio द्वारे प्रदान केलेल्या क्षमता गमावाल.
पुरेसा सिद्धांत - चला हे ज्ञान व्यवहारात आणूया!
सराव मध्ये Istio
Istio ला किमान 4 vCPUs आणि 8 GB RAM उपलब्ध असलेले Kubernetes क्लस्टर आवश्यक आहे. क्लस्टर द्रुतपणे सेट करण्यासाठी आणि लेखातील सूचनांचे अनुसरण करण्यासाठी, मी Google क्लाउड प्लॅटफॉर्म वापरण्याची शिफारस करतो, जे नवीन वापरकर्त्यांना ऑफर करते विनामूल्य $300.
क्लस्टर तयार केल्यानंतर आणि कन्सोल युटिलिटीद्वारे कुबर्नेट्समध्ये प्रवेश कॉन्फिगर केल्यानंतर, तुम्ही हेल्म पॅकेज मॅनेजरद्वारे Istio स्थापित करू शकता.
हेल्म स्थापना
तुमच्या संगणकावर हेल्म क्लायंट स्थापित करा, जसे मध्ये वर्णन केले आहे अधिकृत दस्तऐवजीकरण. आम्ही पुढील विभागात Istio स्थापित करण्यासाठी टेम्पलेट्स व्युत्पन्न करण्यासाठी याचा वापर करू.
Istio स्थापित करत आहे
वरून Istio संसाधने डाउनलोड करा नवीनतम प्रकाशन(1.0.5 आवृत्तीचा मूळ लेखकाचा दुवा सध्याच्या आवृत्तीवर बदलला आहे, म्हणजे 1.0.6 - अंदाजे अनुवाद.), सामग्री एका डिरेक्टरीमध्ये काढा, ज्याला मी यापुढे कॉल करेन [istio-resources].
Istio संसाधने सहज ओळखण्यासाठी, K8s क्लस्टरमध्ये नेमस्पेस तयार करा istio-system:
$ kubectl create namespace istio-system
डिरेक्टरीवर जाऊन इंस्टॉलेशन पूर्ण करा [istio-resources] आणि कमांड चालवा:
ही कमांड फाईलमध्ये Istio चे मुख्य घटक आउटपुट करेल istio.yaml. आम्ही खालील पॅरामीटर्स निर्दिष्ट करून, स्वतःला अनुरूप मानक टेम्पलेट सुधारित केले:
global.mtls.enabled मध्ये स्थापित false(म्हणजे mTLS प्रमाणीकरण अक्षम केले आहे - अंदाजे.)आमची डेटिंग प्रक्रिया सुलभ करण्यासाठी;
tracing.enabled Jaeger वापरून विनंती ट्रेसिंग समाविष्ट आहे;
kiali.enabled सेवा आणि रहदारीची कल्पना करण्यासाठी क्लस्टरमध्ये Kiali स्थापित करते;
grafana.enabled गोळा केलेले मेट्रिक्स व्हिज्युअलाइज करण्यासाठी Grafana इंस्टॉल करते.
व्युत्पन्न संसाधने कमांडसह वापरू या:
$ kubectl apply -f istio.yaml
क्लस्टरवर Istio ची स्थापना पूर्ण झाली आहे! सर्व शेंगा नेमस्पेसमध्ये येईपर्यंत प्रतीक्षा करा istio-system सक्षम असेल Running किंवा Completedखालील आदेश चालवून:
$ kubectl get pods -n istio-system
आता आम्ही पुढील विभागात सुरू ठेवण्यासाठी तयार आहोत, जिथे आम्ही अनुप्रयोग सुरू करू.
सेंटिमेंट अॅनालिसिस ऍप्लिकेशनचे आर्किटेक्चर
आधीच नमूद केलेल्या सेंटिमेंट अॅनालिसिस मायक्रोसर्व्हिस ऍप्लिकेशनचे उदाहरण वापरू कुबर्नेट्सचा परिचय लेख. सराव मध्ये Istio च्या क्षमता दर्शविण्यासाठी ते पुरेसे जटिल आहे.
अनुप्रयोगात चार सूक्ष्म सेवांचा समावेश आहे:
सेवा एसए-फ्रंटएंड, जे Reactjs ऍप्लिकेशनच्या फ्रंटएंडला सर्व्ह करते;
सेवा SA-WebApp, जे भावना विश्लेषण प्रश्नांची सेवा देते;
सेवा एसए- तर्कशास्त्र, जे स्वतः कार्य करते भावना विश्लेषण;
सेवा SA- अभिप्राय, जे विश्लेषणाच्या अचूकतेबद्दल वापरकर्त्यांकडून अभिप्राय प्राप्त करते.
या आकृतीमध्ये, सेवांव्यतिरिक्त, आम्ही इंग्रेस कंट्रोलर देखील पाहतो, जो कुबर्नेट्समध्ये योग्य सेवांसाठी येणार्या विनंत्या पाठवतो. Istio त्याच्या Ingress Gateway मध्ये समान संकल्पना वापरते, ज्याचे अधिक तपशील पुढे येतील.
Istio कडून प्रॉक्सीसह अनुप्रयोग चालवित आहे
लेखात नमूद केलेल्या पुढील ऑपरेशन्ससाठी, तुमचे भांडार क्लोन करा istio-mastery. यात कुबर्नेट्स आणि इस्टिओसाठी ऍप्लिकेशन आणि मॅनिफेस्ट आहेत.
साइडकार घालत आहे
अंतर्भूत करता येते आपोआप किंवा स्वहस्ते. साइडकार कंटेनर स्वयंचलितपणे घालण्यासाठी, तुम्हाला नेमस्पेसवर लेबल सेट करणे आवश्यक आहे istio-injection=enabled, जे खालील आदेशाने केले जाते:
आता प्रत्येक पॉड जो डीफॉल्ट नेमस्पेसमध्ये तैनात केला जाईल (default) त्याचा साइडकार कंटेनर प्राप्त करेल. याची पडताळणी करण्यासाठी, रेपॉजिटरीच्या मूळ निर्देशिकेवर जाऊन चाचणी अनुप्रयोग उपयोजित करूया [istio-mastery] आणि खालील आदेश चालवा:
$ kubectl apply -f resource-manifests/kube
persistentvolumeclaim/sqlite-pvc created
deployment.extensions/sa-feedback created
service/sa-feedback created
deployment.extensions/sa-frontend created
service/sa-frontend created
deployment.extensions/sa-logic created
service/sa-logic created
deployment.extensions/sa-web-app created
service/sa-web-app created
सेवा उपयोजित केल्यावर, कमांड चालवून पॉड्समध्ये दोन कंटेनर आहेत (स्वत: सेवेसह आणि त्याच्या साइडकारसह) तपासूया. kubectl get pods आणि स्तंभाखाली याची खात्री करा READY मूल्य निर्दिष्ट 2/2, दोन्ही कंटेनर चालू असल्याचे प्रतीक:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sa-feedback-55f5dc4d9c-c9wfv 2/2 Running 0 12m
sa-frontend-558f8986-hhkj9 2/2 Running 0 12m
sa-logic-568498cb4d-2sjwj 2/2 Running 0 12m
sa-logic-568498cb4d-p4f8c 2/2 Running 0 12m
sa-web-app-599cf47c7c-s7cvd 2/2 Running 0 12m
दृश्यमानपणे हे असे दिसते:
एका पॉडमध्ये दूत प्रॉक्सी
आता ऍप्लिकेशन चालू झाले आहे, आम्हाला इनकमिंग ट्रॅफिकला ऍप्लिकेशनमध्ये येण्याची परवानगी द्यावी लागेल.
प्रवेशद्वार
हे साध्य करण्यासाठी सर्वोत्तम सराव (क्लस्टरमध्ये रहदारीला परवानगी द्या) आहे प्रवेशद्वार Istio मध्ये, जे क्लस्टरच्या "एज" वर स्थित आहे आणि तुम्हाला Istio वैशिष्ट्ये जसे की राउटिंग, लोड बॅलन्सिंग, सुरक्षा आणि इनकमिंग ट्रॅफिकसाठी मॉनिटरिंग सक्षम करण्यास अनुमती देते.
इंग्रेस गेटवे घटक आणि ते बाहेरून पुढे नेणारी सेवा क्लस्टरमध्ये Istio स्थापनेदरम्यान स्थापित केली गेली. सेवेचा बाह्य IP पत्ता शोधण्यासाठी, चालवा:
$ kubectl get svc -n istio-system -l istio=ingressgateway
NAME TYPE CLUSTER-IP EXTERNAL-IP
istio-ingressgateway LoadBalancer 10.0.132.127 13.93.30.120
आम्ही हा IP वापरून ऍप्लिकेशन ऍक्सेस करणे सुरू ठेवू (मी त्याचा संदर्भ EXTERNAL-IP म्हणून देईन), त्यामुळे सोयीसाठी आम्ही व्हेरिएबलमध्ये मूल्य लिहू:
$ EXTERNAL_IP=$(kubectl get svc -n istio-system
-l app=istio-ingressgateway
-o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
जर तुम्ही आता ब्राउझरद्वारे या आयपीमध्ये प्रवेश करण्याचा प्रयत्न केला, तर तुम्हाला सेवा अनुपलब्ध त्रुटी प्राप्त होईल, कारण पूर्वनिर्धारितपणे Istio सर्व येणारे रहदारी अवरोधित करते, गेटवेची अद्याप व्याख्या झालेली नाही.
गेटवे संसाधन
गेटवे हे कुबर्नेट्समधील एक CRD (कस्टम रिसोर्स डेफिनिशन) आहे, जे क्लस्टरमध्ये Istio स्थापित केल्यानंतर परिभाषित केले जाते आणि पोर्ट, प्रोटोकॉल आणि होस्ट निर्दिष्ट करण्याची क्षमता सक्षम करते ज्यासाठी आम्ही येणार्या रहदारीला परवानगी देऊ इच्छितो.
आमच्या बाबतीत, आम्ही सर्व होस्टसाठी पोर्ट 80 वर HTTP रहदारीला परवानगी देऊ इच्छितो. कार्य खालील व्याख्येनुसार लागू केले आहे (http-gateway.yaml):
या कॉन्फिगरेशनला निवडकर्त्याशिवाय कोणत्याही स्पष्टीकरणाची आवश्यकता नाही istio: ingressgateway. या सिलेक्टरच्या सहाय्याने आपण कोणत्या इंग्रेस गेटवेवर कॉन्फिगरेशन लागू करायचे ते निर्दिष्ट करू शकतो. आमच्या बाबतीत, हे इंग्रेस गेटवे कंट्रोलर आहे, जे इस्टिओमध्ये डीफॉल्टनुसार स्थापित केले गेले होते.
खालील कमांड कॉल करून कॉन्फिगरेशन लागू केले जाते:
$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created
गेटवे आता पोर्ट 80 मध्ये प्रवेश करण्यास अनुमती देतो, परंतु विनंत्या कुठे मार्गस्थ करायच्या याची कल्पना नाही. यासाठी आपल्याला आवश्यक असेल आभासी सेवा.
आभासी सेवा संसाधन
व्हर्च्युअल सर्व्हिस क्लस्टरमध्ये परवानगी असलेल्या विनंत्या कशा मार्गाने करायच्या हे इंग्रेस गेटवेला सांगते.
Этот VirtualService относится к запросам, приходящим через http-gateway;
В destination определяется сервис, куда отправляются запросы.
Примечание: Конфигурация выше хранится в файле sa-virtualservice-external.yaml, который также содержит настройки для маршрутизации в SA-WebApp и SA-Feedback, но был сокращён здесь в статье для лаконичности.
Применим VirtualService вызовом:
$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
virtualservice.networking.istio.io/sa-external-services created
Примечание: Когда мы применяем ресурсы Istio, Kubernetes API Server создаёт событие, которое получает Istio Control Plane, и уже после этого новая конфигурация применяется к прокси-серверам Envoy каждого pod'а. А контроллер Ingress Gateway представляется очередным Envoy, сконфигурированным в Control Plane. Всё это на схеме выглядит так:
Конфигурация Istio-IngressGateway для маршрутизации запросов
Приложение Sentiment Analysis стало доступным по http://{EXTERNAL-IP}/. Не переживайте, если вы получаете статус Not Found: иногда требуется чуть больше времени для того, чтобы конфигурация вступила в силу и кэши Envoy обновились.
Перед тем, как продолжить, поработайте немного с приложением, чтобы сгенерировать трафик (его наличие необходимо для наглядности в последующих действиях — прим. перев.).
Kiali : наблюдаемость
Чтобы попасть в административный интерфейс Kiali, выполните следующую команду:
$ kubectl port-forward
$(kubectl get pod -n istio-system -l app=kiali
-o jsonpath='{.items[0].metadata.name}')
-n istio-system 20001
… и откройте http://localhost:20001/, залогинившись под admin/admin. Здесь вы найдете множество полезных возможностей, например, для проверки конфигурации компонентов Istio, визуализации сервисов по информации, собранной при перехвате сетевых запросов, получения ответов на вопросы «Кто к кому обращается?», «У какой версии сервиса возникают сбои?» и т.п. В общем, изучите возможности Kiali перед тем, как двигаться дальше — к визуализации метрик с Grafana.
Grafana: визуализация метрик
Собранные в Istio метрики попадают в Prometheus и визуализируются с Grafana. Чтобы попасть в административный интерфейс Grafana, выполните команду ниже, после чего откройте http://localhost:3000/:
$ kubectl -n istio-system port-forward
$(kubectl -n istio-system get pod -l app=grafana
-o jsonpath={.items[0].metadata.name}) 3000
Кликнув на меню Home слева сверху и выбрав Istio Service Dashboard в левом верхнем углу, начните с сервиса sa-web-app, чтобы посмотреть на собранные метрики:
Здесь нас ждёт пустое и совершенно скучное представление — руководство никогда такое не одобрит. Давайте же создадим небольшую нагрузку следующей командой:
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
Вот теперь у нас гораздо более симпатичные графики, а в дополнение к ним — замечательные инструменты Prometheus для мониторинга и Grafana для визуализации метрик, что позволят нам узнать о производительности, состоянии здоровья, улучшениях/деградации в работе сервисов на протяжении времени.
Наконец, посмотрим на трассировку запросов в сервисах.
Jaeger : трассировка
Трассировка нам потребуется, потому что чем больше у нас сервисов, тем сложнее добраться до причины сбоя. Посмотрим на простой случай из картинки ниже:
Типовой пример случайного неудачного запроса
Запрос приходит, падает — в чём же причина? Первый сервис? Или второй? Исключения есть в обоих — давайте посмотрим на логи каждого. Как часто вы ловили себя за таким занятием? Наша работа больше похожа на детективов программного обеспечения, а не разработчиков…
Это широко распространённая проблема в микросервисах и решается она распределёнными системами трассировки, в которых сервисы передают друг другу уникальный заголовок, после чего эта информация перенаправляется в систему трассировки, где она сопоставляется с данными запроса. Вот иллюстрация:
Для идентификации запроса используется TraceId
В Istio используется Jaeger Tracer, который реализует независимый от вендоров фреймворк OpenTracing API. Получить доступ к пользовательского интерфейсу Jaeger можно следующей командой:
$ kubectl port-forward -n istio-system
$(kubectl get pod -n istio-system -l app=jaeger
-o jsonpath='{.items[0].metadata.name}') 16686
Теперь зайдите на http://localhost:16686/ и выберите сервис sa-web-app. Если сервис не показан в выпадающем меню — проявите/сгенерируйте активность на странице и обновите интерфейс. После этого нажмите на кнопку Find Traces, которая покажет самые последние трейсы — выберите любой — покажется детализированная информация по всем трейсам:
Этот трейс показывает:
Запрос приходит в istio-ingressgateway (это первое взаимодействие с одним из сервисов, и для запроса генерируется Trace ID), после чего шлюз направляет запрос в сервис sa-web-app.
В сервисе sa-web-app запрос подхватывается Envoy sidecar'ом, создаётся «ребёнок» в span'е (поэтому мы видим его в трейсах) и перенаправляется в контейнер sa-web-app. (Span — логическая единица работы в Jaeger, имеющая название, время начало операции и её продолжительность. Span'ы могут быть вложенными и упорядоченными. Ориентированный ациклический граф из span'ов образует trace. — прим. перев.)
Здесь запрос обрабатывается методом sentimentAnalysis. Эти трейсы уже сгенерированы приложением, т.е. для них потребовались изменения в коде.
С этого момента инициируется POST-запрос в sa-logic. Trace ID должен быть проброшен из sa-web-app.
…
Примечание: На 4 шаге приложение должно увидеть заголовки, сгенерированные Istio, и передать их в последующие запросы, как показано на изображении ниже:
(A) За проброс заголовков отвечает Istio; (B) За заголовки отвечают сервисы
Istio делает основную работу, т.к. генерирует заголовки для входящих запросов, создаёт новые span'ы в каждом sidecare'е и пробрасывает их. Однако без работы с заголовками внутри сервисов полный путь трассировки запроса будет утерян.
Необходимо учитывать (пробрасывать) следующие заголовки:
Это несложная задача, однако для упрощения её реализации уже существует множество библиотек — например, в сервисе sa-web-app клиент RestTemplate пробрасывает эти заголовки, если просто добавить библиотеки Jaeger и OpenTracing в его зависимости.
Заметьте, что приложение Sentiment Analysis демонстрирует реализации на Flask, Spring и ASP.NET Core.
Теперь, когда стало ясно, что мы получаем из коробки (или почти «из коробки»), рассмотрим вопросы тонко настраиваемой маршрутизации, управления сетевым трафиком, безопасности и т.п.!
Прим. перев.: об этом читайте в следующей части материалов по Istio от Rinor Maloku, переводы которых последуют в нашем блоге в ближайшее время. UPDATE (14 марта): Вторая часть уже опубликована.
या व्हर्च्युअल सर्व्हिसद्वारे येणाऱ्या विनंत्यांचा संदर्भ आहे http-गेटवे;
В destination ज्या सेवेला विनंत्या पाठवल्या जातात ते निश्चित केले जाते.
शेरा: वरील कॉन्फिगरेशन फाईलमध्ये संग्रहित आहे sa-virtualservice-external.yaml, ज्यामध्ये SA-WebApp आणि SA-फीडबॅक मधील रूटिंगसाठी सेटिंग्ज देखील आहेत, परंतु संक्षिप्ततेसाठी लेखात येथे लहान केले आहे.
चला कॉल करून व्हर्च्युअल सर्व्हिस लागू करूया:
शेरा: जेव्हा आम्ही Istio संसाधने वापरतो, तेव्हा Kubernetes API सर्व्हर एक इव्हेंट तयार करतो जो Istio कंट्रोल प्लेनद्वारे प्राप्त होतो आणि त्यानंतर नवीन कॉन्फिगरेशन प्रत्येक पॉडच्या दूत प्रॉक्सीवर लागू केले जाते. आणि इनग्रेस गेटवे कंट्रोलर कंट्रोल प्लेनमध्ये कॉन्फिगर केलेला दुसरा दूत असल्याचे दिसते. हे सर्व आकृतीमध्ये असे दिसते:
भावना विश्लेषण अर्ज आता उपलब्ध आहे http://{EXTERNAL-IP}/. तुम्हाला नॉट फाउंड स्टेटस मिळाल्यास काळजी करू नका: काहीवेळा कॉन्फिगरेशन प्रभावी होण्यासाठी आणि एन्वॉय कॅशे अद्यतनित होण्यासाठी थोडा जास्त वेळ लागतो.
पुढे जाण्यापूर्वी, रहदारी निर्माण करण्यासाठी अॅपसह थोडासा खेळा. (त्याची उपस्थिती पुढील क्रियांमध्ये स्पष्टतेसाठी आवश्यक आहे - अंदाजे भाषांतर.).
कियाली: निरीक्षणक्षमता
Kiali प्रशासकीय इंटरफेसवर जाण्यासाठी, खालील आदेश चालवा:
... आणि उघडा http://localhost:20001/, प्रशासक/प्रशासक म्हणून लॉग इन करा. येथे तुम्हाला अनेक उपयुक्त वैशिष्ट्ये आढळतील, उदाहरणार्थ, Istio घटकांचे कॉन्फिगरेशन तपासण्यासाठी, नेटवर्क विनंत्यांमधून संकलित केलेली माहिती वापरून सेवांची कल्पना करणे, "कोण कोणाशी संपर्क साधत आहे?", "सेवेची कोणती आवृत्ती अनुभवत आहे" या प्रश्नांची उत्तरे मिळवा. अपयश?" आणि असेच. सर्वसाधारणपणे, Grafana सह मेट्रिक्सचे व्हिज्युअलायझेशन करण्यासाठी पुढे जाण्यापूर्वी Kiali ची क्षमता एक्सप्लोर करा.
ग्राफना: मेट्रिक्स व्हिज्युअलायझेशन
Istio मध्ये गोळा केलेले मेट्रिक्स Prometheus मध्ये जातात आणि Grafana सह व्हिज्युअलाइज केले जातात. Grafana प्रशासकीय इंटरफेसवर जाण्यासाठी, खालील आदेश चालवा आणि नंतर उघडा http://localhost:3000/:
मेनूवर क्लिक करून होम पेज वर डावीकडे आणि निवडत आहे Istio सेवा डॅशबोर्ड वरच्या डाव्या कोपर्यात, सेवेसह प्रारंभ करा sa-web-appगोळा केलेले मेट्रिक्स पाहण्यासाठी:
येथे आपली वाट पाहत आहे ती एक रिक्त आणि पूर्णपणे कंटाळवाणी कामगिरी आहे - व्यवस्थापन हे कधीही मंजूर करणार नाही. खालील कमांडसह एक छोटासा भार तयार करूया:
आता आमच्याकडे खूप छान आलेख आहेत, आणि त्यांच्या व्यतिरिक्त, देखरेखीसाठी अप्रतिम प्रोमिथियस साधने आणि मेट्रिक्सचे व्हिज्युअलायझेशन करण्यासाठी ग्राफाना जे आम्हाला कार्यप्रदर्शन, आरोग्य, सेवांमधील सुधारणा/अधोगती याविषयी जाणून घेण्यास अनुमती देईल.
शेवटी, सेवांमधील विनंत्या ट्रेसिंग पाहू.
जेगर: ट्रेसिंग
आम्हाला ट्रेसिंगची आवश्यकता असेल कारण आमच्याकडे जितक्या जास्त सेवा आहेत, तितकेच बिघाडाचे कारण शोधणे अधिक कठीण आहे. खालील चित्रातून एक साधी केस पाहू.
यादृच्छिक अयशस्वी विनंतीचे सामान्य उदाहरण
विनंती येते, पडते - कारण काय आहे? पहिली सेवा? किंवा दुसरा? दोन्हीमध्ये अपवाद आहेत - चला प्रत्येकाच्या नोंदी पाहू. तुम्ही स्वतःला हे करताना किती वेळा पकडले आहे? आमचे काम डेव्हलपरपेक्षा सॉफ्टवेअर डिटेक्टिव्हसारखे आहे...
मायक्रोसर्व्हिसेसमधील ही एक सामान्य समस्या आहे आणि वितरित ट्रेसिंग सिस्टमद्वारे सोडविली जाते, ज्यामध्ये सेवा एकमेकांना एक अद्वितीय शीर्षलेख देतात, त्यानंतर ही माहिती ट्रेसिंग सिस्टमकडे पाठविली जाते, जिथे विनंती डेटाशी तुलना केली जाते. येथे एक उदाहरण आहे:
विनंती ओळखण्यासाठी TraceId वापरला जातो
Istio Jaeger Tracer वापरते, जे विक्रेता-स्वतंत्र OpenTracing API फ्रेमवर्क लागू करते. तुम्ही खालील आदेशासह Jaeger वापरकर्ता इंटरफेसमध्ये प्रवेश करू शकता:
आता वर जा http://localhost:16686/ आणि सेवा निवडा sa-web-app. ड्रॉप-डाउन मेनूमध्ये सेवा दर्शविली नसल्यास, पृष्ठावरील क्रियाकलाप दर्शवा/जनरेट करा आणि इंटरफेस अद्यतनित करा. त्यानंतर, बटणावर क्लिक करा ट्रेस शोधा, जे नवीनतम ट्रेस दर्शवेल - कोणतेही निवडा - सर्व ट्रेसवरील तपशीलवार माहिती दिसून येईल:
हा ट्रेस दर्शवितो:
विनंती येते istio-ingressgateway (एखाद्या सेवेशी हा पहिला संवाद आहे आणि विनंतीसाठी ट्रेस आयडी तयार केला जातो), त्यानंतर गेटवे सेवेला विनंती पाठवतो sa-web-app.
च्या नोकरीत sa-web-app विनंती दूत साइडकारद्वारे उचलली जाते, स्पॅनमध्ये एक "मुल" तयार केले जाते (म्हणूनच आम्ही ते ट्रेसमध्ये पाहतो) आणि कंटेनरवर पुनर्निर्देशित केले जाते sa-web-app. (कालावधी - जेगरमधील कामाचे तार्किक युनिट, ज्याचे नाव, ऑपरेशन सुरू होण्याची वेळ आणि त्याचा कालावधी आहे. स्पॅन नेस्टेड आणि ऑर्डर केले जाऊ शकतात. स्पॅन्सचा निर्देशित अॅसायक्लिक आलेख ट्रेस बनवतो. - अंदाजे अनुवाद.)
येथे विनंती पद्धतीद्वारे प्रक्रिया केली जाते भावना विश्लेषण. हे ट्रेस अनुप्रयोगाद्वारे आधीच व्युत्पन्न केले आहेत, म्हणजे. त्यांना कोड बदल आवश्यक आहेत.
या क्षणापासून, POST विनंती सुरू केली आहे तर्कशास्त्र. ट्रेस आयडी कडून फॉरवर्ड करणे आवश्यक आहे sa-web-app.
...
शेरा: चरण 4 मध्ये, ऍप्लिकेशनने Istio द्वारे व्युत्पन्न केलेले शीर्षलेख पहावे आणि खालील प्रतिमेमध्ये दर्शविल्याप्रमाणे त्यांना पुढील विनंत्यांकडे पाठवावे:
(ए) हेडर फॉरवर्ड करण्यासाठी Istio जबाबदार आहे; (ब) सेवा शीर्षलेखांसाठी जबाबदार आहेत
Istio बहुतेक काम करते कारण... येणार्या विनंत्यांसाठी शीर्षलेख व्युत्पन्न करते, प्रत्येक साइडकेअरमध्ये नवीन स्पॅन तयार करते आणि त्यांना पुढे पाठवते. तथापि, सेवांच्या अंतर्गत शीर्षलेखांसह कार्य न करता, संपूर्ण विनंती ट्रेस मार्ग गमावला जाईल.
खालील शीर्षलेख विचारात घेतले पाहिजेत:
हे कठीण काम नाही, परंतु त्याची अंमलबजावणी सुलभ करण्यासाठी आधीपासूनच आहे अनेक लायब्ररी - उदाहरणार्थ, sa-web-app सेवेमध्ये, तुम्ही फक्त Jaeger आणि OpenTracing लायब्ररी जोडल्यास, RestTemplate क्लायंट हे हेडर फॉरवर्ड करतो त्याची व्यसने.
लक्षात घ्या की सेंटिमेंट अॅनालिसिस ऍप्लिकेशन फ्लास्क, स्प्रिंग आणि ASP.NET कोअरमध्ये अंमलबजावणीचे प्रदर्शन करते.
आता हे स्पष्ट झाले आहे की आपण बॉक्समधून काय मिळवू शकतो (किंवा जवळजवळ बॉक्सच्या बाहेर), चला फाईन-ट्यून केलेले रूटिंग, नेटवर्क ट्रॅफिक व्यवस्थापन, सुरक्षा इत्यादी पाहूया!
नोंद. अनुवाद: Rinor Maloku वरील Istio वरील सामग्रीच्या पुढील भागात याबद्दल वाचा, ज्याची भाषांतरे नजीकच्या भविष्यात आमच्या ब्लॉगवर येतील. अद्ययावत करा (14 मार्च): दुसरा भाग आधीच प्रकाशित केले आहे.