Ingress
কুবারনেটিস v1.19 [stable]
একটি API অবজেক্ট যা একটি ক্লাস্টারে সার্ভিসগুলিতে এক্সটার্নাল অ্যাক্সেস পরিচালনা করে, সাধারণত HTTP৷
Ingress লোড ব্যালেন্সিং, SSL টারমিনেশন এবং নাম-ভিত্তিক ভার্চুয়াল হোস্টিং প্রদান করতে পারে।
বিঃদ্রঃ:
Ingress স্থগিত করা হয়েছে। নতুন ফিচারগুলি Gateway API তে যোগ করা হচ্ছে।টার্মিনোলোজি
স্পষ্টতার জন্য, এই গাইড নিম্নলিখিত টার্মগুলি সংজ্ঞায়িত করে:
- নোড: Kubernetes-এ একটি ওয়ার্কার মেশিন, যা একটি ক্লাস্টারের অংশ।
- ক্লাস্টার: একটি সেট নোড যা Kubernetes দ্বারা পরিচালিত কন্টেইনারাইজড অ্যাপ্লিকেশন চালায়। এই উদাহরণের জন্য, এবং বেশিরভাগ সাধারণ Kubernetes ডিপ্লয়মেন্টে, ক্লাস্টারের নোডগুলি পাবলিক ইন্টারনেটের অংশ নয়।
- এজ রাউটার: একটি রাউটার যা আপনার ক্লাস্টারের জন্য ফায়ারওয়াল নীতি প্রয়োগ করে। এটি একটি ক্লাউড প্রদানকারী দ্বারা পরিচালিত একটি গেটওয়ে বা হার্ডওয়্যারের একটি শারীরিক অংশ হতে পারে।
- ক্লাস্টার নেটওয়ার্ক: একটি সেট লিঙ্ক, লজিক্যাল বা ফিজিক্যাল, যা Kubernetes নেটওয়ার্কিং মডেল অনুযায়ী একটি ক্লাস্টারের মধ্যে যোগাযোগ সহজতর করে।
- সার্ভিস: একটি Kubernetes Service যা লেবেল সিলেক্টর ব্যবহার করে একটি পড সেট সনাক্ত করে। অন্যথায় উল্লেখ না করা হলে, সার্ভিসগুলি শুধুমাত্র ক্লাস্টার নেটওয়ার্কের মধ্যে রাউটেবল ভার্চুয়াল আইপি ধারণ করে বলে ধরে নেওয়া হয়।
Ingress কী?
Ingress ক্লাস্টারের বাইরে থেকে HTTP এবং HTTPS রুটগুলি সার্ভিস-এ উন্মুক্ত করে। ট্রাফিক রাউটিং Ingress রিসোর্সে সংজ্ঞায়িত নিয়ম দ্বারা নিয়ন্ত্রিত হয়।
এখানে একটি সহজ উদাহরণ দেওয়া হল যেখানে একটি Ingress তার সমস্ত ট্রাফিক একটি সার্ভিসে পাঠায়:
চিত্র। Ingress
একটি Ingress সার্ভিসগুলিকে বাহ্যিকভাবে-অ্যাক্সেসযোগ্য URL প্রদান করতে, ট্রাফিক লোড ব্যালেন্স করতে, SSL / TLS শেষ করতে এবং নাম-ভিত্তিক ভার্চুয়াল হোস্টিং অফার করতে কনফিগার করা যেতে পারে। একটি Ingress কন্ট্রোলার Ingress পূরণ করার জন্য দায়ী, সাধারণত একটি লোড ব্যালেন্সার সহ, যদিও এটি আপনার এজ রাউটার বা অতিরিক্ত ফ্রন্টএন্ডগুলি ট্রাফিক পরিচালনা করতে সহায়তা করার জন্যও কনফিগার করতে পারে।
Ingress এলোমেলো পোর্ট বা প্রোটোকল উন্মুক্ত করে না। HTTP এবং HTTPS ছাড়া অন্য সার্ভিসগুলিকে ইন্টারনেটে উন্মুক্ত করা সাধারণত Service.Type=NodePort বা Service.Type=LoadBalancer ব্যবহার করে।
পূর্বশর্ত
আপনার একটি Ingress কন্ট্রোলার থাকতে হবে একটি Ingress পূরণ করতে। শুধুমাত্র একটি Ingress রিসোর্স তৈরি করা কোন প্রভাব ফেলে না।
আপনাকে ingress-nginx এর মতো একটি Ingress কন্ট্রোলার স্থাপন করতে হতে পারে। আপনি বেশ কয়েকটি Ingress কন্ট্রোলার থেকে বেছে নিতে পারেন।
আদর্শভাবে, সমস্ত Ingress কন্ট্রোলারগুলি রেফারেন্স স্পেসিফিকেশন অনুসারে ফিট করা উচিত। বাস্তবে, বিভিন্ন Ingress কন্ট্রোলারগুলি সামান্য ভিন্নভাবে কাজ করে।
বিঃদ্রঃ:
আপনার Ingress কন্ট্রোলারের ডকুমেন্টেশন পর্যালোচনা করতে ভুলবেন না যাতে এটি বেছে নেওয়ার সতর্কতা বুঝতে পারেন।Ingress রিসোর্স
একটি ন্যূনতম Ingress রিসোর্স উদাহরণ:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
একটি Ingress এর apiVersion
, kind
, metadata
এবং spec
ক্ষেত্র প্রয়োজন।
একটি Ingress অবজেক্টের নাম একটি বৈধ
DNS সাবডোমেন নাম হতে হবে।
কনফিগ ফাইলগুলির সাথে কাজ করার বিষয়ে সাধারণ তথ্যের জন্য, অ্যাপ্লিকেশন স্থাপন, কনফিগারিং কন্টেইনার, রিসোর্স পরিচালনা দেখুন।
Ingress প্রায়ই Ingress কন্ট্রোলারের উপর নির্ভর করে কিছু বিকল্প কনফিগার করতে অ্যানোটেশন ব্যবহার করে, যার একটি উদাহরণ
হল rewrite-target অ্যানোটেশন।
বিভিন্ন Ingress কন্ট্রোলার বিভিন্ন অ্যানোটেশন সমর্থন করে।
সমর্থিত কোন অ্যানোটেশনগুলি শিখতে আপনার পছন্দের Ingress কন্ট্রোলারের ডকুমেন্টেশন পর্যালোচনা করুন।
Ingress স্পেস এ লোড ব্যালেন্সার বা প্রক্সি সার্ভার কনফিগার করার জন্য প্রয়োজনীয় সমস্ত তথ্য রয়েছে। সবচেয়ে গুরুত্বপূর্ণভাবে, এটি সমস্ত আসন্ন অনুরোধের বিরুদ্ধে মেলানো নিয়মগুলির একটি তালিকা ধারণ করে। Ingress রিসোর্স শুধুমাত্র HTTP(S) ট্রাফিক পরিচালনার জন্য নিয়ম সমর্থন করে।
যদি ingressClassName
বাদ দেওয়া হয়, একটি ডিফল্ট Ingress ক্লাস
সংজ্ঞায়িত করা উচিত।
কিছু ingress কন্ট্রোলার আছে, যা একটি ডিফল্ট IngressClass
সংজ্ঞা
ছাড়াই কাজ করে। উদাহরণস্বরূপ, Ingress-NGINX কন্ট্রোলারটি একটি
ফ্ল্যাগ
--watch-ingress-without-class
দিয়ে কনফিগার করা যেতে পারে। এটি প্রস্তাবিত যদিও,
ডিফল্ট IngressClass
নির্দিষ্ট করতে যেমন নীচে দেখানো হয়েছে।
Ingress নিয়ম
প্রতিটি HTTP নিয়মে নিম্নলিখিত তথ্য রয়েছে:
- একটি অপশনাল হোস্ট। এই উদাহরণে, কোন হোস্ট নির্দিষ্ট করা হয়নি, তাই নিয়মটি নির্দিষ্ট করা IP ঠিকানার মাধ্যমে সমস্ত ইনবাউন্ড HTTP ট্রাফিকের জন্য প্রযোজ্য। যদি একটি হোস্ট প্রদান করা হয় (উদাহরণস্বরূপ, foo.bar.com), নিয়মগুলি সেই হোস্টের জন্য প্রযোজ্য।
- একটি পাথের তালিকা (উদাহরণস্বরূপ,
/testpath
), যার প্রতিটিতে একটিservice.name
এবং একটিservice.port.name
বাservice.port.number
সহ একটি সম্পর্কিত ব্যাকএন্ড সংজ্ঞায়িত করা হয়েছে। হোস্ট এবং পাথ উভয়ই একটি আসন্ন অনুরোধের বিষয়বস্তু মেলাতে হবে এর আগে লোড ব্যালেন্সার ট্রাফিককে উল্লেখিত সার্ভিসে নির্দেশ করে। - একটি ব্যাকএন্ড হল সার্ভিস ডক বা একটি কাস্টম রিসোর্স ব্যাকএন্ড দ্বারা বর্ণিত সার্ভিস এবং পোর্ট নামগুলির একটি সংমিশ্রণ CRD এর মাধ্যমে। Ingress-এ হোস্ট এবং পাথের নিয়ম মেলে এমন HTTP (এবং HTTPS) অনুরোধগুলি তালিকাভুক্ত ব্যাকএন্ডে পাঠানো হয়।
একটি defaultBackend
প্রায়শই একটি Ingress কন্ট্রোলারে কনফিগার করা হয় যাতে কোনও অনুরোধের জন্য সার্ভিস দেওয়া হয় যা স্পেসে কোনও
পাথের সাথে মেলে না।
DefaultBackend
কোন নিয়ম ছাড়াই একটি Ingress সমস্ত ট্রাফিককে একটি একক ডিফল্ট ব্যাকএন্ডে পাঠায় এবং .spec.defaultBackend
হল ব্যাকএন্ড যা সেই ক্ষেত্রে অনুরোধগুলি পরিচালনা করা উচিত।
defaultBackend
প্রচলিতভাবে একটি
Ingress কন্ট্রোলার
এর একটি কনফিগারেশন বিকল্প এবং আপনার Ingress রিসোর্সগুলিতে নির্দিষ্ট করা হয় না।
যদি কোনও .spec.rules
নির্দিষ্ট না করা হয়, তবে .spec.defaultBackend
নির্দিষ্ট করা আবশ্যক।
যদি defaultBackend
সেট না করা হয়, তাহলে কোনও নিয়মের সাথে মেলে না এমন অনুরোধগুলির পরিচালনা ingress কন্ট্রোলারের উপর
নির্ভর করবে (এই ক্ষেত্রে এটি কীভাবে পরিচালনা করে তা জানতে আপনার ingress কন্ট্রোলারের ডকুমেন্টেশন পরামর্শ করুন)।
যদি কোনও হোস্ট বা পাথ Ingress অবজেক্টগুলিতে HTTP অনুরোধের সাথে মেলে না, তাহলে ট্রাফিক আপনার ডিফল্ট ব্যাকএন্ডে রাউট করা হয়।
রিসোর্স ব্যাকএন্ড
একটি Resource
ব্যাকএন্ড হল Ingress অবজেক্টের মতো একই নেমস্পেসের অন্য
Kubernetes রিসোর্সের একটি ObjectRef। একটি Resource
সার্ভিসের সাথে পারস্পরিক
একচেটিয়া সেটিং এবং উভয় নির্দিষ্ট করা থাকলে বৈধতা ব্যর্থ হবে। একটি Resource
ব্যাকএন্ডের
একটি সাধারণ ব্যবহার হল স্ট্যাটিক অ্যাসেট সহ একটি অবজেক্ট স্টোরেজ ব্যাকএন্ডে
ডেটা ইনগ্রেস করা।
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-resource-backend
spec:
defaultBackend:
resource:
apiGroup: k8s.example.com
kind: StorageBucket
name: static-assets
rules:
- http:
paths:
- path: /icons
pathType: ImplementationSpecific
backend:
resource:
apiGroup: k8s.example.com
kind: StorageBucket
name: icon-assets
উপরে Ingress তৈরি করার পরে, আপনি নিম্নলিখিত কমান্ড দিয়ে এটি দেখতে পারেন:
kubectl describe ingress ingress-resource-backend
Name: ingress-resource-backend
Namespace: default
Address:
Default backend: APIGroup: k8s.example.com, Kind: StorageBucket, Name: static-assets
Rules:
Host Path Backends
---- ---- --------
*
/icons APIGroup: k8s.example.com, Kind: StorageBucket, Name: icon-assets
Annotations: <none>
Events: <none>
পাথ টাইপ
Ingress-এ প্রতিটি পাথের একটি সংশ্লিষ্ট পাথ টাইপ থাকা প্রয়োজন। যেসব পাথে
একটি স্পষ্ট pathType
অন্তর্ভুক্ত নেই তারা বৈধতা ব্যর্থ করবে।
তিনটি সমর্থিত পাথ টাইপ রয়েছে:
-
ImplementationSpecific
: এই পাথ টাইপের সাথে, মেলানো IngressClass এর উপর নির্ভর করে। বাস্তবায়নগুলি এটিকে একটি পৃথকpathType
হিসাবে বাPrefix
বাExact
পাথ টাইপগুলির সাথে অভিন্ন হিসাবে বিবেচনা করতে পারে। -
Exact
: URL পাথটি ঠিক এবং কেস সংবেদনশীলতার সাথে মেলে। -
Prefix
:/
দ্বারা বিভক্ত একটি URL পাথ প্রিফিক্সের উপর ভিত্তি করে মেলে। মেলানো কেস সংবেদনশীল এবং একটি পাথ উপাদান দ্বারা উপাদান ভিত্তিতে করা হয়। একটি পাথ উপাদানটি/
বিভাজক দ্বারা বিভক্ত পাথের লেবেলের তালিকাকে বোঝায়। একটি অনুরোধ পাথ p এর উপাদান-ওয়াইজ প্রিফিক্স হলে পাথ p এর জন্য একটি ম্যাচ।বিঃদ্রঃ:
যদি পাথের শেষ উপাদানটি অনুরোধ পাথের শেষ উপাদানের একটি সাবস্ট্রিং হয়, তবে এটি একটি ম্যাচ নয় (উদাহরণস্বরূপ:/foo/bar
/foo/bar/baz
এর সাথে মেলে, কিন্তু/foo/barbaz
এর সাথে মেলে না)।
উদাহরণ
প্রকার | পাথ(গুলি) | অনুরোধ পাথ(গুলি) | মেলে? |
---|---|---|---|
Prefix | / |
(সব পাথ) | হ্যাঁ |
Exact | /foo |
/foo |
হ্যাঁ |
Exact | /foo |
/bar |
না |
Exact | /foo |
/foo/ |
না |
Exact | /foo/ |
/foo |
না |
Prefix | /foo |
/foo , /foo/ |
হ্যাঁ |
Prefix | /foo/ |
/foo , /foo/ |
হ্যাঁ |
Prefix | /aaa/bb |
/aaa/bbb |
না |
Prefix | /aaa/bbb |
/aaa/bbb |
হ্যাঁ |
Prefix | /aaa/bbb/ |
/aaa/bbb |
হ্যাঁ, শেষ স্ল্যাশ উপেক্ষা করে |
Prefix | /aaa/bbb |
/aaa/bbb/ |
হ্যাঁ, শেষ স্ল্যাশ মেলে |
Prefix | /aaa/bbb |
/aaa/bbb/ccc |
হ্যাঁ, সাবপাথ মেলে |
Prefix | /aaa/bbb |
/aaa/bbbxyz |
না, স্ট্রিং প্রিফিক্স মেলে না |
Prefix | / , /aaa |
/aaa/ccc |
হ্যাঁ, /aaa প্রিফিক্স মেলে |
Prefix | / , /aaa , /aaa/bbb |
/aaa/bbb |
হ্যাঁ, /aaa/bbb প্রিফিক্স মেলে |
Prefix | / , /aaa , /aaa/bbb |
/ccc |
হ্যাঁ, / প্রিফিক্স মেলে |
Prefix | /aaa |
/ccc |
না, ডিফল্ট ব্যাকএন্ড ব্যবহার করে |
Mixed | /foo (Prefix), /foo (Exact) |
/foo |
হ্যাঁ, Exact পছন্দ করে |
একাধিক ম্যাচ
কিছু ক্ষেত্রে, একটি অনুরোধের সাথে Ingress-এর একাধিক পাথ মেলে। সেই ক্ষেত্রে অগ্রাধিকার প্রথমে দীর্ঘতম মেলানো পাথকে দেওয়া হবে। যদি দুটি পাথ এখনও সমানভাবে মেলে, অগ্রাধিকারটি প্রিফিক্স পাথ টাইপের উপর সঠিক পাথ টাইপের পাথগুলিকে দেওয়া হবে।
হোস্টনাম ওয়াইল্ডকার্ড
হোস্টগুলি সুনির্দিষ্ট ম্যাচ (উদাহরণস্বরূপ “foo.bar.com
”) বা একটি ওয়াইল্ডকার্ড
(উদাহরণস্বরূপ “*.foo.com
”) হতে পারে। সুনির্দিষ্ট ম্যাচগুলির জন্য প্রয়োজন যে
HTTP host
হেডারটি host
ক্ষেত্রের সাথে মেলে। ওয়াইল্ডকার্ড ম্যাচগুলির জন্য প্রয়োজন যে HTTP host
হেডারটি
ওয়াইল্ডকার্ড নিয়মের উপসর্গের সমান।
হোস্ট | হোস্ট হেডার | মেলে? |
---|---|---|
*.foo.com |
bar.foo.com |
ভাগ করা উপসর্গের উপর ভিত্তি করে মেলে |
*.foo.com |
baz.bar.foo.com |
মেলে না, ওয়াইল্ডকার্ড শুধুমাত্র একটি একক DNS লেবেল কভার করে |
*.foo.com |
foo.com |
মেলে না, ওয়াইল্ডকার্ড শুধুমাত্র একটি একক DNS লেবেল কভার করে |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/bar"
backend:
service:
name: service1
port:
number: 80
- host: "*.foo.com"
http:
paths:
- pathType: Prefix
path: "/foo"
backend:
service:
name: service2
port:
number: 80
Ingress ক্লাস
Ingress বিভিন্ন কন্ট্রোলার দ্বারা বাস্তবায়িত হতে পারে, প্রায়শই বিভিন্ন কনফিগারেশন সহ। প্রতিটি Ingress একটি ক্লাস নির্দিষ্ট করা উচিত, একটি রেফারেন্স IngressClass রিসোর্স যা অতিরিক্ত কনফিগারেশন ধারণ করে যার মধ্যে রয়েছে কন্ট্রোলারের নাম যা ক্লাসটি বাস্তবায়িত করা উচিত।
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb
spec:
controller: example.com/ingress-controller
parameters:
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb
IngressClass এর .spec.parameters
ক্ষেত্রটি আপনাকে একটি রিসোর্স উল্লেখ করতে দেয়
যা সেই IngressClass এর সাথে সম্পর্কিত কনফিগারেশন প্রদান করে।
ব্যবহার করার জন্য নির্দিষ্ট ধরণের প্যারামিটারগুলি আপনি IngressClass এর .spec.controller
ক্ষেত্রে যে
ingress কন্ট্রোলারটি নির্দিষ্ট করেছেন তার উপর নির্ভর করে।
IngressClass স্কোপ
আপনার ingress কন্ট্রোলারের উপর নির্ভর করে, আপনি প্যারামিটারগুলি ব্যবহার করতে সক্ষম হতে পারেন যা আপনি ক্লাস্টার-ওয়াইড বা শুধুমাত্র একটি নেমস্পেসের জন্য সেট করেন।
IngressClass প্যারামিটারগুলির জন্য ডিফল্ট স্কোপ হল ক্লাস্টার-ওয়াইড।
যদি আপনি .spec.parameters
ক্ষেত্রটি সেট করেন এবং সেট না করেন
.spec.parameters.scope
, বা যদি আপনি .spec.parameters.scope
সেট করেন
Cluster
এ, তাহলে IngressClass একটি ক্লাস্টার-স্কোপড রিসোর্সকে বোঝায়।
প্যারামিটারগুলির kind
(apiGroup এর সাথে মিলিত) একটি ক্লাস্টার-স্কোপড
API (সম্ভবত একটি কাস্টম রিসোর্স) বোঝায় এবং
প্যারামিটারগুলির name
সেই API এর জন্য একটি নির্দিষ্ট ক্লাস্টার
স্কোপড রিসোর্স সনাক্ত করে।
উদাহরণস্বরূপ:
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-1
spec:
controller: example.com/ingress-controller
parameters:
# এই IngressClass এর প্যারামিটারগুলি একটি
# ClusterIngressParameter (API group k8s.example.net) এ নির্দিষ্ট করা হয়েছে
# "external-config-1" নামক। এই সংজ্ঞাটি Kubernetes কে বলে
# একটি ক্লাস্টার-স্কোপড প্যারামিটার রিসোর্সের জন্য সন্ধান করুন।
scope: Cluster
apiGroup: k8s.example.net
kind: ClusterIngressParameter
name: external-config-1
কুবারনেটিস v1.23 [stable]
যদি আপনি .spec.parameters
ক্ষেত্রটি সেট করেন এবং সেট করেন
.spec.parameters.scope
Namespace
এ, তাহলে IngressClass
একটি নেমস্পেসড-স্কোপড রিসোর্সকে বোঝায়। আপনাকে অবশ্যই .spec.parameters
এর মধ্যে namespace
ক্ষেত্রটি সেট করতে হবে
আপনি যে নেমস্পেসে প্যারামিটারগুলি ব্যবহার করতে চান তা ধারণ করে।
প্যারামিটারগুলির kind
(apiGroup এর সাথে মিলিত) একটি নেমস্পেসড API
(উদাহরণস্বরূপ: ConfigMap) বোঝায় এবং
প্যারামিটারগুলির name
আপনি namespace
এ নির্দিষ্ট করা নেমস্পেসে একটি
নির্দিষ্ট রিসোর্স সনাক্ত করে।
নেমস্পেসড প্যারামিটারগুলি ক্লাস্টার অপারেটরকে কনফিগারেশনের উপর নিয়ন্ত্রণ অর্পণ করতে সহায়তা করে (উদাহরণস্বরূপ: লোড ব্যালেন্সার সেটিংস, API গেটওয়ে সংজ্ঞা) যা একটি ওয়ার্কলোডের জন্য ব্যবহৃত হয়। আপনি যদি একটি ক্লাস্টার-স্কোপড প্যারামিটার ব্যবহার করেন তবে হয়:
- ক্লাস্টার অপারেটর টিমকে একটি ভিন্ন টিমের পরিবর্তনগুলি অনুমোদন করতে হবে প্রতিবার একটি নতুন কনফিগারেশন পরিবর্তন প্রয়োগ করা হচ্ছে।
- ক্লাস্টার অপারেটরকে নির্দিষ্ট অ্যাক্সেস নিয়ন্ত্রণগুলি সংজ্ঞায়িত করতে হবে, যেমন RBAC ভূমিকা এবং বাইন্ডিং, যা অ্যাপ্লিকেশন টিমকে ক্লাস্টার-স্কোপড প্যারামিটার রিসোর্সে পরিবর্তন করতে দেয়।
IngressClass API নিজেই সর্বদা ক্লাস্টার-স্কোপড।
এখানে একটি উদাহরণ দেওয়া হল একটি IngressClass যা প্যারামিটারগুলিকে বোঝায় যা নেমস্পেসড:
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-2
spec:
controller: example.com/ingress-controller
parameters:
# এই IngressClass এর প্যারামিটারগুলি একটি
# IngressParameter (API group k8s.example.com) এ নির্দিষ্ট করা হয়েছে, "external-config" নামক,
# যা "external-configuration" নেমস্পেসে।
scope: Namespace
apiGroup: k8s.example.com
kind: IngressParameter
namespace: external-configuration
name: external-config
অপ্রচলিত অ্যানোটেশন
IngressClass রিসোর্স এবং ingressClassName
ক্ষেত্রটি Kubernetes 1.18 এ
যোগ করার আগে, Ingress ক্লাসগুলি একটি
Ingress-এ kubernetes.io/ingress.class
অ্যানোটেশন। এই অ্যানোটেশনটি
কখনই আনুষ্ঠানিকভাবে সংজ্ঞায়িত করা হয়নি, তবে এটি ব্যাপকভাবে সমর্থিত ছিল Ingress কন্ট্রোলার দ্বারা।
Ingress-এ নতুন ingressClassName
ক্ষেত্রটি সেই অ্যানোটেশনের জন্য একটি প্রতিস্থাপন,
তবে এটি একটি সরাসরি সমতুল্য নয়। যদিও অ্যানোটেশনটি সাধারণত Ingress কন্ট্রোলারের
নাম উল্লেখ করতে ব্যবহৃত হত যা Ingress বাস্তবায়ন করা উচিত, ক্ষেত্রটি
একটি IngressClass রিসোর্সের একটি রেফারেন্স যা অতিরিক্ত Ingress কনফিগারেশন ধারণ করে,
যার মধ্যে রয়েছে Ingress কন্ট্রোলারের নাম।
ডিফল্ট IngressClass
আপনি আপনার ক্লাস্টারের জন্য একটি নির্দিষ্ট IngressClass ডিফল্ট হিসাবে চিহ্নিত করতে পারেন।
একটি IngressClass রিসোর্সে ingressclass.kubernetes.io/is-default-class
অ্যানোটেশন
true
এ সেট করা নিশ্চিত করবে যে নতুন Ingresses যেগুলিতে একটি ingressClassName
ক্ষেত্র
নির্দিষ্ট করা নেই সেগুলি এই ডিফল্ট IngressClass বরাদ্দ করা হবে।
সতর্কতা:
যদি আপনার ক্লাস্টারের জন্য একাধিক IngressClass ডিফল্ট হিসাবে চিহ্নিত করা থাকে, অ্যাডমিশন কন্ট্রোলার নতুন Ingress অবজেক্ট তৈরি করা থেকে বিরত থাকে যেগুলিতে একটিingressClassName
নির্দিষ্ট করা নেই। আপনি নিশ্চিত করে এটি সমাধান করতে পারেন যে সর্বাধিক 1
IngressClass আপনার ক্লাস্টারে ডিফল্ট হিসাবে চিহ্নিত করা হয়েছে।কিছু ingress কন্ট্রোলার আছে, যা একটি ডিফল্ট IngressClass
সংজ্ঞা ছাড়াই কাজ করে।
উদাহরণস্বরূপ, Ingress-NGINX কন্ট্রোলারটি একটি
ফ্ল্যাগ
--watch-ingress-without-class
দিয়ে কনফিগার করা যেতে পারে। এটি প্রস্তাবিত যদিও, ডিফল্ট
IngressClass
নির্দিষ্ট করতে:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx-example
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx
Ingress এর ধরন
একটি একক সার্ভিস দ্বারা সমর্থিত Ingress
একটি একক সার্ভিস উন্মুক্ত করার জন্য বিদ্যমান Kubernetes ধারণা রয়েছে (দেখুন বিকল্প)। আপনি একটি Ingress সহ একটি ডিফল্ট ব্যাকএন্ড নির্দিষ্ট করে এটি করতে পারেন কোন নিয়ম ছাড়াই।
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
defaultBackend:
service:
name: test
port:
number: 80
যদি আপনি এটি kubectl apply -f
ব্যবহার করে তৈরি করেন তবে আপনি যুক্ত করা Ingress
এর অবস্থা দেখতে সক্ষম হবেন:
kubectl get ingress test-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
test-ingress external-lb * 203.0.113.123 80 59s
যেখানে 203.0.113.123
হল Ingress কন্ট্রোলার দ্বারা বরাদ্দ করা IP এই
Ingress পূরণ করতে।
বিঃদ্রঃ:
Ingress কন্ট্রোলার এবং লোড ব্যালেন্সারগুলির একটি IP ঠিকানা বরাদ্দ করতে এক বা দুই মিনিট সময় লাগতে পারে। সেই সময় পর্যন্ত, আপনি প্রায়শই ঠিকানাটি<pending>
হিসাবে তালিকাভুক্ত দেখতে পান।সহজ ফ্যানআউট
একটি ফ্যানআউট কনফিগারেশন একটি একক IP ঠিকানা থেকে একাধিক সার্ভিসে ট্রাফিক রুট করে, অনুরোধ করা HTTP URI এর উপর ভিত্তি করে। একটি Ingress আপনাকে লোড ব্যালেন্সারের সংখ্যা কমিয়ে রাখতে দেয় একটি ন্যূনতম। উদাহরণস্বরূপ, একটি সেটআপের মতো:
চিত্র। Ingress ফ্যান আউট
এটি একটি Ingress প্রয়োজন যেমন:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
যখন আপনি kubectl apply -f
দিয়ে Ingress তৈরি করেন:
kubectl describe ingress simple-fanout-example
Name: simple-fanout-example
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:
Host Path Backends
---- ---- --------
foo.bar.com
/foo service1:4200 (10.8.0.90:4200)
/bar service2:8080 (10.8.0.91:8080)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ADD 22s loadbalancer-controller default/test
Ingress কন্ট্রোলার একটি বাস্তবায়ন-নির্দিষ্ট লোড ব্যালেন্সার সরবরাহ করে
যা Ingress পূরণ করে, যতক্ষণ না সার্ভিসগুলি (service1
, service2
) বিদ্যমান থাকে।
যখন এটি করেছে, আপনি লোড ব্যালেন্সারের ঠিকানা দেখতে পারেন
ঠিকানা ক্ষেত্র।
বিঃদ্রঃ:
আপনি যে Ingress কন্ট্রোলার ব্যবহার করছেন তার উপর নির্ভর করে, আপনাকে একটি ডিফল্ট-http-backend তৈরি করতে হতে পারে সার্ভিস।নাম ভিত্তিক ভার্চুয়াল হোস্টিং
নাম-ভিত্তিক ভার্চুয়াল হোস্টগুলি একই IP ঠিকানায় একাধিক হোস্ট নামের জন্য HTTP ট্রাফিক রাউটিং সমর্থন করে।
চিত্র। Ingress নাম ভিত্তিক ভার্চুয়াল হোস্টিং
নিম্নলিখিত Ingress ব্যাকিং লোড ব্যালেন্সারকে Host হেডার এর উপর ভিত্তি করে অনুরোধগুলি রাউট করতে বলে।
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: bar.foo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
যদি আপনি কোনও হোস্ট সংজ্ঞায়িত না করে একটি Ingress রিসোর্স তৈরি করেন তবে নিয়মগুলি, তাহলে আপনার Ingress কন্ট্রোলারের IP ঠিকানায় যেকোনো ওয়েব ট্রাফিক একটি নাম ভিত্তিক ভার্চুয়াল হোস্ট প্রয়োজন ছাড়াই মেলানো যেতে পারে।
উদাহরণস্বরূপ, নিম্নলিখিত Ingress রুট ট্রাফিক
first.bar.com
এর জন্য অনুরোধ করা service1
এ, second.bar.com
এ service2
এ,
এবং যেকোনো ট্রাফিক যার অনুরোধ হোস্ট হেডার first.bar.com
এর সাথে মেলে না
এবং second.bar.com
service3
এ।
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress-no-third-host
spec:
rules:
- host: first.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: second.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
- http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service3
port:
number: 80
TLS
আপনি একটি সিক্রেট নির্দিষ্ট করে একটি Ingress সুরক্ষিত করতে পারেন
যা একটি TLS ব্যক্তিগত কী এবং শংসাপত্র ধারণ করে। Ingress রিসোর্স শুধুমাত্র
একটি একক TLS পোর্ট, 443 সমর্থন করে এবং Ingress পয়েন্টে TLS সমাপ্তি ধরে নেয়
(সার্ভিস এবং এর পডগুলিতে ট্র্যাফিক প্লেইনটেক্সটে থাকে)।
যদি একটি Ingress-এ TLS কনফিগারেশন বিভাগে বিভিন্ন হোস্ট নির্দিষ্ট করা থাকে, তবে সেগুলি
SNI TLS এক্সটেনশনের মাধ্যমে নির্দিষ্ট হোস্টনাম অনুসারে একই পোর্টে মাল্টিপ্লেক্স করা
হয় (Ingress কন্ট্রোলার SNI সমর্থন করে)। TLS সিক্রেটে tls.crt
এবং tls.key
নামে কী থাকতে হবে যা TLS এর জন্য ব্যবহার করার শংসাপত্র এবং
ব্যক্তিগত কী ধারণ করে। উদাহরণস্বরূপ:
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: base64 এনকোড করা সার্ট
tls.key: base64 এনকোড করা কী
type: kubernetes.io/tls
একটি Ingress-এ এই সিক্রেটটি উল্লেখ করা Ingress কন্ট্রোলারকে
TLS ব্যবহার করে ক্লায়েন্ট থেকে লোড ব্যালেন্সারে চ্যানেলটি সুরক্ষিত করতে বলে। আপনাকে নিশ্চিত করতে হবে
আপনি যে TLS সিক্রেটটি তৈরি করেছেন তা একটি শংসাপত্র থেকে এসেছে যাতে একটি সাধারণ
নাম (CN), এছাড়াও https-example.foo.com
এর জন্য একটি সম্পূর্ণ যোগ্য ডোমেন নাম (FQDN) হিসাবে পরিচিত।
বিঃদ্রঃ:
মনে রাখবেন যে TLS ডিফল্ট নিয়মে কাজ করবে না কারণ শংসাপত্রগুলি সমস্ত সম্ভাব্য সাব-ডোমেনের জন্য জারি করা উচিত। অতএব,tls
বিভাগে rules
বিভাগে host
এর সাথে স্পষ্টভাবে মেলাতে
হবে।apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- https-example.foo.com
secretName: testsecret-tls
rules:
- host: https-example.foo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
বিঃদ্রঃ:
বিভিন্ন Ingress দ্বারা সমর্থিত TLS ফিচারগুলির মধ্যে একটি ফাঁক রয়েছে কন্ট্রোলার. অনুগ্রহ করে ডকুমেন্টেশন দেখুন nginx, GCE, বা অন্য কোন প্ল্যাটফর্ম নির্দিষ্ট Ingress কন্ট্রোলার বুঝতে আপনার পরিবেশে TLS কিভাবে কাজ করে।লোড ব্যালেন্সিং
একটি Ingress কন্ট্রোলার কিছু লোড ব্যালেন্সিং নীতি সেটিংস সহ বুটস্ট্র্যাপ করা হয় যা এটি সমস্ত Ingress-এ প্রয়োগ করে, যেমন লোড ব্যালেন্সিং অ্যালগরিদম, ব্যাকএন্ড ওজন স্কিম, এবং অন্যান্য। আরো উন্নত লোড ব্যালেন্সিং ধারণা (যেমন স্থায়ী সেশন, গতিশীল ওজন) এখনও Ingress এর মাধ্যমে প্রকাশ করা হয়নি। আপনি পরিবর্তে সার্ভিসের জন্য ব্যবহৃত লোড ব্যালেন্সারের মাধ্যমে এই ফিচারগুলি পেতে পারেন।
এটি উল্লেখ করার মতো যে স্বাস্থ্য পরীক্ষা সরাসরি প্রকাশ করা হয় না Ingress এর মাধ্যমে, Kubernetes-এ সমান্তরাল ধারণা যেমন readiness probes যা আপনাকে একই শেষ ফলাফল অর্জন করতে দেয়। অনুগ্রহ করে কন্ট্রোলার পর্যালোচনা করুন নির্দিষ্ট ডকুমেন্টেশন দেখতে তারা স্বাস্থ্য পরীক্ষা কিভাবে পরিচালনা করে (উদাহরণস্বরূপ: nginx, বা GCE)।
একটি Ingress আপডেট করা
একটি নতুন হোস্ট যোগ করতে একটি বিদ্যমান Ingress আপডেট করতে, আপনি এটি সম্পাদনা করে আপডেট করতে পারেন:
kubectl describe ingress test
Name: test
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:
Host Path Backends
---- ---- --------
foo.bar.com
/foo service1:80 (10.8.0.90:80)
Annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ADD 35s loadbalancer-controller default/test
kubectl edit ingress test
এটি YAML ফরম্যাটে বিদ্যমান কনফিগারেশন সহ একটি সম্পাদক পপ আপ করে। নতুন হোস্ট অন্তর্ভুক্ত করতে এটি পরিবর্তন করুন:
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
service:
name: service1
port:
number: 80
path: /foo
pathType: Prefix
- host: bar.baz.com
http:
paths:
- backend:
service:
name: service2
port:
number: 80
path: /foo
pathType: Prefix
..
আপনার পরিবর্তনগুলি সংরক্ষণ করার পরে, kubectl API সার্ভারে রিসোর্সটি আপডেট করে, যা বলে Ingress কন্ট্রোলার লোড ব্যালেন্সার পুনরায় কনফিগার করতে।
এটি যাচাই করুন:
kubectl describe ingress test
Name: test
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:
Host Path Backends
---- ---- --------
foo.bar.com
/foo service1:80 (10.8.0.90:80)
bar.baz.com
/foo service2:80 (10.8.0.91:80)
Annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ADD 45s loadbalancer-controller default/test
আপনি একটি পরিবর্তিত Ingress YAML ফাইলে kubectl replace -f
আহ্বান করে একই ফলাফল অর্জন করতে পারেন।
প্রাপ্যতা জোন জুড়ে ব্যর্থ হচ্ছে
ব্যর্থতার ডোমেনগুলির মধ্যে ট্র্যাফিক ছড়িয়ে দেওয়ার কৌশলগুলি ক্লাউড প্রদানকারীদের মধ্যে আলাদা। বিস্তারিত জানার জন্য প্রাসঙ্গিক Ingress কন্ট্রোলার এর ডকুমেন্টেশন চেক করুন।
বিকল্প
আপনি একটি সার্ভিসকে একাধিক উপায়ে উন্মুক্ত করতে পারেন যা সরাসরি Ingress রিসোর্সের সাথে জড়িত নয়:
- Service.Type=LoadBalancer ব্যবহার করুন
- Service.Type=NodePort ব্যবহার করুন
এর পরের কি
- Ingress API সম্পর্কে জানুন
- Ingress কন্ট্রোলার সম্পর্কে জানুন
- NGINX কন্ট্রোলার সহ Minikube-এ Ingress সেট আপ করুন