मैं एक नेमस्पेस में एक सेवा को परिभाषित करने का एक तरीका खोजने की कोशिश कर रहा हूं जो कि किसी अन्य नामस्थान में चल रहे पॉड से लिंक करता है। मुझे पता है कि फली में चल रहे कंटेनर को क्लस्टर DNS में इसे संदर्भित करके namespaceAएक्सेस serviceXकिया जा सकता है , लेकिन मेरे पास कंटेनर के अंदर का कोड नहीं होना चाहिए । यही है, मैं चाहता हूं कि कोड केवल लुकअप हो और फिर इसे एक्सेस करने में सक्षम हो।namespaceBserviceX.namespaceB.svc.cluster.localserviceXserviceX
Kubernetes प्रलेखन चलता है कि यह संभव है। यह कहता है कि आप चयनकर्ता के बिना किसी सेवा को परिभाषित करने वाले कारणों में से एक यह है कि आप अपनी सेवा को किसी अन्य नामस्थान या किसी अन्य क्लस्टर पर सेवा में इंगित करना चाहते हैं ।
इससे मुझे पता चलता है कि मुझे चाहिए:
- में एक
serviceXसेवा को परिभाषित करेंnamespaceA, एक चयनकर्ता के बिना (क्योंकि मैं जिस POD का चयन करना चाहता हूं वह नहीं हैnamespaceA)। - एक सेवा को परिभाषित करें (जिसे मैंने भी बुलाया था
serviceX)namespaceBऔर फिर - में एक अंतिम बिंदु वस्तु को परिभाषित
namespaceAकरने के लिए बात करने के लिएserviceXमेंnamespaceB।
यह तीसरा चरण है जिसे मैं पूरा नहीं कर पाया हूं।
सबसे पहले, मैंने समापन बिंदु ऑब्जेक्ट को इस तरह परिभाषित करने की कोशिश की:
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
यह तार्किक दृष्टिकोण लग रहा था, और जाहिर है कि इसके targetRefलिए क्या था। लेकिन, इससे यह त्रुटि हुई कि सरणी ipमें फ़ील्ड addressesअनिवार्य था। तो, मेरी अगली कोशिश करने के लिए एक निश्चित ClusterIP पता असाइन करने के लिए था serviceXमें namespaceB, और आईपी क्षेत्र में डाल दिया है कि (ध्यान दें कि service_cluster_ip_rangeके रूप में कॉन्फ़िगर किया गया है 192.168.0.0/16, और 192.168.1.1के लिए ClusterIP के रूप में नियुक्त किया गया था serviceXमें namespaceB, serviceXमें namespaceAऑटो पर एक अलग ClusterIP सौंपा गया था 192.168.0.0/16सबनेट) :
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- ip: 192.168.1.1
targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
यह स्वीकार कर लिया गया था, लेकिन पॉड को अग्रेषित नहीं किया serviceXगया namespaceAथा namespaceB। Iptables सेटअप को देखते हुए, ऐसा लगता है कि इसे पूरा करने के लिए NAT को दो बार पूर्व-मार्ग करना होगा।
केवल एक चीज जो मैंने पाया है कि काम किया है - लेकिन एक संतोषजनक समाधान नहीं है - पॉड के वास्तविक आईपी पते को प्रदान करना serviceXहै namespaceBऔर उस पते को एंडपॉइंट ऑब्जेक्ट में डालना है namespaceA। यह संतोषजनक नहीं है, निश्चित रूप से, क्योंकि पॉड आईपी पता समय के साथ बदल सकता है। यही समस्या सेवा आईपी को हल करने के लिए है।
तो, क्या वहाँ एक तरीका है जो दस्तावेज के वादे को पूरा करने के लिए लगता है कि मैं एक नाम स्थान में एक सेवा को एक अलग नामस्थान में चल रही सेवा को इंगित कर सकता हूं ?
एक टिप्पणीकार ने सवाल किया कि आप ऐसा क्यों करना चाहते हैं - यहाँ एक उपयोग मामला है जो मुझे समझ में आता है, कम से कम:
मान लें कि आपके पास एक बहु-किरायेदार प्रणाली है, जिसमें एक सामान्य डेटा-एक्सेस फ़ंक्शन भी शामिल है जिसे किरायेदारों के बीच साझा किया जा सकता है। अब कल्पना करें कि आम एपीआई के साथ इस डेटा-एक्सेस फ़ंक्शन के विभिन्न स्वाद हैं, लेकिन विभिन्न प्रदर्शन विशेषताओं। कुछ किरायेदारों को उनमें से एक तक पहुंच मिलती है, अन्य किरायेदारों की पहुंच दूसरे तक होती है।
प्रत्येक किरायेदार की पॉड अपने स्वयं के नामस्थानों में चलती हैं, लेकिन प्रत्येक को इन सामान्य डेटा-एक्सेस सेवाओं में से एक का उपयोग करने की आवश्यकता होती है, जो आवश्यक रूप से दूसरे नामस्थान (क्योंकि यह कई किरायेदारों द्वारा एक्सेस की जाती है) में होगी। लेकिन, आप नहीं चाहेंगे कि किरायेदार को अपना कोड बदलना पड़े, अगर उनकी सदस्यता उच्च प्रदर्शन वाली सेवा तक पहुंचने के लिए बदल जाती है।
एक संभावित समाधान (सबसे साफ जिसे मैं सोच सकता हूं, अगर केवल यह काम करता है) डेटा किरायेदार के नाम के लिए प्रत्येक किरायेदार के नाम स्थान में एक सेवा परिभाषा को शामिल करना है, जिसमें प्रत्येक उपयुक्त समापन बिंदु के लिए कॉन्फ़िगर किया गया है। यह सेवा परिभाषा उचित डेटा-एक्सेस सेवा को इंगित करने के लिए कॉन्फ़िगर की जाएगी जिसे प्रत्येक किरायेदार उपयोग करने का हकदार है।