অন্য নাম স্থানে অবস্থিত পরিষেবা


125

আমি একটি নামস্থানতে একটি পরিষেবা সংজ্ঞায়নের জন্য এমন একটি উপায় সন্ধান করার চেষ্টা করছি যা অন্য নামস্থানে চলছে এমন একটি পডের সাথে লিঙ্ক করে। আমি জানি যে পডের মধ্যে চলছে এমন পাত্রে ক্লাস্টার ডিএনএস-তে এটি উল্লেখ করে সংজ্ঞায়িত namespaceAঅ্যাক্সেস করতে পারে, তবে ধারকটির ভিতরে থাকা কোডটির অবস্থান সম্পর্কে জানতে আমার দরকার নেই । এটি হল, আমি কোডটি কেবল সন্ধানের জন্য চাই এবং তারপরে এটি অ্যাক্সেস করতে সক্ষম হব।serviceXnamespaceBserviceX.namespaceB.svc.cluster.localserviceXserviceX

Kubernetes ডকুমেন্টেশন দাড়ায় যে এই সম্ভব। এটিতে বলা হয়েছে যে আপনি বাছাইকারী ব্যতীত কোনও পরিষেবাটি সংজ্ঞায়িত করার একটি কারণ হ'ল আপনি নিজের পরিষেবাটিকে অন্য নেমস্পেসে বা অন্য কোনও ক্লাস্টারে কোনও পরিষেবাতে নির্দেশ করতে চান

এটি আমার পরামর্শ দেয় যে আমার উচিত:

  1. কোনও নির্বাচক ছাড়াই, কোনও serviceXপরিষেবাকে সংজ্ঞায়িত করুন namespaceA(যেই পিওডিটি আমি নির্বাচন করতে চাই তা এতে নেই namespaceA)।
  2. একটি পরিষেবা সংজ্ঞায়িত করুন (যা আমিও ডেকেছি serviceX) namespaceBএবং তারপরে
  3. একটি এন্ডপয়েন্ট বস্তুর নির্ধারণ 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। অবশ্যই এটি সন্তোষজনক নয়, কারণ পড আইপি ঠিকানা সময়ের সাথে সাথে পরিবর্তিত হতে পারে। সমস্যা সমাধানের জন্য সেখানে আইপি রয়েছে।

সুতরাং, ডকুমেন্টেশনের প্রতিশ্রুতি বলে মনে হয় যা পূরণ করার কোনও উপায় আছে যা আমি একটি নামস্থলে একটি পরিষেবাকে অন্য নামস্থানে চলমান কোনও পরিষেবার দিকে নির্দেশ করতে পারি ?

একজন মন্তব্যকারী আপনাকে জিজ্ঞাসা করলেন কেন আপনি এটি করতে চান - এখানে এমন একটি ব্যবহারের মামলা রয়েছে যা আমার কাছে বোধগম্য হয়, কমপক্ষে:

বলুন আপনার কাছে একটি বহু-ভাড়াটে ব্যবস্থা রয়েছে, যার মধ্যে একটি সাধারণ ডেটা অ্যাক্সেস ফাংশন রয়েছে যা ভাড়াটেদের মধ্যে ভাগ করা যায়। এখন কল্পনা করুন যে সাধারণ এপিআই সহ এই ডেটা-অ্যাক্সেস ফাংশনের বিভিন্ন স্বাদ রয়েছে তবে কার্য সম্পাদনের বিভিন্ন বৈশিষ্ট্য রয়েছে। কিছু ভাড়াটে তাদের মধ্যে একটিতে অ্যাক্সেস পান, অন্য ভাড়াটেদের অন্য একটিতে অ্যাক্সেস থাকে।

প্রতিটি ভাড়াটেদের পোডগুলি তাদের নিজস্ব জায়গাগুলিতে চালিত হয়, তবে প্রত্যেককে এই সাধারণ তথ্য-অ্যাক্সেস পরিষেবাগুলির একটিতে অ্যাক্সেস করা দরকার, যা অগত্যা অন্য নামস্থানে থাকবে (যেহেতু এটি একাধিক ভাড়াটে দ্বারা প্রবেশযোগ্য)। তবে, আপনি চাইবেন না যে ভাড়াটিয়া তাদের সাবস্ক্রিপশন উচ্চ-সম্পাদনকারী পরিষেবাটিতে অ্যাক্সেসের জন্য পরিবর্তন করে যদি তাদের কোড পরিবর্তন করে।

