আমি একটি নামস্থানতে একটি পরিষেবা সংজ্ঞায়নের জন্য এমন একটি উপায় সন্ধান করার চেষ্টা করছি যা অন্য নামস্থানে চলছে এমন একটি পডের সাথে লিঙ্ক করে। আমি জানি যে পডের মধ্যে চলছে এমন পাত্রে ক্লাস্টার ডিএনএস-তে এটি উল্লেখ করে সংজ্ঞায়িত namespaceA
অ্যাক্সেস করতে পারে, তবে ধারকটির ভিতরে থাকা কোডটির অবস্থান সম্পর্কে জানতে আমার দরকার নেই । এটি হল, আমি কোডটি কেবল সন্ধানের জন্য চাই এবং তারপরে এটি অ্যাক্সেস করতে সক্ষম হব।serviceX
namespaceB
serviceX.namespaceB.svc.cluster.local
serviceX
serviceX
Kubernetes ডকুমেন্টেশন দাড়ায় যে এই সম্ভব। এটিতে বলা হয়েছে যে আপনি বাছাইকারী ব্যতীত কোনও পরিষেবাটি সংজ্ঞায়িত করার একটি কারণ হ'ল আপনি নিজের পরিষেবাটিকে অন্য নেমস্পেসে বা অন্য কোনও ক্লাস্টারে কোনও পরিষেবাতে নির্দেশ করতে চান ।
এটি আমার পরামর্শ দেয় যে আমার উচিত:
- কোনও নির্বাচক ছাড়াই, কোনও
serviceX
পরিষেবাকে সংজ্ঞায়িত করুনnamespaceA
(যেই পিওডিটি আমি নির্বাচন করতে চাই তা এতে নেই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
এবং IP ক্ষেত্র রাখা যে (নোট যে 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
মধ্যে Pod ফরোয়ার্ড হয়নি namespaceB
- তারা সময় শেষ হয়েছে। Iptables সেটআপটি দেখে মনে হচ্ছে এটি সম্পাদন করতে দু'বার নেট প্রি-রাউটিং করতে হত।
আমি কেবল এটিই কাজ করেছিলাম - তবে এটি সন্তোষজনক সমাধান নয় - হ'ল পডের আসল আইপি ঠিকানাটি serviceX
অনুসন্ধান করা namespaceB
এবং সেই ঠিকানাটি এন্ডপয়েন্টস অবজেক্টে রেখে দেওয়া namespaceA
। অবশ্যই এটি সন্তোষজনক নয়, কারণ পড আইপি ঠিকানা সময়ের সাথে সাথে পরিবর্তিত হতে পারে। সমস্যা সমাধানের জন্য সেখানে আইপি রয়েছে।
সুতরাং, ডকুমেন্টেশনের প্রতিশ্রুতি বলে মনে হয় যা পূরণ করার কোনও উপায় আছে যা আমি একটি নামস্থলে একটি পরিষেবাকে অন্য নামস্থানে চলমান কোনও পরিষেবার দিকে নির্দেশ করতে পারি ?
একজন মন্তব্যকারী আপনাকে জিজ্ঞাসা করলেন কেন আপনি এটি করতে চান - এখানে এমন একটি ব্যবহারের মামলা রয়েছে যা আমার কাছে বোধগম্য হয়, কমপক্ষে:
বলুন আপনার কাছে একটি বহু-ভাড়াটে ব্যবস্থা রয়েছে, যার মধ্যে একটি সাধারণ ডেটা অ্যাক্সেস ফাংশন রয়েছে যা ভাড়াটেদের মধ্যে ভাগ করা যায়। এখন কল্পনা করুন যে সাধারণ এপিআই সহ এই ডেটা-অ্যাক্সেস ফাংশনের বিভিন্ন স্বাদ রয়েছে তবে কার্য সম্পাদনের বিভিন্ন বৈশিষ্ট্য রয়েছে। কিছু ভাড়াটে তাদের মধ্যে একটিতে অ্যাক্সেস পান, অন্য ভাড়াটেদের অন্য একটিতে অ্যাক্সেস থাকে।
প্রতিটি ভাড়াটেদের পোডগুলি তাদের নিজস্ব জায়গাগুলিতে চালিত হয়, তবে প্রত্যেককে এই সাধারণ তথ্য-অ্যাক্সেস পরিষেবাগুলির একটিতে অ্যাক্সেস করা দরকার, যা অগত্যা অন্য নামস্থানে থাকবে (যেহেতু এটি একাধিক ভাড়াটে দ্বারা প্রবেশযোগ্য)। তবে, আপনি চাইবেন না যে ভাড়াটিয়া তাদের সাবস্ক্রিপশন উচ্চ-সম্পাদনকারী পরিষেবাটিতে অ্যাক্সেসের জন্য পরিবর্তন করে যদি তাদের কোড পরিবর্তন করে।
একটি সম্ভাব্য সমাধান (সবচেয়ে পরিষ্কারভাবে আমি এটির জন্য চিন্তা করতে পারি, যদি এটি কাজ করে তবে) হ'ল ডেটা অ্যাক্সেস পরিষেবাটির জন্য প্রতিটি ভাড়াটের নেমস্পেসে একটি পরিষেবা সংজ্ঞা অন্তর্ভুক্ত করা, যার সাথে যথাযথ শেষ পয়েন্টের জন্য কনফিগার করা থাকে। এই পরিষেবা সংজ্ঞাটি প্রতিটি ভাড়াটে ব্যবহারের জন্য উপযুক্ত সেই সঠিক ডেটা-অ্যাক্সেস পরিষেবাটি নির্দেশ করতে কনফিগার করা হবে।