কুবারনেটসে কনফিগারেশন আপডেটের সময় শুঁটি পুনরায় চালু করবেন?


120

যখন কনফিগারেশনটি পরিবর্তন / আপডেট করা হবে তখন আমি কীভাবে স্বয়ংক্রিয়ভাবে কুবেরনেটস পোড এবং শিবির স্থাপনার সাথে যুক্ত পুনরায় চালু করব?


আমি জানি যে কোনও কনফিগারেশন মানচিত্র পরিবর্তিত হওয়ার সাথে সাথে পডগুলি স্বয়ংক্রিয়ভাবে পুনঃসূচনা করার ক্ষমতা সম্পর্কে আলোচনা হয়েছে তবে আমার জ্ঞানের কাছে এটি কুবারনেটস ১.২ এ এখনও পাওয়া যায় না।

সুতরাং আমি (আমি মনে করি) আমি কী করতে চাই তা কনফিগার মানচিত্র গ্রাসকারী শাঁসগুলির সাথে সম্পর্কিত ডিপ্লোয়মেন্ট রিসোর্সের একটি "রোলিং পুনঃসূচনা" । এটি কি সম্ভব, এবং যদি হয় তবে কীভাবে প্রকৃত টেমপ্লেটে কোনও পরিবর্তন না করে কুবেরনেটসে কোনও স্থাপনার রোলিং পুনরায় চালু করতে বাধ্য করা যায়? এটি বর্তমানে এটি করার সবচেয়ে ভাল উপায় বা এর থেকে আরও ভাল বিকল্প নেই?


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...আমার জন্য কাজটি করুন
maciek

উত্তর:


60