একটি সম্ভাব্য সমাধান (সবচেয়ে পরিষ্কারভাবে আমি এটির জন্য চিন্তা করতে পারি, যদি এটি কাজ করে তবে) হ'ল ডেটা অ্যাক্সেস পরিষেবাটির জন্য প্রতিটি ভাড়াটের নেমস্পেসে একটি পরিষেবা সংজ্ঞা অন্তর্ভুক্ত করা, যার সাথে যথাযথ শেষ পয়েন্টের জন্য কনফিগার করা থাকে। এই পরিষেবা সংজ্ঞাটি প্রতিটি ভাড়াটে ব্যবহারের জন্য উপযুক্ত সেই সঠিক ডেটা-অ্যাক্সেস পরিষেবাটি নির্দেশ করতে কনফিগার করা হবে।


নেমস্পেসের বিন্দুটি বিচ্ছিন্ন করা, সুতরাং আমি মনে করি যদি আপনাকে নামের জায়গা জুড়ে যেতে হয় তবে আপনাকে কমপক্ষে এটি কোথায় অবস্থিত তা জানতে হবে!
মিঃ

সুতরাং, ডকুমেন্টেশনটির অর্থ কী? যখন প্রস্তাবিত হয় আপনি কোনও নির্বাচককে সংজ্ঞায়িত না করে - এবং একটি নির্দিষ্ট বিন্দুকে সংজ্ঞায়িত করে জড়িত করে কোনও নাম-স্পেসে সংজ্ঞায়িত একটি পরিষেবাকে কোনও ভিন্ন নামস্থানে কোনও পরিষেবা অ্যাক্সেসের জন্য নির্দেশ করতে পারেন? এর জন্য অবশ্যই বৈধ ব্যবহারের কেস রয়েছে - যার একটিতে আমি প্রশ্নটিতে যুক্ত করেছি। ডকুমেন্টেশনটি কি কেবল বিভ্রান্তিকর, বা এটি করার কোনও উপায় আছে যা আমি এখনও সন্ধান করতে পারি নি?
ডেভিড ম্যাককিনলে

আমি নিশ্চিত নই, দুঃখিত। আমি জানি যে আমি একাধিক নেমস্পেসিতে তাদের fqdn ব্যবহার করে পরিষেবাগুলি অ্যাক্সেস করি। আমি বিশেষত ভিপিএন দিয়ে এটি করি, যেহেতু আমার কাছে 1 ভিপিএন পোড রয়েছে এবং আমি এটি থেকে সমস্ত পরিষেবাদির মাধ্যমে সংযোগ করি। তবে আপনাকে নামের স্থানটি জানতে হবে এবং fqdn সরবরাহ করতে হবে। আমি আপনাকে স্ল্যাক চ্যানেলে জিজ্ঞাসা করার পরামর্শ দেব।
মিঃ

Fqdn ব্যবহার করা সমাধান বর্তমানে আমি ব্যবহার করছি। আমার ব্যবহারের কেসটি আরও ভাল পরিবেশন করা হবে, যদিও (এখন প্রশ্নের সাথে যুক্ত করা হয়েছে) যদি এটি প্রয়োজন না হয়।
ডেভিড ম্যাককিনলে

আমি ডকুমেন্টেশন খুব উল্লেখ করছে কি অবাক, তবে আমি আমার ব্যবহারের ক্ষেত্রে সন্তোষজনক সমাধান হিসাবে fqdn ব্যবহার করতে পারেন।
ভিনসেন্ট ডি স্মেট

উত্তর:


250

আমি একই সমস্যার জন্য হোঁচট খেয়েছি এবং একটি দুর্দান্ত সমাধান পেয়েছি যার জন্য কোনও স্ট্যাটিক আইপি কনফিগারেশনের দরকার নেই:

আপনি এটির ডিএনএস নামের মাধ্যমে কোনও পরিষেবা অ্যাক্সেস করতে পারবেন (যেমনটি আপনি উল্লেখ করেছেন): servicename.namespace.svc.cluster.local

আপনি কোনও স্থানীয় পরিষেবার মাধ্যমে অন্য নামস্থানে রেফারেন্স করতে সেই ডিএনএস নামটি ব্যবহার করতে পারেন :

kind: Service
apiVersion: v1
metadata:
  name: service-y
  namespace: namespace-a
spec:
  type: ExternalName
  externalName: service-x.namespace-b.svc.cluster.local
  ports:
  - port: 80

4
এটি একটি দুর্দান্ত সমাধান! আমি নিশ্চিত নই যে আমি প্রাথমিকভাবে প্রশ্ন জিজ্ঞাসা করার সময় পরিষেবার জন্য "বাহ্যিক নাম" টাইপ উপলব্ধ ছিল কিনা, তবে এটি এখন সমর্থিত এবং ঝরঝরে সমস্যার সমাধান করে। ধন্যবাদ, পল
ডেভিড ম্যাককিনলে

4
এটা কি কাজ করে? আমি সন্দেহ করি. কেউ যদি সত্যই এটি কাজ করে তা নিশ্চিত করতে পারে, আমার পক্ষে কাজ করে না।
ডিবিয়ানমাস্টার

