সম্প্রতি, একটি কর্মশালাতে কাজ করার সময়GKE এবং GitHub অ্যাকশন সহ Kubernetes এ আপনার পুল অনুরোধ পরীক্ষা করুন, আমি একই সমস্যা দুবার মুখোমুখি হয়েছি: পরিষেবা A পরিষেবা B প্রয়োজন, কিন্তু পরিষেবা A পরিষেবা B তুলনায় দ্রুত শুরু করে এবং সিস্টেম ব্যর্থ হয়।
অপেক্ষায় রয়েছেন কুমার
Kubernetes এ অপেক্ষা করার জন্য এটি অদ্ভুত মনে হতে পারে। Kubernetes প্ল্যাটফর্মের স্বেচ্ছাসেবী প্রকৃতি তার বৃহত্তম সুবিধাগুলির মধ্যে একটি।
অ্যাপ্লিকেশনটি খুব দ্রুত শুরু করে এবং ব্যস্তভাবে ডাটাবেসের সাথে সংযোগ স্থাপন করার চেষ্টা করে। এদিকে, ডাটাবেসটি প্রদত্ত ডেটাবেসের সাথে নিজেকে শুরু করে; সংযোগটি ব্যর্থ হয়।Failed
রাষ্ট্র
কিছু সময়ের পরে, Kubernetes অ্যাপ্লিকেশন পড এর অবস্থা অনুরোধ করে. কারণ এটি ব্যর্থ হয়, এটি এটি বন্ধ করে এবং একটি নতুন পড শুরু করে. এই মুহূর্তে, দুটি জিনিস ঘটতে পারে: ডাটাবেস পড এখনও প্রস্তুত নয়, এবং এটি এক্সপোর্ডে ফিরে এসেছে, অথবা এটি প্রস্তুত, এবং অ্যাপ্লিকেশন অবশেষে সংযোগ করে।
প্রক্রিয়াকে গতিশীল করার জন্য, Kubernetes অফারস্টার্টআপ পরীক্ষা:
startupProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 30
periodSeconds: 10
উপরের স্যান্ড দিয়ে, Kubernetes পডের অবস্থা অনুরোধ করার আগে একটি প্রাথমিক দশ সেকেন্ডের জন্য অপেক্ষা করে. যদি এটি ব্যর্থ হয়, তবে এটি আরও দশ সেকেন্ডের জন্য অপেক্ষা করে।
আপনি HTTP দেখতে পেতে পারেন/health
অ্যাপ্লিকেশন: Kubernetes দুটি অ্যাপ্লিকেশন অফার করেপরীক্ষাConfiguration সেটিংসঃhttpGet
অথবাexec
. প্রথমটি ওয়েব অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত, যখন পরবর্তীটি অন্যান্য অ্যাপ্লিকেশনগুলির জন্য। এটি মানে আমরা বুঝতে হবে যে পডটি কোন ধরনের কনটেইনার অন্তর্ভুক্ত করে এবং এটি সম্ভব হলে এর অবস্থা কীভাবে চেক করা যায়।হেলমেট চার্টপ্রয়োগ করার সময় এটি নিম্নলিখিত দেখায়:
startupProbe:
exec:
command:
- /bin/sh
- -c
- -e
- exec pg_isready -U $PG_USER -h $PG_HOST -p $PG_PORT
লক্ষ্য করুন যে উপরের একটি সহজকরণ, যেহেতু এটি আনন্দে ডাটাবেস নাম এবং একটি এসএসএল সার্টিফিকেটকে অবহেলা করে।
আপনি যদি এটি সঠিকভাবে কনফিগার করেন তবে স্টার্টআপ সনডারটি ডিফল্ট পরিস্থিতির তুলনায় জিনিসগুলি গতিশীল করে। আপনি একটি দীর্ঘ প্রাথমিক দেরি এবং তারপর সংক্ষিপ্ত বৃদ্ধি সেট করতে পারেন. তবে, কনটেইনারগুলি যত বেশি বৈচিত্র্যপূর্ণ, এটি কনফিগার করা কঠিন হবে, কারণ আপনাকে প্রত্যেকটি ভিত্তিক কনটেইনারে বিশেষজ্ঞ হতে হবে।
বিকল্পগুলি খুঁজে বের করা লাভজনক হবে।
অপেক্ষা4x
বিকল্পগুলি এমন সরঞ্জাম যা অপেক্ষার উপর দৃষ্টি আকর্ষণ করে।অপেক্ষাএই ধারণাটি খুবই সহজ, এই ধারণাটি সহজ:
./wait-for একটি স্ক্রিপ্ট যা docker কনটেইনার মত পরিষেবাগুলি সমন্বয় করার জন্য ডিজাইন করা হয়েছে. এটি sh এবং alpine সামঞ্জস্যপূর্ণ।
./wait-for
একটি স্ক্রিপ্ট ডিজাইন করা হয়েছে docker কনটেইনার মত পরিষেবাগুলি সমন্বয় করার জন্য।sh
এবংalpine
একমত
এখানে একটি HTTP API জন্য অপেক্ষা কিভাবে:
sh -c './wait-for http://my.api/health -- echo "The api is up! Let's use it"'
এটি কাজটি সম্পন্ন করেছে, কিন্তু সেই সময়ে, আপনাকে স্ক্রিপ্টটি কপি করতে এবং ম্যানুয়ালভাবে আপডেটগুলির জন্য চেক করতে হয়েছিল. আমি চেক করেছি, এবং প্রকল্পটি এখন একটি নিয়মিত কনটেইনার সরবরাহ করে।
অপেক্ষা4xএকই ভূমিকা পালন করে, কিন্তু একটি সংস্করণযুক্ত কনটেইনার হিসাবে উপলব্ধ এবং আরও পরিষেবাগুলি প্রদান করে যা অপেক্ষা করতে পারে: HTTP, DNS, ডাটাবেস এবং বার্তা রেখা।
আপনি যে কোনও টুল ব্যবহার করেন, আপনি এটি একটি ভিতরে ব্যবহার করতে পারেনইনিংস কনটেইনার:
একটি পড অ্যাপ্লিকেশনগুলি চালানোর একাধিক কনটেইনার থাকতে পারে, কিন্তু এটি একটি বা একাধিক init কনটেইনারও থাকতে পারে, যা অ্যাপ্লিকেশন কনটেইনারগুলি চালানোর আগে চালানো হয়।
Init কনটেইনার সাধারণ কনটেইনার, ব্যতিক্রম:
প্রতিটি init কনটেইনার পরবর্তী শুরু করার আগে সফলভাবে সম্পন্ন করতে হবে।
একটি পড অ্যাপ্লিকেশনগুলি চালানোর একাধিক কনটেইনার থাকতে পারে, কিন্তু এটি একটি বা একাধিক init কনটেইনারও থাকতে পারে, যা অ্যাপ্লিকেশন কনটেইনারগুলি চালানোর আগে চালানো হয়।
Init কনটেইনার সাধারণ কনটেইনার, ব্যতিক্রম:
- প্রতিটি init কনটেইনার পরবর্তী শুরু করার আগে সফলভাবে সম্পন্ন করতে হবে।
পরবর্তী কল্পনা করুনPod
এটি একটি PostgreSQL উপর নির্ভর করেDeployment
:
apiVersion: v1
kind: Pod
metadata:
labels:
type: app
app: recommandations
spec:
containers:
- name: recommandations
image: recommandations:latest
envFrom:
- configMapRef:
name: postgres-config
অ্যাপ্লিকেশনটি পাইথন এবং বেশ দ্রুত শুরু হয়. এটি PostgreSQL ডাটাবেসের সাথে সংযোগ করার চেষ্টা করে. দুর্ভাগ্যবশত, ডাটাবেসটি প্রাথমিককরণ শেষ করেনি, তাই সংযোগটি ব্যর্থ হয়, এবং Kubernetes পডটি পুনরায় চালু করে।
আমরা এটি একটি সঙ্গে সমাধান করতে পারেনinitContainer
একটি অপেক্ষা কনটেইনার:
apiVersion: v1
kind: Pod
metadata:
labels:
type: app
app: recommandations
spec:
initContainers:
- name: wait-for-postgres
image: atkrad/wait4x:3.1
command:
- wait4x
- postgresql
- postgres://$(DATABASE_URL)?sslmode=disable
envFrom:
- configMapRef:
name: postgres-config
containers:
- name: recommandations
image: recommandations:latest
envFrom:
- configMapRef:
name: postgres-config
উপরে উল্লেখিত পরিস্থিতিতে,initContainer
ডাটাবেস সংযোগগুলি গ্রহণ না হওয়া পর্যন্ত এটি থেমে থাকে না।recommandations
কনটেইনার শুরু করতে পারে. Kubernetes শেষ করতে হবে নাPod
পূর্ববর্তী সেটিংয়ের মতো! এটি কম লগ এবং সম্ভবত কম সতর্কতা অন্তর্ভুক্ত করে।
যখন অপেক্ষা বাধ্যতামূলক হয়ে যায়
উপরের একটি সামান্য উন্নতি, কিন্তু আপনি এটি ছাড়া করতে পারেন. অন্যান্য ক্ষেত্রে, অপেক্ষা বাধ্যতামূলক হয়ে যায়. আমি সম্প্রতি উপরে উল্লেখিত কর্মশালা জন্য প্রস্তুতি করার সময় এটি অভিজ্ঞ।
- পাইপলাইন Kubernetes পাশে একটি ম্যানিফেস্ট প্রয়োগ
- পরবর্তী ধাপে, এটি পরীক্ষা চালান
- অ্যাপ্লিকেশনটি পড়ার আগে পরীক্ষা শুরু হলে এটি ব্যর্থ হয়।
আমরা পরীক্ষা করার আগে ব্যাক এন্ড প্রস্তুত পর্যন্ত অপেক্ষা করতে হবে।wait4x
অপেক্ষা করার জন্যPod
আমরা পরীক্ষা চালু করার আগে অনুরোধগুলি গ্রহণ করতে:
- name: Wait until the application has started
uses: addnab/docker-run-action@v3 #1
with:
image: atkrad/wait4x:latest
run: wait4x http ${{ env.BASE_URL }}/health --expect-status-code 200 #2
- GitHub অ্যাকশন একটি কনটেইনার চালানোর অনুমতি দেয়. আমি পরিবর্তে গু বাইনারি ডাউনলোড করতে পারতাম।
- অপেক্ষা করুন /health এন্ডপুট একটি 200 প্রতিক্রিয়া কোড ফেরত।
উপসংহার
Kubernetes স্টার্টআপ স্যান্ডারগুলি অপরিহার্য পুনরায় চালু হওয়ার জন্য একটি চমৎকার উপায় যখন আপনি সেবাগুলি চালু করেন যা একে অপরের উপর নির্ভর করে।initContainer
wait4x
এটি একটি সরঞ্জাম যা অন্যান্য পরিস্থিতিতে ব্যবহার করা যেতে পারে. এটি এখন আমার টুলবোর্ডের অংশ।
To go further:
- অপেক্ষা4x
- তাই কি আপনাকে কিছু Kubernetes সম্পদ অপেক্ষা করতে হবে?
প্রাথমিকভাবে প্রকাশিত A Java Geek এ 20 এপ্রিল, 2025
জাভা Geek