एग्रीगेशन लेयर को कॉन्फ़िगर करने से कुबेरनेट्स apiserver को अतिरिक्त APIs के साथ विस्तारित किया जा सकता है, जो कोर कुबेरनेट्स APIs का हिस्सा नहीं हैं।
आपको कुबरनेट्स क्लस्टर की ज़रूरत पड़ेगी और क्यूब सीटीएल कमांड लाइन साधन को समनुरूप करना होगा ताकि वो आपके क्लस्टर के साथ संवाद कर सकें। हमारी सलाह है की इस टुटोरिअल को क्लस्टर में रन करने के लिए कम से कम दो नोड का इस्तेमाल करे जो कि कंट्रोल प्लेन होस्ट के तरह ना एक्ट करे। अगर आपके पास पहले से क्लस्टर नही है, आप minikube की मदद से वह बना सकते है या आप नीचे दिए हुए इन दो कुबरनेट्स प्लेग्राउंड का इस्तेमाल कर सकते हैं:
संस्करण की जांच करने के लिए, लिखें kubectl version.
कस्टम रिसोर्स डेफिनिशन (CRDs) के विपरीत, एग्रीगेशन API में मानक कुबेरनेट्स apiserver के अतिरिक्त एक अन्य सर्वर - आपका एक्सटेंशन apiserver - शामिल है। कुबेरनेट्स apiserver को आपके एक्सटेंशन apiserver के साथ संवाद करने की आवश्यकता होगी, और आपके एक्सटेंशन apiserver को कुबेरनेट्स apiserver के साथ संवाद करने की आवश्यकता होगी। इस संचार को सुरक्षित करने के लिए, कुबेरनेट्स apiserver x509 सर्टिफिकेट का उपयोग करता है ताकि यह स्वयं को एक्सटेंशन apiserver के लिए प्रमाणित कर सके।
यह खंड बताता है कि प्रमाणीकरण और प्राधिकरण प्रवाह कैसे काम करते हैं, और उन्हें कैसे कॉन्फ़िगर किया जाए।
उच्च-स्तरीय प्रवाह इस प्रकार है:
इस खंड का शेष भाग इन चरणों का विस्तार से वर्णन करता है।
प्रवाह को निम्नलिखित आरेख में देखा जा सकता है।