4
হ্যাঁ এটা করে. এটি একটি শুঁটির জন্য অন্য নামের জায়গার একটি পরিষেবার সাথে কথা বলার জন্য কাজ করে তবে কোনও ইনগ্রেশন লোডবালেন্সারের জন্য নয়।
পল

ক্লাস্টার ইন-ক্লাস্টার সিএমএল লুকের স্থিরতার কারণে পুরানো সংস্করণটি কাজ করবে না।
21

4
/ কি কি কিউব-সিস্টেমের নেমস্পেসে পরিষেবার জন্য কাজ করা উচিত?
নবিত

15

এটি করা এত সহজ

আপনি যদি এটি হোস্ট হিসাবে ব্যবহার করতে চান এবং এটি সমাধান করতে চান

আপনি যদি অন্য কোনও নেমস্পেসে অবস্থিত পরিষেবার জন্য অন্য কোনও এপিআই গেটওয়েতে রাষ্ট্রদূত ব্যবহার করেন তবে এটি সর্বদা ব্যবহারের পরামর্শ দেওয়া হয়:

            Use : <service name>
            Use : <service.name>.<namespace name>
            Not : <service.name>.<namespace name>.svc.cluster.local

এটি হবে: servicename.namespacename.svc.cluster.local

এটি আপনার উল্লেখ করা নেমস্পেসের ভিতরে একটি নির্দিষ্ট পরিষেবাতে অনুরোধ প্রেরণ করবে।

উদাহরণ:

kind: Service
apiVersion: v1
metadata:
  name: service
spec:
  type: ExternalName
  externalName: <servicename>.<namespace>.svc.cluster.local

এখানে উপযুক্ত মান সহ <servicename>এবং প্রতিস্থাপন করুন <namespace>

কুবারনেটে, নেমস্পেসগুলি ভার্চুয়াল পরিবেশ তৈরি করতে ব্যবহৃত হয় তবে সমস্ত একে অপরের সাথে সংযুক্ত থাকে।


6
আপনি কী ব্যাখ্যা করতে পারেন যে কীভাবে এই উত্তর প্রায় 2 বছর আগে পলের দেওয়া থেকে আলাদা?
অলিভার

4
@ অলিভারে কোনও পার্থক্য নেই তবে আমি নির্দিষ্ট করে দিয়েছি কোন নির্দিষ্ট জায়গায় পরিষেবার নাম এবং নাম স্থানটি প্রতিস্থাপন করতে হবে। যখন তিনি নেমস্পেস ব্যবহার করেছেন তখন এটি আমার কাছে বিভ্রান্ত দেখাচ্ছে।
হর্ষ মনভার

8
এসও-তে একটি সহজ কৌশল হ'ল উত্তরে একটি মন্তব্য যুক্ত করা এবং প্রয়োজনীয় স্পষ্টতা দেওয়া।
অলিভার

4
আমি এটিকে সেরা সমাধান হিসাবে ডাকব কারণ .svc.cluster.localঅভ্যন্তরীণভাবে পরিষেবাটি সমাধান করার জন্য ডিফল্টরূপে সমর্থিত।
DrKNa

2

দুটি পৃথক নেমস্পেসে পরিষেবাগুলি অ্যাক্সেস করতে আপনি এই জাতীয় url ব্যবহার করতে পারেন:

HTTP://<your-service-name>.<namespace-with-that-service>.svc.cluster.local

আপনার সমস্ত নাম স্থানটি তালিকাভুক্ত করতে আপনি ব্যবহার করতে পারেন:

kubctl get namespace

এবং সেই নেমস্পেসে পরিষেবার জন্য আপনি কেবল ব্যবহার করতে পারেন:

kubctl get services -n <namespace-name>

এটি আপনাকে সাহায্য করবে।


0

সার্ভিস লোডবালেন্সার https://github.com/kubernetes/contrib/tree/master/service-loadbalancer এর মতো নেমস্পিড সার্ভিসের চেয়ে উচ্চতর স্তরে কিছু স্থাপন করে আপনি এটি অর্জন করতে পারেন । আপনি যদি এটি একটি একক নেমস্পেসে সীমাবদ্ধ রাখতে চান তবে "--namespace = ns" যুক্তিটি ব্যবহার করুন (এটি সমস্ত নেমস্পেসের ডিফল্ট: https://github.com/kubernetes/contrib/blob/master/service-loadbalancer/service_loadbalancer.go # এল 715 )। এটি L7 এর পক্ষে ভাল কাজ করে তবে এটি L4 এর জন্য একটু অগোছালো।


4
এই প্রকল্পটি এখন অবহিত করা হয়েছে (
নিকোলা বেন

4
@ প্রশান্ত বি: আপনি কি সেই অনুযায়ী নিজের উত্তর আপডেট করতে পারবেন!
বিশৃঙ্খলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.