কনফিগারেশন মানচিত্র আপডেটে একটি পডকে সংকেত দেওয়া কাজগুলির একটি বৈশিষ্ট্য ( https://github.com/kubernetes/kubernetes/issues/22368 )।

আপনি সর্বদা একটি কাস্টম পিড 1 লিখতে পারেন যা বিজ্ঞপ্তিটি পরিবর্তিত হয়ে আপনার অ্যাপ্লিকেশনটি পুনঃসূচনা করে।

আপনি উদাহরণস্বরূপ: দুটি কনটেইনে একই কনফিগারেশন মানচিত্রটি মাউন্ট করতে পারেন, দ্বিতীয় কনটেইনারে একটি HT স্বাস্থ্য পরীক্ষার বহিঃপ্রকাশ করুন যা কনফিগার ম্যাপের সামগ্রীগুলির হ্যাশ পরিবর্তিত হলে ব্যর্থ হয় এবং এটি প্রথম পাত্রে জীবন্ততা অনুসন্ধান হিসাবে সরিয়ে দেয় (কারণ ধারকগুলিতে একটি ধারক রয়েছে পোড একই নেটওয়ার্ক নেমস্পেস শেয়ার করে)। প্রোবে ব্যর্থ হলে কুবললেট আপনার জন্য আপনার প্রথম ধারকটি পুনরায় চালু করবে।

অবশ্যই কোনও পোডগুলি কী নোডগুলি চালু রয়েছে সে সম্পর্কে যদি আপনার চিন্তা না করে তবে আপনি কেবল সেগুলি মুছতে পারেন এবং প্রতিলিপি নিয়ন্ত্রণকারী আপনার জন্য এগুলি "পুনরায় চালু" করবে।


"পোড মুছে ফেলার" সাথে আপনি বোঝাচ্ছেন: সমস্ত পডের নাম সংগ্রহ করা, একটি মুছুন, প্রতিস্থাপিত হওয়া পর্যন্ত অপেক্ষা করুন, দ্বিতীয়টি মুছুন, প্রতিস্থাপিত হওয়া পর্যন্ত অপেক্ষা করুন ইত্যাদি সঠিক?
টর্স্টেন ব্রোঞ্জার

6
একটি ডিপ্লোয়মেন্ট ব্যবহার করে আমি এটিকে স্কেল করে নামব এবং তারপরেও। আপনার কাছে এখনও অল্প পরিমাণে সময় থাকবে। এটি হ্রাস করতে আপনি এক লাইনে এটি করতে পারেন ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
নিক এইচ

যদি আপনি সমস্ত শুঁটি খুঁজতে না চান এবং ডাউনটাইম সম্পর্কে চিন্তা না করেন - কেবল আরসি সরিয়ে ফেলুন এবং তারপরে আরসি তৈরি করুন।
২rew

1
এর অর্থ কি এটির উপরে চাপানো ভলিউম আপডেট হয়েছে এবং পুরো পোডটি পুনরায় আরম্ভ না করে আপনার কেবল পডে ফাইলটি পুনরায় পড়তে হবে?
ম্যাট উইলিয়ামসন

@ নিক দ্রুত এবং অদ্ভুত, ভাগ্যক্রমে আমার ক্ষেত্রে ডাউনটাইম গ্রহণযোগ্য ছিল এবং এটি দুর্দান্ত কাজ করেছে, ধন্যবাদ!
ChocolateAndCheese

129

এই সমস্যার বর্তমান সমাধান ( ডিভাইস উত্তরের সাথে সংযুক্ত https://github.com/kubernetes/kubernetes/issues/22368 এ গভীর রেফারেন্স করা ) ডিপ্লয়মেন্টগুলি ব্যবহার করা এবং আপনার কনফিগারেশনকে অপরিবর্তনীয় বলে বিবেচনা করুন।

আপনি যখন নিজের কনফিগারটি পরিবর্তন করতে চান, আপনি যে পরিবর্তনগুলি করতে চান তা নিয়ে একটি নতুন কনফিগার ম্যাপ তৈরি করুন এবং আপনার স্থাপনাকে নতুন কনফিগারম্যাপে নির্দেশ করুন। যদি নতুন কনফিগারেশনটি নষ্ট হয়ে যায়, তবে ডিপ্লোয়মেন্টটি আপনার কার্যকরী রেপ্লিকাসেট স্কেল করতে অস্বীকার করবে। যদি নতুন কনফিগারটি কাজ করে, তবে আপনার পুরানো রেপ্লিকাসেটটি 0 টি প্রতিরূপে ছোট করে মুছে ফেলা হবে এবং নতুন কনফিগারেশন দিয়ে নতুন পোড শুরু হবে।

ঠিক জায়গায় কনফিগারেশন সম্পাদনা করার মতো তাত্পর্যপূর্ণ নয়, তবে অনেক বেশি নিরাপদ।


2
এটি আমরাও গ্রহণ করেছি
জোহান

4
নতুন পরীক্ষামূলক সরঞ্জামটি kustomizeস্বয়ংক্রিয়ভাবে একটি ডিস্ট্রিমেন্টিক কনফিগারেশন হ্যাশ তৈরির পক্ষে সমর্থন করে তা উল্লেখ করার দরকার নেই, এর অর্থ আপনাকে ম্যানুয়ালি একটি নতুন কনফিগারেশন তৈরি করার দরকার নেই: github.com/kubernetes-sigs/kustomize/blob/…
প্রতিসম

পর্দার আড়ালে স্পিনাকার এটিই করেন, তাই আপনি যদি এটি ব্যবহার করেন তবে আপনাকে এই সম্পর্কে চিন্তা করতে হবে না।
গস

32

এটির সবচেয়ে ভাল উপায় আমি খুঁজে পেয়েছি তা হ'ল রিলোডার run

এটি আপনাকে কনফিগারেশন বা দেখার গোপনীয়তা সংজ্ঞায়িত করতে দেয়, যখন সেগুলি আপডেট হয়ে যায়, আপনার স্থাপনার একটি রোলিং আপডেট সম্পাদিত হয়। এখানে একটি উদাহরণ:

আপনার কাছে একটি স্থাপনা fooএবং একটি কনফিগার ম্যাপ কল রয়েছে foo-configmap। আপনি যখনই কনফিগারেশনটি পরিবর্তন করা হয় তখন আপনি মোতায়েনের পোডগুলি রোল করতে চান। এর সাথে আপনার পুনঃলোডার চালানো দরকার:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

তারপরে আপনার মোতায়েনের ক্ষেত্রে এই টীকাটি নির্দিষ্ট করুন:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...


31

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

প্রায়শই কনটেইনারগুলি বা গোপনগুলিকে পাত্রে কনফিগারেশন ফাইল হিসাবে ইনজেকশনের ব্যবস্থা করা হয়। অ্যাপ্লিকেশন উপর নির্ভর করে একটি পরবর্তী সঙ্গে আপডেট করা উচিত পুনরায় আরম্ভের প্রয়োজন হতে পারে helm upgrade, কিন্তু যদি ডিপ্লোয়মেন্ট স্পেস নিজেই পরিবর্তন না করে তবে অ্যাপ্লিকেশনটি পুরানো কনফিগারেশনের সাথে চলমান রাখে ফলে বেমানান মোতায়েনের ফলস্বরূপ।

sha256sumফাংশন সঙ্গে একসঙ্গে ব্যবহার করা যেতে পারে includeফাংশন একটি স্থাপনার অন্য বৈশিষ্ট পরিবর্তন যদি টেমপ্লেট অধ্যায় আপডেট করা হয় তা নিশ্চিত করার জন্য:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]

আমার ক্ষেত্রে, কিছু কারণে, $.Template.BasePathকাজ $.Chart.Nameকরে না তবে করে:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}

8
প্রযোজ্য নয় সাধারণ Kubernetes ব্যবহারের একমাত্র হাল প্রযোজ্য
Emii Khaos

2
উত্তরটি সহায়ক তবে সম্ভবত এই প্রশ্নের সাথে প্রাসঙ্গিক নয়
আনন্দ সিং কুনওয়ার

