[{"data":1,"prerenderedAt":1250},["ShallowReactive",2],{"i-lucide:chevron-down":3,"i-lucide:search":8,"i-lucide:sun":10,"i-lucide:moon":12,"i-lucide:arrow-right":14,"i-lucide:menu":16,"i-lucide:mail":18,"i-simple-icons:x":20,"i-simple-icons:linkedin":22,"i-simple-icons:dribbble":25,"i-simple-icons:github":27,"i-lucide:arrow-up-right":29,"blog-\u002Fblog\u002Fbn\u002Fkubernetes-rolling-update-rollback":31,"blog-related-\u002Fblog\u002Fbn\u002Fkubernetes-rolling-update-rollback":431,"i-lucide:chevron-right":1220,"i-lucide:calendar":1222,"i-lucide:clock":1224,"i-lucide:link":1226,"i-lucide:server":1228,"i-lucide:trending-up":1230,"i-lucide:info":1232,"i-lucide:circle-slash":1234,"i-lucide:columns-2":1236,"i-lucide:minus":1238,"i-lucide:plus":1240,"i-lucide:copy":1242,"i-lucide:triangle-alert":1244,"i-lucide:circle-check":1246,"i-lucide:circle-help":1248},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cpath fill=\"currentColor\" d=\"M14.234 10.162L22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299l-.929-1.329L3.076 1.56h3.182l5.965 8.532l.929 1.329l7.754 11.09h-3.182z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":23,"hidden":24},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",true,{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":26},"\u003Cpath fill=\"currentColor\" d=\"M12 24C5.385 24 0 18.615 0 12S5.385 0 12 0s12 5.385 12 12s-5.385 12-12 12m10.12-10.358c-.35-.11-3.17-.953-6.384-.438c1.34 3.684 1.887 6.684 1.992 7.308a10.28 10.28 0 0 0 4.395-6.87zm-6.115 7.808c-.153-.9-.75-4.032-2.19-7.77l-.066.02c-5.79 2.015-7.86 6.025-8.04 6.4a10.16 10.16 0 0 0 6.29 2.166c1.42 0 2.77-.29 4-.814zm-11.62-2.58c.232-.4 3.045-5.055 8.332-6.765q.202-.067.405-.12q-.392-.879-.832-1.74C7.17 11.775 2.206 11.71 1.756 11.7l-.004.312c0 2.633.998 5.037 2.634 6.855zm-2.42-8.955c.46.008 4.683.026 9.477-1.248a66 66 0 0 0-3.8-5.928a10.28 10.28 0 0 0-5.676 7.17zM9.6 2.052c.282.38 2.145 2.914 3.822 6c3.645-1.365 5.19-3.44 5.373-3.702A10.2 10.2 0 0 0 12 1.764c-.825 0-1.63.1-2.4.285zm10.335 3.483c-.218.29-1.935 2.493-5.724 4.04c.24.49.47.985.68 1.486c.08.18.15.36.22.53c3.41-.43 6.8.26 7.14.33c-.02-2.42-.88-4.64-2.31-6.38z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":28},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":30},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"id":32,"title":33,"author":34,"body":37,"category":415,"cover":416,"coverAlt":416,"date":417,"description":418,"draft":6,"extension":419,"featured":6,"lang":420,"meta":421,"navigation":24,"path":422,"readingTime":423,"seo":424,"seoTitle":425,"stem":426,"tags":427,"__hash__":430},"blog\u002Fblog\u002Fbn\u002Fkubernetes-rolling-update-rollback.md","Deployment আপডেট করলে সাইট ডাউন হয় না কেন — Rolling Update ভেতরে ভেতরে কী করে",{"name":35,"role":36},"রাফি হাসান","DevOps ইঞ্জিনিয়ার",{"type":38,"value":39,"toc":408},"minimark",[40,52,55,60,75,87,91,96,105,120,273,292,307,311,332,342,351,355,368,379,390,394,401,404],[41,42,43,47,48,51],"p",{},[44,45,46],"code",{},"kubectl set image deployment\u002Fapi api=myapp:v2"," — একটা কমান্ড, আর কয়েক সেকেন্ড পর ",[44,49,50],{},"kubectl get pods"," চালালে দেখা যায় পুরনো Pod-গুলো একে একে হারিয়ে যাচ্ছে, নতুনগুলো জায়গা নিচ্ছে। এই পুরো সময়টায় সাইটে একটাও রিকোয়েস্ট ফেইল হয় না — অথচ কোনো মেইনটেন্যান্স পেজ দেখানো হয়নি, কাউকে জানানোও হয়নি।",[41,53,54],{},"এটা কীভাবে হয়, সেটা বুঝলে দুটো জিনিস পরিষ্কার হয়ে যায়: ডিপ্লয়মেন্ট স্লো কেন হচ্ছে সেটা ডিবাগ করা, আর কিছু ভুল হলে কীভাবে এক কমান্ডে ফিরিয়ে আনা যায়।",[56,57,59],"h2",{"id":58},"ডিফল্ট-স্ট্র্যাটেজি-rollingupdate","ডিফল্ট স্ট্র্যাটেজি: RollingUpdate",[41,61,62,63,66,67,70,71,74],{},"একটা Kubernetes ",[44,64,65],{},"Deployment","-এর ",[44,68,69],{},".spec.strategy.type"," ডিফল্টভাবে ",[44,72,73],{},"RollingUpdate"," — মানে নতুন ভার্সন এক ধাক্কায় পুরনোটাকে replace করে না। বরং ধাপে ধাপে: কিছু নতুন Pod তৈরি হয়, তারা readiness probe পাস করে ট্রাফিক নেওয়ার জন্য প্রস্তুত হয়, তারপরই সমপরিমাণ পুরনো Pod সরিয়ে দেওয়া হয়। পুরো ট্রানজিশন জুড়ে সবসময় যথেষ্ট সংখ্যক Pod ট্রাফিক পাওয়ার জন্য রেডি থাকে।",[76,77,78],"note",{},[41,79,80,81,86],{},"এই পুরো প্রক্রিয়াটা সরাসরি নির্ভর করে আগের একটা জিনিসের ওপর — ",[82,83,85],"a",{"href":84},"\u002Fblog\u002Fbn\u002Fkubernetes-liveness-readiness-probe","readiness probe ঠিকমতো সেট করা থাকা","। readiness probe না থাকলে বা ভুল থাকলে, Kubernetes ধরে নেয় নতুন Pod সাথে সাথেই \"রেডি\" — তখন rolling update আসলে আর নিরাপদ থাকে না, কারণ যে Pod-টা এখনো স্টার্টআপ শেষ করেনি তার কাছেও ট্রাফিক চলে যেতে পারে।",[56,88,90],{"id":89},"দুটো-সংখ্যা-যা-পুরো-আচরণ-নিয়ন্ত্রণ-করে","দুটো সংখ্যা যা পুরো আচরণ নিয়ন্ত্রণ করে",[41,92,93,95],{},[44,94,73],{}," স্ট্র্যাটেজির ভেতরে দুটো প্যারামিটার থাকে, দুটোই পার্সেন্টেজ বা সংখ্যা হিসেবে দেওয়া যায়:",[41,97,98,104],{},[99,100,101],"strong",{},[44,102,103],{},"maxSurge"," — কাঙ্ক্ষিত রেপ্লিকা সংখ্যার চেয়ে বেশি কতগুলো Pod সাময়িকভাবে তৈরি করা যাবে। এটা বেশি রাখলে ডিপ্লয়মেন্ট দ্রুত হয় (একসাথে বেশি নতুন Pod ওঠে), কিন্তু ওই মুহূর্তে ক্লাস্টারে বাড়তি CPU\u002Fমেমরি লাগে।",[41,106,107,112,113,116,117,119],{},[99,108,109],{},[44,110,111],{},"maxUnavailable"," — কাঙ্ক্ষিত সংখ্যার চেয়ে কতগুলো Pod সাময়িকভাবে কম থাকতে পারবে (অর্থাৎ, ট্রাফিক নেওয়ার জন্য অনুপলব্ধ থাকতে পারবে)। এটা ",[44,114,115],{},"0"," রাখলে ডিপ্লয়মেন্টের সময় ক্যাপাসিটি কখনো কমবে না — কিন্তু তার মানে ",[44,118,103],{}," অন্তত ১ না রাখলে নতুন Pod ওঠারই জায়গা থাকবে না।",[121,122,127,214],"compare",{"after":123,"before":124,"note":125,"split":126},"জিরো-ডাউনটাইম কনফিগ","ডিফল্ট (25%\u002F25%)","ডান পাশের কনফিগারেশনে ক্যাপাসিটি কখনো কমে না, শুধু সাময়িকভাবে বাড়ে — ছোট ট্রাফিক স্পাইকের সময় ডিপ্লয় করলেও এটা নিরাপদ।","একই Deployment",[128,129,131],"template",{"v-slot:before":130},"",[132,133,137],"pre",{"className":134,"code":135,"language":136,"meta":130,"style":130},"language-yaml shiki shiki-themes github-dark-dimmed github-dark-dimmed","spec:\n  replicas: 4\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 25%\n      maxUnavailable: 25%\n","yaml",[44,138,139,152,165,173,185,193,204],{"__ignoreMap":130},[140,141,144,148],"span",{"class":142,"line":143},"line",1,[140,145,147],{"class":146},"sza-u","spec",[140,149,151],{"class":150},"sM9_K",":\n",[140,153,155,158,161],{"class":142,"line":154},2,[140,156,157],{"class":146},"  replicas",[140,159,160],{"class":150},": ",[140,162,164],{"class":163},"sQdni","4\n",[140,166,168,171],{"class":142,"line":167},3,[140,169,170],{"class":146},"  strategy",[140,172,151],{"class":150},[140,174,176,179,181],{"class":142,"line":175},4,[140,177,178],{"class":146},"    type",[140,180,160],{"class":150},[140,182,184],{"class":183},"szYpP","RollingUpdate\n",[140,186,188,191],{"class":142,"line":187},5,[140,189,190],{"class":146},"    rollingUpdate",[140,192,151],{"class":150},[140,194,196,199,201],{"class":142,"line":195},6,[140,197,198],{"class":146},"      maxSurge",[140,200,160],{"class":150},[140,202,203],{"class":183},"25%\n",[140,205,207,210,212],{"class":142,"line":206},7,[140,208,209],{"class":146},"      maxUnavailable",[140,211,160],{"class":150},[140,213,203],{"class":183},[128,215,216],{"v-slot:after":130},[132,217,219],{"className":134,"code":218,"language":136,"meta":130,"style":130},"spec:\n  replicas: 4\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n",[44,220,221,227,235,241,249,255,264],{"__ignoreMap":130},[140,222,223,225],{"class":142,"line":143},[140,224,147],{"class":146},[140,226,151],{"class":150},[140,228,229,231,233],{"class":142,"line":154},[140,230,157],{"class":146},[140,232,160],{"class":150},[140,234,164],{"class":163},[140,236,237,239],{"class":142,"line":167},[140,238,170],{"class":146},[140,240,151],{"class":150},[140,242,243,245,247],{"class":142,"line":175},[140,244,178],{"class":146},[140,246,160],{"class":150},[140,248,184],{"class":183},[140,250,251,253],{"class":142,"line":187},[140,252,190],{"class":146},[140,254,151],{"class":150},[140,256,257,259,261],{"class":142,"line":195},[140,258,198],{"class":146},[140,260,160],{"class":150},[140,262,263],{"class":163},"1\n",[140,265,266,268,270],{"class":142,"line":206},[140,267,209],{"class":146},[140,269,160],{"class":150},[140,271,272],{"class":163},"0\n",[41,274,275,276,279,280,283,284,287,288,291],{},"৪টা রেপ্লিকা আর ডিফল্ট ",[44,277,278],{},"25%\u002F25%"," কনফিগারেশন দিয়ে হিসাব করলে: ",[44,281,282],{},"maxUnavailable: 25%"," মানে একসাথে ১টা Pod সাময়িকভাবে কমে যেতে পারে (৪ থেকে ৩-এ), অর্থাৎ ক্যাপাসিটি সাময়িকভাবে কমে। ডান পাশের কনফিগারেশনে ",[44,285,286],{},"maxUnavailable: 0"," দেওয়ায় সেটা কখনো হয় না — সবসময় কমপক্ষে ৪টা Pod রেডি থাকে, মাঝেমধ্যে ৫টা পর্যন্ত (৪ + ",[44,289,290],{},"maxSurge: 1",")।",[293,294,295],"warning",{},[41,296,297,299,300,303,304,306],{},[44,298,286],{}," আর ",[44,301,302],{},"replicas: 1"," একসাথে থাকলে rolling update কখনো এগোতে পারবে না যদি ",[44,305,103],{}," না বাড়ানো হয় — কারণ একটা মাত্র Pod-কে \"unavailable\" না করে replace করার কোনো উপায় নেই, নতুন জায়গা তৈরি না করলে। ছোট সার্ভিসে এই কম্বিনেশন একটা Deployment স্টাক হয়ে থাকার সাধারণ কারণ।",[56,308,310],{"id":309},"rollout-স্টাক-থাকলে-কী-দেখবেন","rollout স্টাক থাকলে কী দেখবেন",[41,312,313,316,317,319,320,323,324,327,328,331],{},[44,314,315],{},"kubectl rollout status deployment\u002Fapi"," কমান্ড আটকে থাকলে, প্রথম সন্দেহ করার জায়গা: নতুন Pod-গুলো readiness probe পাস করছে কি না। ",[44,318,50],{}," চালিয়ে ",[44,321,322],{},"READY"," কলামে ",[44,325,326],{},"0\u002F1"," দেখলে বোঝা যায় Pod উঠেছে কিন্তু readiness ফেইল করছে — এটাই ",[82,329,330],{"href":84},"আগের লেখার বিষয়"," (liveness বনাম readiness)।",[41,333,334,335,337,338,341],{},"আরেকটা সাধারণ কারণ: রিসোর্স কোটা বা নোডে জায়গা না থাকা। ",[44,336,103],{}," বাড়তি Pod তৈরির অনুমতি দেয়, কিন্তু ক্লাস্টারে সেই Pod বসানোর মতো CPU\u002Fমেমরি না থাকলে সেটা ",[44,339,340],{},"Pending"," অবস্থাতেই আটকে থাকবে, আর rollout এগোবে না।",[343,344,345],"tip",{},[41,346,347,350],{},[44,348,349],{},"kubectl rollout status deployment\u002Fapi --timeout=60s"," দিয়ে rollout দেখা ভালো অভ্যাস — timeout ছাড়া কমান্ডটা আটকে গেলে টার্মিনালে বসে অপেক্ষা করা ছাড়া উপায় থাকে না। CI\u002FCD পাইপলাইনে এই timeout না রাখলে একটা স্টাক rollout পুরো পাইপলাইনকে ঘণ্টার পর ঘণ্টা ব্লক করে রাখতে পারে।",[56,352,354],{"id":353},"কিছু-ভুল-হলে-rollback","কিছু ভুল হলে — Rollback",[41,356,357,358,361,362,364,365,367],{},"নতুন ভার্সন ডিপ্লয় করার পর যদি বোঝা যায় কিছু ভুল আছে, ",[44,359,360],{},"kubectl rollout undo deployment\u002Fapi"," চালালে Kubernetes ঠিক এই একই rolling update মেকানিজম ব্যবহার করে — শুধু উল্টো দিকে। আগের ভার্সনের Pod ধীরে ধীরে ফিরিয়ে আনা হয়, নতুনটা সরানো হয়, একই ",[44,363,103],{},"\u002F",[44,366,111],{}," নিয়ম মেনেই।",[41,369,370,371,374,375,378],{},"এটা কাজ করে কারণ Deployment প্রতিটা আপডেটের একটা রিভিশন হিস্টোরি রাখে (",[44,372,373],{},"kubectl rollout history deployment\u002Fapi",")। নির্দিষ্ট কোনো রিভিশনে ফিরতে চাইলে: ",[44,376,377],{},"kubectl rollout undo deployment\u002Fapi --to-revision=3","।",[380,381],"quiz",{":answer":382,":options":383,"checkLabel":384,"correctLabel":385,"explanation":386,"incorrectLabel":387,"question":388,"resetLabel":389},"2","[\"৩টা\",\"৪টা\",\"৫টা\",\"৮টা\"]","উত্তর মিলিয়ে দেখি","ঠিক আছে","maxUnavailable: 0 মানে কখনো ৪টার নিচে নামবে না। maxSurge: 1 মানে কাঙ্ক্ষিত সংখ্যার (৪) চেয়ে বেশি ১টা পর্যন্ত বাড়তি Pod থাকতে পারে। তাই সর্বোচ্চ সংখ্যা ৪ + ১ = ৫টা — নতুন একটা Pod রেডি হওয়ার পরই পুরনো একটা সরানো হবে, কখনো একসাথে দুই দিক থেকে সংখ্যা বদলাবে না।","হয়নি","একটা Deployment-এর replicas: 4, maxSurge: 1, maxUnavailable: 0। rolling update চলাকালীন এক মুহূর্তে সর্বোচ্চ কতগুলো Pod একসাথে থাকতে পারে?","আবার চেষ্টা করি",[56,391,393],{"id":392},"ডিপ্লয়মেন্টের-আগে-পরে-যা-চেক-করবেন","ডিপ্লয়মেন্টের আগে-পরে যা চেক করবেন",[395,396],"checklist",{":items":397,"doneLabel":398,"resetLabel":399,"title":400},"[{\"label\":\"readinessProbe সঠিকভাবে সেট করা আছে কি না নিশ্চিত করুন\",\"detail\":\"এটা ছাড়া rolling update-এর পুরো নিরাপত্তা ধারণাটাই ভেঙে পড়ে।\"},{\"label\":\"maxUnavailable: 0 দরকার কি না ভাবুন\",\"detail\":\"ক্রিটিক্যাল সার্ভিসে ক্যাপাসিটি কখনো না কমানোই নিরাপদ, তবে replicas কম হলে maxSurge বাড়াতে ভুলবেন না।\"},{\"label\":\"kubectl rollout status --timeout সহ ব্যবহার করুন, বিশেষত CI\u002FCD-তে\",\"detail\":\"টাইমআউট ছাড়া একটা স্টাক rollout পাইপলাইনকে অনির্দিষ্টকাল আটকে রাখতে পারে।\"},{\"label\":\"রোলআউটের সময় kubectl get pods -w দিয়ে চোখে চোখে রাখুন\",\"detail\":\"কোনো Pod বারবার রিস্টার্ট বা Pending-এ আটকে থাকলে সাথে সাথেই বোঝা যাবে।\"},{\"label\":\"সমস্যা দেখলে দ্রুত rollout undo চালাতে দ্বিধা করবেন না\",\"detail\":\"rollback নিজেও একটা rolling update — এটাও ধাপে ধাপে হয়, তাই এটাও নিরাপদ।\"}]","শেষ","রিসেট","Rolling update নিরাপদ কি না, যাচাইয়ের তালিকা",[41,402,403],{},"Rolling update জাদু না — এটা দুটো সংখ্যার হিসাব, আর সেই হিসাবটা কাজ করার জন্য readiness probe-এর ওপর সম্পূর্ণ নির্ভরশীল। এই তিনটা জিনিস একসাথে বুঝলে — probe, maxSurge\u002FmaxUnavailable, আর rollback — একটা প্রোডাকশন Deployment দেখলে আর অন্ধকারে ঢিল ছোড়ার মতো লাগবে না।",[405,406,407],"style",{},"html pre.shiki code .sza-u, html code.shiki .sza-u{--shiki-default:#8DDB8C;--shiki-dark:#8DDB8C}html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .sQdni, html code.shiki .sQdni{--shiki-default:#6CB6FF;--shiki-dark:#6CB6FF}html pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":130,"searchDepth":167,"depth":167,"links":409},[410,411,412,413,414],{"id":58,"depth":154,"text":59},{"id":89,"depth":154,"text":90},{"id":309,"depth":154,"text":310},{"id":353,"depth":154,"text":354},{"id":392,"depth":154,"text":393},"devops",null,"2026-09-08","kubectl apply চালানোর পর সাইট একবারও ডাউন হয় না, অথচ পুরনো কোড সরে গিয়ে নতুন কোড চলে আসে। জাদু না — maxSurge আর maxUnavailable নামের দুটো সংখ্যা এটা সম্ভব করে।","md","bn",{},"\u002Fblog\u002Fbn\u002Fkubernetes-rolling-update-rollback",8,{"title":33,"description":418},"Deployment আপডেটে সাইট ডাউন হয় না কেন","blog\u002Fbn\u002Fkubernetes-rolling-update-rollback",[428,429,65],"Kubernetes","DevOps","TRBMuqOPVkPQeCVhP_N5GdXNCjs2ro8BO4oLubgOGeY",[432,740,1074],{"id":433,"title":434,"author":435,"body":436,"category":415,"cover":416,"coverAlt":416,"date":731,"description":732,"draft":6,"extension":419,"featured":6,"lang":420,"meta":733,"navigation":24,"path":734,"readingTime":206,"seo":735,"seoTitle":416,"stem":736,"tags":737,"__hash__":739},"blog\u002Fblog\u002Fbn\u002Fconfigmap-vs-secret.md","ConfigMap বনাম Secret — কোনটায় কী রাখবেন",{"name":35,"role":36},{"type":38,"value":437,"toc":725},[438,441,444,448,451,458,478,482,485,525,673,680,687,691,697,700,705,711,715,719,722],[41,439,440],{},"নতুন কেউ Kubernetes শিখতে গিয়ে প্রথমেই যে ভুল ধারণাটা করে বসে: \"Secret মানে এনক্রিপ্টেড, ConfigMap মানে সাধারণ টেক্সট।\" নামটাই তো \"Secret\" — তাই মনে হয় এটা নিরাপদ একটা ভল্টের মতো কিছু।",[41,442,443],{},"আসল ঘটনাটা একটু অন্যরকম, আর এটা না জানলে প্রোডাকশনে DB পাসওয়ার্ড, API key — সবকিছু কার্যত সবার সামনে খোলা রাখার মতো ভুল করে ফেলা সহজ।",[56,445,447],{"id":446},"দুটোই-আসলে-key-value-স্টোরেজ","দুটোই আসলে key-value স্টোরেজ",[41,449,450],{},"ConfigMap আর Secret — দুটো অবজেক্টেরই কাজ একই: কিছু key-value ডেটা কন্টেইনারে পাঠানো, environment variable হিসেবে অথবা ফাইল হিসেবে মাউন্ট করে। কোড থেকে কনফিগারেশনকে আলাদা রাখাই এদের উদ্দেশ্য — যাতে একই Docker image dev, staging, প্রোডাকশনে আলাদা আলাদা ভ্যালু নিয়ে চলতে পারে।",[41,452,453,454,457],{},"পার্থক্যটা তৈরি হওয়ার কথা ছিল ",[99,455,456],{},"কী ধরনের ডেটা"," এখানে যাবে তার ভিত্তিতে — কনফিডেনশিয়াল বনাম নন-কনফিডেনশিয়াল। Kubernetes নিজে থেকে এই সীমারেখা জোর করে না, এটা সম্পূর্ণ আপনার সিদ্ধান্ত।",[76,459,460],{},[41,461,462,465,466,469,470,473,474,477],{},[44,463,464],{},"kubectl get secret my-secret -o yaml"," চালিয়ে দেখুন — ভ্যালুগুলো ",[44,467,468],{},"dGVzdDEyMw=="," এই রকম দেখাবে। এটা এনক্রিপশন না, এটা ",[99,471,472],{},"base64 encoding","। ",[44,475,476],{},"echo dGVzdDEyMw== | base64 -d"," চালালে সাথে সাথে আসল ভ্যালুটা ফেরত পাবেন। base64 একটা এনকোডিং ফরম্যাট, সুরক্ষার স্তর না।",[56,479,481],{"id":480},"তাহলে-secret-কী-সুরক্ষা-দেয়","তাহলে Secret কী সুরক্ষা দেয়?",[41,483,484],{},"কিছু দেয়, কিন্তু যতটা মানুষ ভাবে তার চেয়ে কম:",[486,487,488,511,518],"ul",{},[489,490,491,494,495,498,499,502,503,506,507,510],"li",{},[44,492,493],{},"kubectl get configmap"," বা ",[44,496,497],{},"kubectl describe configmap"," চালালে ভ্যালু সরাসরি স্ক্রিনে দেখা যায়। Secret-এর ক্ষেত্রে ",[44,500,501],{},"kubectl describe secret"," ভ্যালু লুকিয়ে রাখে (",[44,504,505],{},"\u003Credacted>","), যদিও ",[44,508,509],{},"kubectl get secret -o yaml"," দিয়ে ঠিকই বের করা যায় base64 decode করে।",[489,512,513,514,517],{},"Secret অবজেক্টগুলো etcd-তে (Kubernetes-এর ডেটাবেসে) সাধারণত plaintext আকারেই সংরক্ষিত হয়, যদি না ক্লাস্টারে আলাদাভাবে ",[99,515,516],{},"encryption at rest"," চালু করা থাকে।",[489,519,520,521,524],{},"RBAC (Role-Based Access Control) দিয়ে ",[44,522,523],{},"secrets"," রিসোর্সের জন্য আলাদা পারমিশন সেট করা যায় — অর্থাৎ, \"কে Secret পড়তে পারবে\" এটা ConfigMap থেকে আলাদা করে নিয়ন্ত্রণ করা সম্ভব। এটাই আসল ব্যবহারিক সুবিধা।",[121,526,531,602],{"after":527,"before":528,"note":529,"split":530},"Secret + RBAC + encryption at rest","ConfigMap-এ পাসওয়ার্ড","বাম পাশের কনফিগারেশনে DB পাসওয়ার্ড 'read' পারমিশন থাকা যেকোনো ইউজার\u002Fসার্ভিস এক কমান্ডে প্লেইন টেক্সটে দেখতে পারবে।","একই ক্লাস্টার",[128,532,533],{"v-slot:before":130},[132,534,536],{"className":134,"code":535,"language":136,"meta":130,"style":130},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: db-config\ndata:\n  DB_HOST: 'db.internal'\n  DB_PASSWORD: 'p@ssw0rd123'\n",[44,537,538,548,558,565,575,582,592],{"__ignoreMap":130},[140,539,540,543,545],{"class":142,"line":143},[140,541,542],{"class":146},"apiVersion",[140,544,160],{"class":150},[140,546,547],{"class":183},"v1\n",[140,549,550,553,555],{"class":142,"line":154},[140,551,552],{"class":146},"kind",[140,554,160],{"class":150},[140,556,557],{"class":183},"ConfigMap\n",[140,559,560,563],{"class":142,"line":167},[140,561,562],{"class":146},"metadata",[140,564,151],{"class":150},[140,566,567,570,572],{"class":142,"line":175},[140,568,569],{"class":146},"  name",[140,571,160],{"class":150},[140,573,574],{"class":183},"db-config\n",[140,576,577,580],{"class":142,"line":187},[140,578,579],{"class":146},"data",[140,581,151],{"class":150},[140,583,584,587,589],{"class":142,"line":195},[140,585,586],{"class":146},"  DB_HOST",[140,588,160],{"class":150},[140,590,591],{"class":183},"'db.internal'\n",[140,593,594,597,599],{"class":142,"line":206},[140,595,596],{"class":146},"  DB_PASSWORD",[140,598,160],{"class":150},[140,600,601],{"class":183},"'p@ssw0rd123'\n",[128,603,604],{"v-slot:after":130},[132,605,607],{"className":134,"code":606,"language":136,"meta":130,"style":130},"apiVersion: v1\nkind: Secret\nmetadata:\n  name: db-config\ntype: Opaque\nstringData:\n  DB_HOST: 'db.internal'\n  DB_PASSWORD: 'p@ssw0rd123'\n",[44,608,609,617,626,632,640,650,657,665],{"__ignoreMap":130},[140,610,611,613,615],{"class":142,"line":143},[140,612,542],{"class":146},[140,614,160],{"class":150},[140,616,547],{"class":183},[140,618,619,621,623],{"class":142,"line":154},[140,620,552],{"class":146},[140,622,160],{"class":150},[140,624,625],{"class":183},"Secret\n",[140,627,628,630],{"class":142,"line":167},[140,629,562],{"class":146},[140,631,151],{"class":150},[140,633,634,636,638],{"class":142,"line":175},[140,635,569],{"class":146},[140,637,160],{"class":150},[140,639,574],{"class":183},[140,641,642,645,647],{"class":142,"line":187},[140,643,644],{"class":146},"type",[140,646,160],{"class":150},[140,648,649],{"class":183},"Opaque\n",[140,651,652,655],{"class":142,"line":195},[140,653,654],{"class":146},"stringData",[140,656,151],{"class":150},[140,658,659,661,663],{"class":142,"line":206},[140,660,586],{"class":146},[140,662,160],{"class":150},[140,664,591],{"class":183},[140,666,667,669,671],{"class":142,"line":423},[140,668,596],{"class":146},[140,670,160],{"class":150},[140,672,601],{"class":183},[41,674,675,676,679],{},"উপরের দুটো YAML প্রায় একই রকম দেখতে, আর ",[44,677,678],{},"kubectl apply"," করলে দুটোই একইভাবে কাজ করবে অ্যাপের দৃষ্টিকোণ থেকে। পার্থক্যটা তৈরি হয় ক্লাস্টার-লেভেল কনফিগারেশনে — RBAC পলিসি, encryption at rest, আর অডিট লগিং কোন রিসোর্স টাইপের জন্য কতটা কড়া, তার ওপর।",[293,681,682],{},[41,683,684,686],{},[44,685,654],{}," ব্যবহার করলে YAML-এ প্লেইন টেক্সটে লেখা যায় (Kubernetes নিজে base64 এনকোড করে নেয়), যেটা সুবিধাজনক — কিন্তু এই ফাইলটা যদি Git রিপোজিটরিতে কমিট হয়ে যায়, পুরো ইতিহাসেই পাসওয়ার্ডটা থেকে যাবে। প্রোডাকশন Secret কখনো plain YAML হিসেবে Git-এ রাখবেন না — এর জন্যই Sealed Secrets, External Secrets Operator, বা HashiCorp Vault-এর মতো টুল আছে।",[56,688,690],{"id":689},"কবে-কোনটা-বাছবেন","কবে কোনটা বাছবেন",[41,692,693,694],{},"সহজ নিয়ম: ",[99,695,696],{},"যা প্রকাশ পেলে ক্ষতি হবে, সেটা Secret-এ। যা প্রকাশ পেলে কিছু হবে না, সেটা ConfigMap-এ।",[41,698,699],{},"DB পাসওয়ার্ড, API key, TLS সার্টিফিকেটের প্রাইভেট কী, third-party টোকেন — Secret। ফিচার ফ্ল্যাগ, লগ লেভেল, API-র বেস URL, রিট্রাই কাউন্ট — ConfigMap। কোনো একটা ভ্যালু নিয়ে দ্বিধায় থাকলে, ধরে নিন সেটা Secret — পরে ConfigMap-এ সরানো সহজ, উল্টোটা করতে গেলে অনেক আগেই এক্সপোজ হয়ে গিয়ে থাকবে।",[343,701,702],{},[41,703,704],{},"Secret ব্যবহার করলেও পুরো নিরাপত্তা নিশ্চিত হয় না — সেটা শুধু প্রথম ধাপ। আসল প্রোডাকশন সেটআপে সাধারণত তিনটা জিনিস একসাথে থাকে: etcd encryption at rest চালু, RBAC দিয়ে কড়াকড়ি (কোন Pod\u002FServiceAccount কোন Secret পড়তে পারবে), আর Secret-গুলো Git-এ না রেখে বাইরের কোনো secret manager থেকে সিঙ্ক করা।",[380,706],{":answer":707,":explanation":708,":options":709,"question":710},"1","{\"Secret অবজেক্ট base64 এনকোডিং করে রাখে, যেটা এনক্রিপশন নয় — যে কেউ ডিকোড করে ফেলতে পারে। Kubernetes নিজে থেকে \\\"Secret\\\" নামের কারণে বাড়তি কোনো এনক্রিপশন যোগ করে না। আসল সুরক্ষা আসে ক্লাস্টার-লেভেল কনফিগারেশন থেকে\":\"etcd-তে encryption at rest চালু আছে কি না, RBAC দিয়ে কে পড়তে পারবে তা সীমিত করা আছে কি না, আর Secret-গুলো কীভাবে তৈরি\u002Fসিঙ্ক করা হচ্ছে (প্লেইন YAML Git-এ কমিট করা বনাম একটা secret manager থেকে আনা)।\",\"checkLabel\":\"উত্তর মিলিয়ে দেখি\",\"resetLabel\":\"আবার চেষ্টা করি\",\"correctLabel\":\"ঠিক আছে\",\"incorrectLabel\":\"হয়নি\"}","[\"হ্যাঁ, Secret সবসময় এনক্রিপ্টেড থাকে\",\"না, Secret শুধু base64-এনকোডেড — আসল নিরাপত্তা নির্ভর করে RBAC আর encryption at rest ঠিকমতো সেটআপ করা আছে কি না তার ওপর\",\"হ্যাঁ, কিন্তু শুধু Secret-টা namespace-এর বাইরে থাকলে\",\"না, Secret আসলে ConfigMap-এর চেয়ে কম নিরাপদ\"]","একজন ডেভেলপার একটা Kubernetes Secret বানিয়েছেন যাতে API key আছে। এতে কি key-টা নিরাপদ হয়ে গেছে?",[56,712,714],{"id":713},"চেকলিস্ট-নতুন-করে-সেটআপ-করার-আগে","চেকলিস্ট — নতুন করে সেটআপ করার আগে",[395,716],{":items":717,"doneLabel":398,"resetLabel":399,"title":718},"[{\"label\":\"কোনো Secret-এর ভ্যালু ভুল করে ConfigMap-এ চলে যায়নি তো, চেক করুন\",\"detail\":\"grep দিয়ে PASSWORD, TOKEN, KEY, SECRET শব্দগুলো ConfigMap ফাইলগুলোতে খুঁজে দেখুন।\"},{\"label\":\"Git হিস্টোরিতে কোনো Secret YAML কমিট হয়ে আছে কি না দেখুন\",\"detail\":\"একবার কমিট হয়ে গেলে সেই ভ্যালুটা রোটেট (পরিবর্তন) না করলে, শুধু ফাইল ডিলিট করলে সমাধান হয় না।\"},{\"label\":\"etcd-তে encryption at rest চালু আছে কি না নিশ্চিত করুন\",\"detail\":\"ম্যানেজড ক্লাস্টারে (EKS, GKE, AKS) এটা প্রায়ই একটা আলাদা সেটিং, ডিফল্টে চালু নাও থাকতে পারে।\"},{\"label\":\"কোন ServiceAccount\u002FPod কোন Secret পড়তে পারবে, RBAC দিয়ে সীমিত করুন\",\"detail\":\"প্রতিটা Pod-এর সব Secret দেখার দরকার নেই, শুধু যেগুলো তার নিজের।\"},{\"label\":\"Secret রোটেশনের একটা প্ল্যান আছে কি না ভাবুন\",\"detail\":\"কেউ টিম ছাড়লে বা একটা key লিক হলে, সেটা বদলাতে কতক্ষণ লাগবে — সেটাই আসল টেস্ট।\"}]","ConfigMap\u002FSecret সেটআপ রিভিউ করার আগে যা দেখবেন",[41,720,721],{},"Secret ব্যবহার করা মানে \"সমস্যা সমাধান হয়ে গেছে\" না — এটা শুধু সঠিক জায়গায় সঠিক প্রশ্নটা জিজ্ঞেস করার সুযোগ তৈরি করে দেয়: এই ডেটাটা কে দেখতে পারবে, আর কীভাবে সেটা নিশ্চিত করছি।",[405,723,724],{},"html pre.shiki code .sza-u, html code.shiki .sza-u{--shiki-default:#8DDB8C;--shiki-dark:#8DDB8C}html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":130,"searchDepth":167,"depth":167,"links":726},[727,728,729,730],{"id":446,"depth":154,"text":447},{"id":480,"depth":154,"text":481},{"id":689,"depth":154,"text":690},{"id":713,"depth":154,"text":714},"2026-09-07","দুটোরই কাজ প্রায় একই রকম দেখতে — key-value ডেটা কন্টেইনারে ইনজেক্ট করা। কিন্তু একটাতে DB পাসওয়ার্ড রাখলে সেটা টিমের সবাই plaintext-এ পড়ে ফেলতে পারবে, আরেকটাতেও আসলে পারবে — যদি না আপনি সেটা জানেন।",{},"\u002Fblog\u002Fbn\u002Fconfigmap-vs-secret",{"title":434,"description":732},"blog\u002Fbn\u002Fconfigmap-vs-secret",[428,429,738],"Security","1ahVPyYWUYLiXZSoAm5TaJG0XMAHuPkgl54GCxC2t4g",{"id":741,"title":742,"author":743,"body":744,"category":415,"cover":416,"coverAlt":416,"date":1066,"description":1067,"draft":6,"extension":419,"featured":6,"lang":420,"meta":1068,"navigation":24,"path":84,"readingTime":423,"seo":1069,"seoTitle":416,"stem":1070,"tags":1071,"__hash__":1073},"blog\u002Fblog\u002Fbn\u002Fkubernetes-liveness-readiness-probe.md","Pod রানিং দেখাচ্ছে, তবু ট্রাফিক পাচ্ছে না — কেন",{"name":35,"role":36},{"type":38,"value":745,"toc":1060},[746,764,772,776,779,785,791,794,803,807,986,1000,1008,1012,1019,1038,1043,1047,1051,1057],[41,747,748,750,751,323,754,757,758,323,761,763],{},[44,749,50],{}," চালালে সবকিছু ঠিক দেখায়। ",[44,752,753],{},"STATUS",[44,755,756],{},"Running",", ",[44,759,760],{},"RESTARTS",[44,762,115],{},"। কিন্তু ব্রাউজারে সাইট খুললে 502, আর লগে নতুন কোনো এরর নেই — কারণ অ্যাপটা তো ক্র্যাশই করেনি।",[41,765,766,767],{},"এই একটা লাইন বোঝা গেলে সমস্যাটা এক মিনিটে সমাধান হয়ে যায়: ",[99,768,769,771],{},[44,770,756],{}," মানে শুধু কন্টেইনারের প্রসেস চালু আছে। অ্যাপটা যে রিকোয়েস্ট নেওয়ার জন্য প্রস্তুত, সেটার কোনো গ্যারান্টি এতে নেই।",[56,773,775],{"id":774},"দুটো-আলাদা-প্রশ্ন","দুটো আলাদা প্রশ্ন",[41,777,778],{},"Kubernetes একটা Pod সম্পর্কে দুটো সম্পূর্ণ আলাদা প্রশ্ন জিজ্ঞেস করতে পারে, আর দুটোর উত্তর দুই জায়গায় ব্যবহার হয়।",[41,780,781,784],{},[99,782,783],{},"লাইভনেস (liveness):"," প্রসেসটা কি বেঁচে আছে, নাকি ডেডলক হয়ে গেছে? উত্তর \"না\" হলে kubelet কন্টেইনারটা রিস্টার্ট করে দেয়।",[41,786,787,790],{},[99,788,789],{},"রেডিনেস (readiness):"," প্রসেসটা কি এখন রিকোয়েস্ট নেওয়ার মতো অবস্থায় আছে? উত্তর \"না\" হলে Pod-টাকে Service-এর endpoint লিস্ট থেকে সরিয়ে দেওয়া হয় — কিন্তু রিস্টার্ট করা হয় না।",[41,792,793],{},"এই দ্বিতীয়টাই বেশিরভাগ ডিবাগিং সেশনে মিসিং থাকে। একটা অ্যাপ চালু হতে ১৫ সেকেন্ড লাগে — DB কানেকশন পুল বানায়, ক্যাশ ওয়ার্ম করে। সেই ১৫ সেকেন্ডে প্রসেসটা \"জীবিত\" ঠিকই, কিন্তু রিকোয়েস্ট নেওয়ার জন্য প্রস্তুত না। readiness probe না থাকলে Service সেই Pod-টাকেই ট্রাফিক পাঠাতে শুরু করে দেয়, আর ইউজার 502 পায়।",[76,795,796],{},[41,797,798,799,802],{},"মনে রাখার সহজ উপায়: ",[99,800,801],{},"লাইভনেস ফেইল করলে রিস্টার্ট, রেডিনেস ফেইল করলে ট্রাফিক থেকে বাদ।"," একটা প্রসেস মেরে ফেলার সিদ্ধান্ত, আরেকটা শুধু সাময়িকভাবে সরিয়ে রাখার সিদ্ধান্ত।",[56,804,806],{"id":805},"কনফিগে-পার্থক্য","কনফিগে পার্থক্য",[121,808,813,874],{"after":809,"before":810,"note":811,"split":812},"liveness + readiness","শুধু liveness","দ্বিতীয়টায় স্টার্টআপের সময় Pod ট্রাফিক পায় না, যতক্ষণ না \u002Fready নিজে থেকে বলছে সে প্রস্তুত।","দুটোই",[128,814,815],{"v-slot:before":130},[132,816,818],{"className":134,"code":817,"language":136,"meta":130,"style":130},"livenessProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 8080\n  initialDelaySeconds: 5\n  periodSeconds: 10\n",[44,819,820,827,834,844,854,864],{"__ignoreMap":130},[140,821,822,825],{"class":142,"line":143},[140,823,824],{"class":146},"livenessProbe",[140,826,151],{"class":150},[140,828,829,832],{"class":142,"line":154},[140,830,831],{"class":146},"  httpGet",[140,833,151],{"class":150},[140,835,836,839,841],{"class":142,"line":167},[140,837,838],{"class":146},"    path",[140,840,160],{"class":150},[140,842,843],{"class":183},"\u002Fhealth\n",[140,845,846,849,851],{"class":142,"line":175},[140,847,848],{"class":146},"    port",[140,850,160],{"class":150},[140,852,853],{"class":163},"8080\n",[140,855,856,859,861],{"class":142,"line":187},[140,857,858],{"class":146},"  initialDelaySeconds",[140,860,160],{"class":150},[140,862,863],{"class":163},"5\n",[140,865,866,869,871],{"class":142,"line":195},[140,867,868],{"class":146},"  periodSeconds",[140,870,160],{"class":150},[140,872,873],{"class":163},"10\n",[128,875,876],{"v-slot:after":130},[132,877,879],{"className":134,"code":878,"language":136,"meta":130,"style":130},"livenessProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 8080\n  initialDelaySeconds: 5\n  periodSeconds: 10\nreadinessProbe:\n  httpGet:\n    path: \u002Fready\n    port: 8080\n  initialDelaySeconds: 5\n  periodSeconds: 5\n  failureThreshold: 3\n",[44,880,881,887,893,901,909,917,925,932,938,948,957,966,975],{"__ignoreMap":130},[140,882,883,885],{"class":142,"line":143},[140,884,824],{"class":146},[140,886,151],{"class":150},[140,888,889,891],{"class":142,"line":154},[140,890,831],{"class":146},[140,892,151],{"class":150},[140,894,895,897,899],{"class":142,"line":167},[140,896,838],{"class":146},[140,898,160],{"class":150},[140,900,843],{"class":183},[140,902,903,905,907],{"class":142,"line":175},[140,904,848],{"class":146},[140,906,160],{"class":150},[140,908,853],{"class":163},[140,910,911,913,915],{"class":142,"line":187},[140,912,858],{"class":146},[140,914,160],{"class":150},[140,916,863],{"class":163},[140,918,919,921,923],{"class":142,"line":195},[140,920,868],{"class":146},[140,922,160],{"class":150},[140,924,873],{"class":163},[140,926,927,930],{"class":142,"line":206},[140,928,929],{"class":146},"readinessProbe",[140,931,151],{"class":150},[140,933,934,936],{"class":142,"line":423},[140,935,831],{"class":146},[140,937,151],{"class":150},[140,939,941,943,945],{"class":142,"line":940},9,[140,942,838],{"class":146},[140,944,160],{"class":150},[140,946,947],{"class":183},"\u002Fready\n",[140,949,951,953,955],{"class":142,"line":950},10,[140,952,848],{"class":146},[140,954,160],{"class":150},[140,956,853],{"class":163},[140,958,960,962,964],{"class":142,"line":959},11,[140,961,858],{"class":146},[140,963,160],{"class":150},[140,965,863],{"class":163},[140,967,969,971,973],{"class":142,"line":968},12,[140,970,868],{"class":146},[140,972,160],{"class":150},[140,974,863],{"class":163},[140,976,978,981,983],{"class":142,"line":977},13,[140,979,980],{"class":146},"  failureThreshold",[140,982,160],{"class":150},[140,984,985],{"class":163},"3\n",[41,987,988,989,992,993,473,996,999],{},"দুটো আলাদা এন্ডপয়েন্ট রাখাটা ইচ্ছাকৃত। ",[44,990,991],{},"\u002Fhealth"," শুধু বলে প্রসেসটা বেঁচে আছে কি না — সাধারণত একটা স্ট্যাটিক ",[44,994,995],{},"200 OK",[44,997,998],{},"\u002Fready"," আসল কাজ করে: DB কানেকশন আছে কি না, প্রয়োজনীয় ক্যাশ লোড হয়েছে কি না, সেটা চেক করে তারপর উত্তর দেয়। দুটো একই এন্ডপয়েন্টে বেঁধে ফেললে DB কানেকশন সাময়িকভাবে হারালে পুরো Pod-টাই রিস্টার্ট হতে থাকবে — যেটার দরকার ছিল না, শুধু ট্রাফিক সরিয়ে রাখলেই চলত।",[293,1001,1002],{},[41,1003,1004,1007],{},[44,1005,1006],{},"initialDelaySeconds"," কম রাখলে একটা ধীরে-শুরু-হওয়া অ্যাপ নিজের readiness probe ফেইল করতে করতেই বারবার রিস্টার্ট খেতে থাকে (liveness probe সেটাকে \"ডেড\" ভেবে বসে) — CrashLoopBackOff-এর একটা বড় কারণ এটাই, অ্যাপ আসলে ক্র্যাশই করছে না।",[56,1009,1011],{"id":1010},"স্লো-স্টার্ট-অ্যাপের-জন্য-আরেকটা-প্রোব","স্লো-স্টার্ট অ্যাপের জন্য আরেকটা প্রোব",[41,1013,1014,1015,1018],{},"যেসব অ্যাপ চালু হতে বেশি সময় নেয় — বড় Java অ্যাপ্লিকেশন, ভারী মাইগ্রেশন চালায় এমন সার্ভিস — তাদের জন্য ",[44,1016,1017],{},"startupProbe"," আলাদা রাখা ভালো। এটা পাস না হওয়া পর্যন্ত liveness আর readiness প্রোব শুরুই হয় না, তাই স্টার্টআপের ধীর গতিকে \"ক্র্যাশ\" ভেবে ভুল করার সুযোগ থাকে না।",[343,1020,1021],{},[41,1022,1023,1024,1026,1027,1029,1030,1033,1034,1037],{},"তিনটা প্রোবের জন্য তিনটা আলাদা এন্ডপয়েন্ট বানানোর দরকার নেই। ",[44,1025,1017],{}," প্রায়ই ",[44,1028,929],{},"-এর মতোই এন্ডপয়েন্ট ব্যবহার করে, শুধু ",[44,1031,1032],{},"failureThreshold"," বেশি আর ",[44,1035,1036],{},"periodSeconds"," কম রেখে — স্লো স্টার্টআপকে বেশি সময় দেওয়ার জন্য।",[380,1039],{":answer":707,":options":1040,"checkLabel":384,"correctLabel":385,"explanation":1041,"incorrectLabel":387,"question":1042,"resetLabel":389},"[\"Pod-টা রিস্টার্ট করবে\",\"Pod-টাকে Service-এর endpoint থেকে সরিয়ে দেবে, রিস্টার্ট করবে না\",\"কিছুই করবে না, শুধু লগে ওয়ার্নিং লিখবে\",\"পুরো Deployment রোলব্যাক করে দেবে\"]","readiness আর liveness সম্পূর্ণ আলাদা সিদ্ধান্ত নেয়। liveness পাস করছে মানে প্রসেসটা বেঁচে আছে, তাই রিস্টার্ট করার কোনো কারণ নেই। readiness ফেইল করছে মানে এই মুহূর্তে ট্রাফিক নেওয়ার মতো অবস্থায় নেই, তাই Service তাকে সাময়িকভাবে বাদ দেয়। প্রসেসটা বেঁচে থেকেই এই বাদ পড়া থেকে ফিরে আসতে পারে — পরের সফল readiness চেকেই আবার endpoint লিস্টে যোগ হয়ে যাবে।","একটা Pod-এর readinessProbe তিনবার ফেইল করেছে, কিন্তু livenessProbe পাস করছে। Kubernetes কী করবে?",[56,1044,1046],{"id":1045},"pod-ট্রাফিক-না-পেলে-যা-চেক-করবেন","Pod ট্রাফিক না পেলে যা চেক করবেন",[395,1048],{":items":1049,"doneLabel":398,"resetLabel":399,"title":1050},"[{\"label\":\"kubectl describe pod \u003Cname> চালিয়ে Events সেকশন দেখুন\",\"detail\":\"readiness probe ফেইল করলে এখানেই প্রথম দেখা যাবে।\"},{\"label\":\"kubectl get endpoints \u003Cservice> চেক করুন\",\"detail\":\"Pod-টার IP যদি লিস্টে না থাকে, তাহলে সে ট্রাফিকই পাচ্ছে না — এটাই নিশ্চিত করার প্রথম ধাপ।\"},{\"label\":\"readiness আর liveness একই এন্ডপয়েন্ট ব্যবহার করছে কি না দেখুন\",\"detail\":\"করলে সেটাই সবচেয়ে বড় সন্দেহভাজন।\"},{\"label\":\"initialDelaySeconds অ্যাপের আসল স্টার্টআপ টাইমের সাথে মিলিয়ে দেখুন\",\"detail\":\"অ্যাপ যদি ১৫ সেকেন্ডে চালু হয় আর delay থাকে ৫ সেকেন্ড, সমস্যাটা এখানেই।\"},{\"label\":\"\u002Fready এন্ডপয়েন্ট নিজে curl করে দেখুন Pod-এর ভেতর থেকে\",\"detail\":\"kubectl exec দিয়ে ঢুকে curl localhost:PORT\u002Fready — Kubernetes যা দেখছে সেটাই সরাসরি দেখা যাবে।\"}]","Running অথচ ট্রাফিক পাচ্ছে না — ডিবাগিং অর্ডার",[41,1052,1053,1054,1056],{},"এরপর থেকে ",[44,1055,756],{}," দেখলেই আর ভরসা করার দরকার নেই। প্রশ্নটা হবে — কোন প্রোব, কী বলছে।",[405,1058,1059],{},"html pre.shiki code .sza-u, html code.shiki .sza-u{--shiki-default:#8DDB8C;--shiki-dark:#8DDB8C}html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html pre.shiki code .sQdni, html code.shiki .sQdni{--shiki-default:#6CB6FF;--shiki-dark:#6CB6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":130,"searchDepth":167,"depth":167,"links":1061},[1062,1063,1064,1065],{"id":774,"depth":154,"text":775},{"id":805,"depth":154,"text":806},{"id":1010,"depth":154,"text":1011},{"id":1045,"depth":154,"text":1046},"2026-09-06","kubectl get pods বলছে Running, অথচ ইউজার 502 পাচ্ছে। কারণটা Kubernetes-এর দোষ না — কেউ liveness আর readiness probe-এর পার্থক্যটা কখনো বুঝিয়ে দেয়নি।",{},{"title":742,"description":1067},"blog\u002Fbn\u002Fkubernetes-liveness-readiness-probe",[428,429,1072],"Probe","lPq5RJVIEmzpDHe9ypVgCcG1_TNNqGf7Dttcjmbq08Y",{"id":1075,"title":1076,"author":1077,"body":1080,"category":1207,"cover":416,"coverAlt":416,"date":1208,"description":1209,"draft":6,"extension":419,"featured":6,"lang":420,"meta":1210,"navigation":24,"path":1211,"readingTime":423,"seo":1212,"seoTitle":1213,"stem":1214,"tags":1215,"__hash__":1219},"blog\u002Fblog\u002Fbn\u002Ftrust-social-proof-conversion.md","মানুষ কেন অচেনা কারো কাছ থেকে কিনতে দ্বিধা করে — Trust Signal যেভাবে সেল বাড়ায়",{"name":1078,"role":1079},"সাদিয়া ইসলাম","গ্রোথ ও মার্কেটিং লিড",{"type":38,"value":1081,"toc":1200},[1082,1085,1092,1096,1103,1108,1112,1136,1139,1144,1148,1155,1160,1164,1171,1176,1180,1184,1187],[41,1083,1084],{},"একটা নতুন ফ্রিল্যান্সার, ভালো কাজ জানেন, পোর্টফোলিওও ভালো — কিন্তু ক্লায়েন্ট পাচ্ছেন না। অথচ পাশের আরেকজন, কাজের মান প্রায় কাছাকাছি, কিন্তু প্রোফাইলে \"৫০+ প্রজেক্ট সম্পন্ন, ৪.৯ রেটিং\" লেখা — তার কাছেই ক্লায়েন্ট বেশি যাচ্ছে।",[41,1086,1087,1088,1091],{},"এটা অন্যায্য মনে হতে পারে, কিন্তু মানুষের সিদ্ধান্ত নেওয়ার প্রক্রিয়াটাই এভাবে কাজ করে। কোনো কিছু সম্পর্কে নিজে যাচাই করার সময় বা তথ্য না থাকলে, মানুষ দেখে ",[99,1089,1090],{},"অন্যরা কী করছে"," — আর সেটাকেই নিরাপদ সিদ্ধান্ত হিসেবে ধরে নেয়।",[56,1093,1095],{"id":1094},"social-proof-একা-সিদ্ধান্ত-নিতে-না-চাওয়ার-প্রবণতা","Social Proof — একা সিদ্ধান্ত নিতে না চাওয়ার প্রবণতা",[41,1097,1098,1099,1102],{},"মনোবিজ্ঞানী Robert Cialdini তার বিখ্যাত \"Influence\" বইতে এই প্যাটার্নটাকে বলেছেন ",[99,1100,1101],{},"social proof"," — অনিশ্চয়তার মুহূর্তে মানুষ অন্যদের আচরণ দেখে নিজের সিদ্ধান্ত ঠিক করে। একটা রেস্টুরেন্টের সামনে লাইন দেখলে সেটাকে \"ভালো রেস্টুরেন্ট\" ধরে নেওয়া, বা একটা প্রোডাক্টের হাজার হাজার রিভিউ দেখে ভরসা পাওয়া — দুটোই একই প্রবৃত্তি থেকে আসে।",[76,1104,1105],{},[41,1106,1107],{},"Social proof সবচেয়ে বেশি কাজ করে যখন কাস্টমার নিজে নিশ্চিত না — নতুন প্রোডাক্ট, নতুন সার্ভিস প্রোভাইডার, বা দামি একটা সিদ্ধান্ত। যেখানে মানুষ ইতিমধ্যে নিশ্চিত (যেমন নিয়মিত কেনা কোনো ব্র্যান্ড), সেখানে রিভিউ-সংখ্যার প্রভাব তুলনামূলক কম।",[56,1109,1111],{"id":1110},"নির্দিষ্ট-সংখ্যা-ভাসা-ভাসা-দাবির-চেয়ে-বেশি-কার্যকর","নির্দিষ্ট সংখ্যা, ভাসা ভাসা দাবির চেয়ে বেশি কার্যকর",[121,1113,1118,1128],{"after":1114,"before":1115,"note":1116,"split":1117},"নির্দিষ্ট, যাচাইযোগ্য তথ্য","ভাসা ভাসা দাবি","ডান পাশের সংস্করণ নির্দিষ্ট সংখ্যা আর নাম দিয়ে যাচাইযোগ্যতা তৈরি করে — মিথ্যা বলার সুযোগ কম মনে হয়, তাই বিশ্বাসযোগ্যতাও বেশি।","একই ফ্রিল্যান্স প্রোফাইল",[128,1119,1120],{"v-slot:before":130},[132,1121,1126],{"className":1122,"code":1124,"language":1125},[1123],"language-text","অনেক ক্লায়েন্টের সাথে কাজ\nকরেছি, সবাই খুশি হয়েছেন।\nসেরা সার্ভিস দেওয়ার\nচেষ্টা করি সবসময়।\n","text",[44,1127,1124],{"__ignoreMap":130},[128,1129,1130],{"v-slot:after":130},[132,1131,1134],{"className":1132,"code":1133,"language":1125},[1123],"৩৭টা প্রজেক্ট, ৪.৯\u002F৫ রেটিং\n(১১ জন ক্লায়েন্ট রিভিউ)\n\"Grameenphone-এর ড্যাশবোর্ড\nরিডিজাইন — ৩ সপ্তাহে ডেলিভারি\"\n",[44,1135,1133],{"__ignoreMap":130},[41,1137,1138],{},"ভাসা ভাসা দাবি (\"সবাই খুশি\") আসলে মিথ্যা বলার মতোই সহজ, তাই মস্তিষ্ক সেটাকে বিশেষ গুরুত্ব দেয় না। কিন্তু নির্দিষ্ট সংখ্যা আর নাম — যাচাই করা যায় এমন কিছু — সহজে বানিয়ে বলা যায় না বলেই বেশি বিশ্বাসযোগ্য মনে হয়।",[293,1140,1141],{},[41,1142,1143],{},"জাল রিভিউ বা বানানো সংখ্যা ব্যবহার করাটা শুধু নৈতিকভাবে ভুল না — বাস্তবে ধরা পড়ে গেলে (আর প্রায়ই পড়ে) সেটা নিরপেক্ষভাবে বিশ্বাসহীনতার চেয়েও বেশি ক্ষতি করে, কারণ কাস্টমার তখন প্রতারিত বোধ করে। যা আছে তাই দেখান — অল্প কিছু আসল রিভিউ, বানানো অনেক রিভিউয়ের চেয়ে বেশি কাজ করে।",[56,1145,1147],{"id":1146},"reciprocity-আগে-দিলে-পরে-পাওয়া-যায়","Reciprocity — আগে দিলে, পরে পাওয়া যায়",[41,1149,1150,1151,1154],{},"Cialdini-র আরেকটা নীতি — ",[99,1152,1153],{},"reciprocity","। কেউ আগে থেকে বিনামূল্যে কিছু মূল্যবান পেলে, বিনিময়ে কিছু ফেরত দেওয়ার একটা স্বাভাবিক তাগিদ অনুভব করে। এই কারণেই ফ্রি টেমপ্লেট, ফ্রি অডিট, ফ্রি কনসালটেশন — এসব দীর্ঘমেয়াদে সেল বাড়ায়: প্রথমেই বিক্রির চেষ্টা না করে, আগে সাহায্য করলে বিশ্বাস তৈরি হয়, আর সেই বিশ্বাস থেকেই লেনদেন শুরু হয়।",[343,1156,1157],{},[41,1158,1159],{},"Reciprocity কাজ করার জন্য যা দিচ্ছেন সেটা আসলেই দরকারি হতে হবে — একটা সাধারণ ব্লগ পোস্টের চেয়ে, কাস্টমারের নির্দিষ্ট সমস্যার একটা ছোট, ব্যক্তিগতকৃত সমাধান (যেমন তার ওয়েবসাইটের একটা কুইক পারফরম্যান্স অডিট) অনেক বেশি প্রভাব ফেলে — কারণ সেটা স্পষ্টভাবে বোঝায় যে তার জন্যই সময় দেওয়া হয়েছে।",[56,1161,1163],{"id":1162},"authority-কে-বলছে-সেটাও-গুরুত্বপূর্ণ","Authority — কে বলছে সেটাও গুরুত্বপূর্ণ",[41,1165,1166,1167,1170],{},"একই তথ্য একজন নবীন ফ্রিল্যান্সার বললে এক রকম শোনায়, আর কেউ যদি জানে যে সেই একই মানুষ একটা পরিচিত কোম্পানির সাথে কাজ করেছেন, তাহলে সেটা অন্যরকম ওজন পায়। এটাকে বলে ",[99,1168,1169],{},"authority"," — সার্টিফিকেট, পরিচিত ক্লায়েন্টের নাম, বা কোনো প্রতিষ্ঠিত প্ল্যাটফর্মে ফিচার হওয়া — এসব প্রকৃত দক্ষতা না বাড়ালেও, সেই দক্ষতার প্রতি বিশ্বাসকে বাড়িয়ে দেয়।",[380,1172],{":answer":382,":options":1173,"checkLabel":384,"correctLabel":385,"explanation":1174,"incorrectLabel":387,"question":1175,"resetLabel":389},"[\"দাম খুব বেশি দেখাচ্ছে\",\"সার্ভিস লিস্ট খুব ছোট\",\"কোনো social proof বা trust signal নেই, তাই ভিজিটর ঝুঁকি নিতে দ্বিধা করবে\",\"ওয়েবসাইটের ডিজাইন পুরনো\"]","দাম বা ডিজাইন সমস্যা হতে পারে, কিন্তু মূল বাধা হলো বিশ্বাসের অভাব। একটা নতুন বা অচেনা এজেন্সির কাছ থেকে কেনার সিদ্ধান্তে ঝুঁকি বেশি মনে হয় — কেউ যাচাই করতে পারছে না এটা আসলেই কাজ করে কি না। ক্লায়েন্ট লোগো, নির্দিষ্ট সংখ্যাসহ রিভিউ, বা আসল কেস স্টাডি এই ঝুঁকির অনুভূতি কমিয়ে দেয়, কারণ সেগুলো দেখায় যে অন্যরা আগে ঝুঁকি নিয়ে সন্তুষ্ট হয়েছে।","একটা নতুন ওয়েব এজেন্সির ওয়েবসাইটে কোনো ক্লায়েন্ট লোগো, রিভিউ বা কেস স্টাডি নেই — শুধু সার্ভিস লিস্ট আর দাম আছে। সবচেয়ে বড় সমস্যা কী?",[56,1177,1179],{"id":1178},"trust-signal-অডিট-করার-চেকলিস্ট","Trust signal অডিট করার চেকলিস্ট",[395,1181],{":items":1182,"doneLabel":398,"resetLabel":399,"title":1183},"[{\"label\":\"রিভিউ বা টেস্টিমোনিয়ালে নির্দিষ্ট নাম, সংখ্যা বা ফলাফল আছে কি?\",\"detail\":\"\\\"ভালো লেগেছে\\\"-র চেয়ে \\\"৩ সপ্তাহে ডেলিভারি, ৪০% দ্রুত লোড টাইম\\\" বেশি বিশ্বাসযোগ্য।\"},{\"label\":\"পরিচিত ক্লায়েন্ট বা প্রতিষ্ঠানের নাম দেখানো যাচ্ছে কি (অনুমতি নিয়ে)?\",\"detail\":\"একটা পরিচিত নাম, দশটা অচেনা নামের চেয়ে বেশি কাজ করতে পারে।\"},{\"label\":\"কোনো ফ্রি মূল্যবান কিছু আগে থেকে দেওয়া হচ্ছে কি (reciprocity)?\",\"detail\":\"একটা ছোট, ব্যক্তিগতকৃত সাহায্য — সাধারণ কনটেন্টের চেয়ে বেশি বিশ্বাস তৈরি করে।\"},{\"label\":\"কোনো দাবিই কি যাচাই-অযোগ্য বা অতিরঞ্জিত শোনাচ্ছে?\",\"detail\":\"অতিরঞ্জিত দাবি সন্দেহ তৈরি করে, বিশ্বাস না।\"},{\"label\":\"রিভিউ বা প্রমাণ কি আসল, নাকি বানানো?\",\"detail\":\"জাল প্রমাণ ধরা পড়লে যেকোনো pricing বা marketing কৌশলের চেয়ে বেশি ক্ষতি করে।\"}]","ওয়েবসাইট বা প্রোফাইলে বিশ্বাসযোগ্যতা যাচাই করার তালিকা",[41,1185,1186],{},"সেল বাড়ানোর অনেকটাই আসলে প্রোডাক্ট বদলানো না — কাস্টমারের চোখে ঝুঁকিটা কমিয়ে দেওয়া। আর সেই ঝুঁকি কমে যখন সে দেখে, তার আগে অন্যরাও একই সিদ্ধান্ত নিয়ে ঠকেনি।",[41,1188,1189,1190,1194,1195,1199],{},"বিশ্বাস তৈরি হয়ে গেলে পরের প্রশ্নটা আসে দাম নিয়ে — ",[82,1191,1193],{"href":1192},"\u002Fblog\u002Fbn\u002Fprice-anchoring-decoy-effect","সেটা কীভাবে উপস্থাপন করলে কাজ করে",", আর ",[82,1196,1198],{"href":1197},"\u002Fblog\u002Fbn\u002Ffreelance-rate-setting","নিজের রেট কীভাবে ঠিক করবেন"," — দুটোই আলাদা হিসাব।",{"title":130,"searchDepth":167,"depth":167,"links":1201},[1202,1203,1204,1205,1206],{"id":1094,"depth":154,"text":1095},{"id":1110,"depth":154,"text":1111},{"id":1146,"depth":154,"text":1147},{"id":1162,"depth":154,"text":1163},{"id":1178,"depth":154,"text":1179},"business","2026-09-11","একই ল্যান্ডিং পেজ, একই দাম, একই প্রোডাক্ট — শুধু নিচে তিনটা রিভিউ যোগ করলেই কনভার্শন বদলে যায়। এটা কাকতালীয় না, মানুষ সিদ্ধান্ত নেওয়ার সময় অন্যদের আচরণ দেখেই ভরসা করে।",{},"\u002Fblog\u002Fbn\u002Ftrust-social-proof-conversion",{"title":1076,"description":1209},"মানুষ অচেনা কারো কাছ থেকে কিনতে কেন দ্বিধা করে","blog\u002Fbn\u002Ftrust-social-proof-conversion",[1216,1217,1218],"Trust","Conversion","সাইকোলজি","zbp8wNKt8V0yU7FIOwTSAV5lhPtUdkwPcOtUAWdPOJA",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1221},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m9 18l6-6l-6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1223},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8 2v3m8-3v3\"\u002F>\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M3 9h18\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1225},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 6v6l4 2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1227},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u002F>\u003Cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1229},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\" ry=\"2\"\u002F>\u003Crect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M6 6h.01M6 18h.01\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1231},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M16 7h6v6\"\u002F>\u003Cpath d=\"m22 7l-8.5 8.5l-5-5L2 17\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1233},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 16v-4m0-4h.01\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1235},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m9 15l6-6\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1237},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M12 3v18\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1239},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1241},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7v14\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1243},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1245},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1247},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m9 12l2 2l4-4\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1249},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3m.08 4h.01\"\u002F>\u003C\u002Fg>",1791742742211]