एक्सटेंशन apiserver द्वारा सेवित API पथ के लिए एक अनुरोध सभी API अनुरोधों की तरह शुरू होता है: कुबेरनेट्स apiserver के साथ संचार। यह पथ पहले से ही एक्सटेंशन apiserver द्वारा कुबेरनेट्स apiserver के साथ पंजीकृत किया गया है।
उपयोगकर्ता कुबेरनेट्स apiserver के साथ संवाद करता है, पथ तक पहुंच का अनुरोध करता है। कुबेरनेट्स apiserver मानक प्रमाणीकरण और प्राधिकरण का उपयोग करता है जो कुबेरनेट्स apiserver के साथ कॉन्फ़िगर किया गया है ताकि उपयोगकर्ता को प्रमाणित किया जा सके और विशिष्ट पथ तक पहुंच को प्राधिकृत किया जा सके।
कुबेरनेट्स क्लस्टर में प्रमाणीकरण का अवलोकन के लिए, "क्लस्टर में प्रमाणीकरण" देखें। कुबेरनेट्स क्लस्टर संसाधनों तक पहुंच के प्राधिकरण का अवलोकन के लिए, "प्राधिकरण अवलोकन" देखें।
इस बिंदु तक सब कुछ मानक कुबेरनेट्स API अनुरोध, प्रमाणीकरण और प्राधिकरण रहा है।
अब कुबेरनेट्स apiserver एक्सटेंशन apiserver को अनुरोध भेजने के लिए तैयार है।
अब कुबेरनेट्स apiserver अनुरोध को एक्सटेंशन apiserver पर भेजेगा, या प्रॉक्सी करेगा, जो अनुरोध को हैंडल करने के लिए पंजीकृत है। ऐसा करने के लिए, इसे कई चीजें जानने की आवश्यकता है:
इन दोनों के लिए प्रावधान करने के लिए, आपको कई फ्लैग का उपयोग करके कुबेरनेट्स apiserver को कॉन्फ़िगर करना होगा।
कुबेरनेट्स apiserver TLS के माध्यम से एक्सटेंशन apiserver से कनेक्ट होता है, एक क्लाइंट सर्टिफिकेट का उपयोग करके स्वयं को प्रमाणित करता है। आपको स्टार्टअप पर प्रदान किए गए फ्लैग का उपयोग करके कुबेरनेट्स apiserver को निम्नलिखित प्रदान करना होगा:
--proxy-client-key-file के माध्यम से--proxy-client-cert-file के माध्यम से--requestheader-client-ca-file के माध्यम से--requestheader-allowed-names के माध्यम सेकुबेरनेट्स apiserver --proxy-client-*-file द्वारा इंगित फ़ाइलों का उपयोग करेगा
एक्सटेंशन apiserver के साथ प्रमाणित होने के लिए। अनुरोध को एक अनुपालन एक्सटेंशन apiserver द्वारा
वैध माना जाने के लिए, निम्नलिखित शर्तें पूरी होनी चाहिए:
--requestheader-client-ca-file में है।--requestheader-allowed-names में सूचीबद्ध हैं।--requestheader-allowed-names="" के रूप में खाली सेट कर सकते हैं।
यह एक्सटेंशन apiserver को इंगित करेगा कि कोई भी CN स्वीकार्य है।इन विकल्पों के साथ शुरू किए जाने पर, कुबेरनेट्स apiserver:
kube-system नेमस्पेस में extension-apiserver-authentication नामक एक कॉन्फ़िगमैप बनाएगा,
जिसमें यह CA सर्टिफिकेट और अनुमत CNs को रखेगा। इन्हें बदले में एक्सटेंशन apiserver
द्वारा अनुरोधों को मान्य करने के लिए पुनर्प्राप्त किया जा सकता है।ध्यान दें कि एक ही क्लाइंट सर्टिफिकेट का उपयोग कुबेरनेट्स apiserver द्वारा सभी एक्सटेंशन apiserver के विरुद्ध प्रमाणित होने के लिए किया जाता है। यह प्रति एक्सटेंशन apiserver एक क्लाइंट सर्टिफिकेट नहीं बनाता है, बल्कि कुबेरनेट्स apiserver के रूप में प्रमाणित होने के लिए एक ही सर्टिफिकेट का उपयोग करता है। यही एक सभी एक्सटेंशन apiserver अनुरोधों के लिए पुन: उपयोग किया जाता है।
जब कुबेरनेट्स apiserver अनुरोध को एक्सटेंशन apiserver पर प्रॉक्सी करता है, यह एक्सटेंशन apiserver को उस उपयोगकर्ता नाम और समूह के बारे में सूचित करता है जिसके साथ मूल अनुरोध सफलतापूर्वक प्रमाणित हुआ था। यह इन्हें अपने प्रॉक्सी किए गए अनुरोध के http हेडर में प्रदान करता है। आपको कुबेरनेट्स apiserver को उपयोग किए जाने वाले हेडर के नामों के बारे में बताना होगा।
--requestheader-username-headers के माध्यम से--requestheader-group-headers के माध्यम से--requestheader-extra-headers-prefix के माध्यम सेये हेडर नाम भी extension-apiserver-authentication कॉन्फ़िगमैप में रखे जाते हैं,
ताकि एक्सटेंशन apiserver द्वारा उन्हें पुनर्प्राप्त और उपयोग किया जा सके।
कुबेरनेट्स apiserver से प्रॉक्सी किए गए अनुरोध को प्राप्त करने पर, एक्सटेंशन apiserver को यह सत्यापित करना होगा कि अनुरोध वास्तव में एक वैध प्रमाणीकरण प्रॉक्सी से आया है, जिस भूमिका को कुबेरनेट्स apiserver पूरा कर रहा है। एक्सटेंशन apiserver इसे निम्नानुसार सत्यापित करता है:
kube-system में कॉन्फ़िगमैप से निम्नलिखित पुनर्प्राप्त करें:
यदि उपरोक्त पास हो जाता है, तो अनुरोध एक वैध प्रॉक्सी किए गए अनुरोध है जो एक वैध प्रमाणीकरण प्रॉक्सी से आता है, इस मामले में कुबेरनेट्स apiserver।
ध्यान दें कि उपरोक्त प्रदान करना एक्सटेंशन apiserver कार्यान्वयन की जिम्मेदारी है। कई इसे डिफ़ॉल्ट रूप से करते हैं, k8s.io/apiserver/ पैकेज का लाभ उठाते हुए।
अन्य कमांड-लाइन विकल्पों का उपयोग करके इसे ओवरराइड करने के विकल्प प्रदान कर सकते हैं।
कॉन्फ़िगमैप पुनर्प्राप्त करने की अनुमति के लिए, एक्सटेंशन apiserver को उपयुक्त भूमिका की आवश्यकता होती है। kube-system नेमस्पेस में extension-apiserver-authentication-reader नामक एक डिफ़ॉल्ट भूमिका है जिसे असाइन किया जा सकता है।
एक्सटेंशन apiserver अब यह सत्यापित कर सकता है कि हेडर से पुनर्प्राप्त उपयोगकर्ता/समूह दिए गए अनुरोध को निष्पादित करने के लिए प्राधिकृत हैं। यह कुबेरनेट्स apiserver को एक मानक SubjectAccessReview अनुरोध भेजकर ऐसा करता है।
एक्सटेंशन apiserver के लिए स्वयं कुबेरनेट्स apiserver को SubjectAccessReview अनुरोध जमा करने के लिए प्राधिकृत होने के लिए, इसे सही अनुमतियों की आवश्यकता होती है। कुबेरनेट्स में system:auth-delegator नामक एक डिफ़ॉल्ट ClusterRole शामिल है जिसमें उपयुक्त अनुमतियां हैं। इसे एक्सटेंशन apiserver के सर्विस अकाउंट को प्रदान किया जा सकता है।
यदि SubjectAccessReview पास हो जाता है, तो एक्सटेंशन apiserver अनुरोध को निष्पादित करता है।
निम्नलिखित kube-apiserver फ्लैग के माध्यम से एग्रीगेशन लेयर को सक्षम करें।
आपके प्रोवाइडर द्वारा इन्हें पहले से ही संभाला जा चुका हो सकता है।
--requestheader-client-ca-file=<एग्रीगेटर CA सर्ट का पथ>
--requestheader-allowed-names=front-proxy-client
--requestheader-extra-headers-prefix=X-Remote-Extra-
--requestheader-group-headers=X-Remote-Group
--requestheader-username-headers=X-Remote-User
--proxy-client-cert-file=<एग्रीगेटर प्रॉक्सी सर्ट का पथ>
--proxy-client-key-file=<एग्रीगेटर प्रॉक्सी कुंजी का पथ>
कुबेरनेट्स apiserver के दो क्लाइंट CA विकल्प हैं:
--client-ca-file--requestheader-client-ca-fileइनमें से प्रत्येक स्वतंत्र रूप से कार्य करता है और एक दूसरे के साथ विरोध कर सकता है, यदि सही ढंग से उपयोग नहीं किया जाए।
--client-ca-file: जब कुबेरनेट्स apiserver पर एक अनुरोध आता है, यदि यह विकल्प सक्षम है, तो कुबेरनेट्स apiserver अनुरोध के सर्टिफिकेट की जांच करता है। यदि यह --client-ca-file द्वारा संदर्भित फ़ाइल में CA सर्टिफिकेट में से एक द्वारा साइन किया गया है, तो अनुरोध को वैध माना जाता है, और उपयोगकर्ता कॉमन नेम CN= का मान है, जबकि समूह संगठन O= है। TLS प्रमाणीकरण पर दस्तावेज़ीकरण देखें।--requestheader-client-ca-file: जब कुबेरनेट्स apiserver पर एक अनुरोध आता है, यदि यह विकल्प सक्षम है, तो कुबेरनेट्स apiserver अनुरोध के सर्टिफिकेट की जांच करता है। यदि यह --requestheader-client-ca-file द्वारा संदर्भित फ़ाइल में CA सर्टिफिकेट में से एक द्वारा साइन किया गया है, तो अनुरोध को संभावित रूप से वैध माना जाता है। फिर कुबेरनेट्स apiserver जांचता है कि क्या कॉमन नेम CN= --requestheader-allowed-names द्वारा प्रदान की गई सूची में से एक है। यदि नाम अनुमत है, तो अनुरोध स्वीकृत हो जाता है; यदि नहीं, तो अनुरोध अस्वीकृत हो जाता है।यदि दोनों --client-ca-file और --requestheader-client-ca-file प्रदान किए जाते हैं, तो अनुरोध पहले --requestheader-client-ca-file CA की जांच करता है और फिर --client-ca-file की। सामान्यतः, इन विकल्पों में से प्रत्येक के लिए अलग-अलग CA का उपयोग किया जाता है, या तो रूट CA या इंटरमीडिएट CA; नियमित क्लाइंट अनुरोध --client-ca-file से मेल खाते हैं, जबकि एग्रीगेशन अनुरोध --requestheader-client-ca-file से मेल खाते हैं। हालांकि, यदि दोनों समान CA का उपयोग करते हैं, तो सामान्य रूप से --client-ca-file के माध्यम से पास होने वाले क्लाइंट अनुरोध विफल हो जाएंगे, क्योंकि CA --requestheader-client-ca-file में CA से मेल खाएगा, लेकिन कॉमन नेम CN= --requestheader-allowed-names में स्वीकार्य कॉमन नामों में से एक से मेल नहीं खाएगा। इससे आपके kubelets और अन्य कंट्रोल प्लेन घटकों के साथ-साथ अंतिम उपयोगकर्ताओं को कुबेरनेट्स apiserver के साथ प्रमाणित होने में असमर्थ हो सकता है।
इस कारण से, --client-ca-file विकल्प - कंट्रोल प्लेन घटकों और अंतिम उपयोगकर्ताओं को प्राधिकृत करने के लिए - और --requestheader-client-ca-file विकल्प - एग्रीगेशन apiserver अनुरोधों को प्राधिकृत करने के लिए - के लिए अलग-अलग CA सर्ट का उपयोग करें।
यदि आप API सर्वर चलाने वाले होस्ट पर kube-proxy नहीं चला रहे हैं, तो आपको यह सुनिश्चित करना होगा कि सिस्टम निम्नलिखित kube-apiserver फ्लैग के साथ सक्षम है:
--enable-aggregator-routing=true
आप गतिशील रूप से कॉन्फ़िगर कर सकते हैं कि कौन से क्लाइंट अनुरोध एक्सटेंशन apiserver पर प्रॉक्सी किए जाएं। निम्नलिखित एक उदाहरण पंजीकरण है:
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: <पंजीकरण ऑब्जेक्ट का नाम>
spec:
group: <यह एक्सटेंशन apiserver जिस API समूह को होस्ट करता है>
version: <यह एक्सटेंशन apiserver जिस API संस्करण को होस्ट करता है>
groupPriorityMinimum: <इस समूह के लिए इस APIService की प्राथमिकता, API दस्तावेज़ीकरण देखें>
versionPriority: <एक समूह के भीतर इस संस्करण की क्रमबद्धता को प्राथमिकता देता है, API दस्तावेज़ीकरण देखें>
service:
namespace: <एक्सटेंशन apiserver सेवा का नेमस्पेस>
name: <एक्सटेंशन apiserver सेवा का नाम>
caBundle: <pem एनकोडेड ca cert जो सर्वर सर्ट को साइन करता है जिसका उपयोग वेबहुक द्वारा किया जाता है>
एक APIService ऑब्जेक्ट का नाम एक वैध पथ सेगमेंट नाम होना चाहिए।
एक बार कुबेरनेट्स apiserver ने निर्धारित कर लिया कि अनुरोध एक्सटेंशन apiserver को भेजा जाना चाहिए, इसे यह जानने की आवश्यकता है कि इससे कैसे संपर्क किया जाए।
service स्टैंज़ा एक्सटेंशन apiserver की सेवा का संदर्भ है।
सेवा नेमस्पेस और नाम आवश्यक हैं। पोर्ट वैकल्पिक है और डिफ़ॉल्ट रूप से 443 है।
यहां एक एक्सटेंशन apiserver का उदाहरण है जो पोर्ट "1234" पर कॉल करने के लिए कॉन्फ़िगर किया गया है,
और ServerName my-service-name.my-service-namespace.svc के विरुद्ध TLS कनेक्शन को सत्यापित करने के लिए कस्टम CA बंडल का उपयोग करता है।
apiVersion: apiregistration.k8s.io/v1
kind: APIService
...
spec:
...
service:
namespace: my-service-namespace
name: my-service-name
port: 1234
caBundle: "Ci0tLS0tQk...<base64-encoded PEM bundle>...tLS0K"
...