helm3 প্রকাশিত হয়েছিল সম্প্রতি। সুতরাং, লিঙ্কটি পুরানো। এটি masterশাখা নির্দেশ করে। নিম্নলিখিত ইউআরএলটি (বর্তমানে) সর্বশেষ helm2 টি ডক্স নিয়ে যাবে: github.com/helm/helm/blob/release-2.16/docs/…
মার্সেল হোয়ার

শীতল সমাধান। আমি sha1sum এ পরিবর্তিত হয়েছি, যেমন আমার ক্ষেত্রে sha256sum এর 65 টি অক্ষর ছিল যার ফলস্বরূপ Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters। বিকল্প হবে | trunc 63, তবে sha1sum "আরও অনন্য" হওয়া উচিত।
ইপটিজার

11

আপনি একটি মেটাডেটা লেবেল আপডেট করতে পারেন যা আপনার স্থাপনার জন্য প্রাসঙ্গিক নয়। এটি একটি ঘূর্ণায়মান-আপডেট ট্রিগার করবে

উদাহরণ স্বরূপ:

metadata:
  labels:
    configmap-version: 1

আমি মেটাডেটা: লেবেলগুলি: কনফিগারেশন-সংস্করণ: 1
c4f4t0r

7
মেটাডেটা লেবেল পরিবর্তনগুলি শুঁটিগুলি পুনরায় আরম্ভ করতে ট্রিগার করে না
ড্যান কার্টার

এই উত্তরের উত্তর রয়েছে তাই আমার জিজ্ঞাসা করা দরকার। আমরা যদি মেটাডেটা আপডেট করি তবে কুবেরনেটস ক্লাস্টার কি কোনও ঘূর্ণায়মান আপডেট ট্রিগার করবে? @ maoz-সাদোক
তিতাস

1
আমি বিশ্বাস করি যতক্ষণ না মেটাডাটা লেবেলের অধীনে রয়েছেtemplate.spec
সাইকিরান যেররাম

1

যখন ডিপ্লোয়মেন্টটি একটি সাব-চার্টে ছিল এবং এটি নিয়ন্ত্রণকারী মানগুলি প্যারেন্ট চার্টের মান ফাইলগুলিতে ছিল তখন এই সমস্যা ছিল। এটি আমরা পুনঃসূচনাটি ট্রিগার করতে ব্যবহার করেছি:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

স্পষ্টতই এটি কোনও মান পরিবর্তনের পুনরায় সূচনা করতে পারে তবে এটি আমাদের পরিস্থিতির জন্য কাজ করে। চাইল্ড চার্টে যা ছিল তা কেবল তখনই কাজ করবে যদি চাইল্ড চার্টে কনফিগারেশন.আইএমএল নিজেই পরিবর্তন হয়:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}

0

আমি কোয়ান্টা এর সমাধান করি এবং এটি পুরোপুরি কার্যকর হয় But তবে আমি যা বুঝতে পারি না তা হ'ল শুঁটি আসলে পুনরায় আরম্ভ হচ্ছে না ... পডটি এখনও একই তবে পরিবর্তন আছে!

উদাহরণস্বরূপ: পড 50 মিনিট থেকে চলছে এবং আমি কিছু পরিবর্তন করি এবং পরিবর্তনটি অনলাইনে হয় আমি এটি আমার ব্রাউজারে দেখতে পাচ্ছি এবং শুঁটি এখনও + 50 মিনিট চলছে! আমি হেলম 3 ব্যবহার করছি ... আপনি কি জানেন কি কনফিগারেশন আপডেট পুনরায় চালু না করে এটি সম্ভব করে তোলে?


1
ঠিক আছে! আমি এটি খুঁজে পেয়েছি ... কারণ আমরা আমাদের কনফিগারেশনটিকে একটি ভলিউম হিসাবে মাউন্ট করেছি এবং গতিশীলভাবে আপডেট করেছি ... এই কারণেই যখন আমি এই "'চেকসাম' 'জিনিসটি করি তখন আমার পোড পুনরায় আরম্ভ হয় না তবে পরিবর্তনগুলি সেখানে থাকে! আমি একটি হিসাবে প্রস্তাব দিই ভাল সমাধান :)
ইব্রাহিম ইয়েসলে

-1

আরেকটি উপায় হ'ল ডিপ্লোয়মেন্টের কমান্ড বিভাগটিতে এটি আটকে রাখা:

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

অন্যথা, এটি আরো ConfigMap মত অতিরিক্ত ডিপ্লোয়মেন্ট ব্যবহার করতে হবে এমন মাত্র হোস্ট যে কনফিগ commandবিভাগে এবং চালানো kubectl createএটিতে যখন (Content একটি হ্যাশ গণক মত) তার নাম একটি অনন্য 'সংস্করণ' যুক্ত করা এবং পরিবর্তন সব যে কনফিগারেশন ব্যবহার করে:

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

kubectl-apply-config.shকাজটি শেষ হলে আমি সম্ভবত পোস্ট করব ।

(এটি করবেন না; এটি খুব খারাপ দেখাচ্ছে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.