कुबेरनेट्स में कॉन्फ़िगरेशन अपडेट करते समय पॉड्स को फिर से शुरू करें?


121

जब उनके कॉन्फ़िगरमैप को बदला / अपडेट किया जाता है, तो मैं अपने आप कुबेरनेट्स पॉड्स और पॉड्स को तैनाती से कैसे पुनः आरंभ कर सकता हूं?


मुझे पता है कि पॉड्स को स्वचालित रूप से पुनरारंभ करने की क्षमता के बारे में बात की गई है जब एक कॉन्फ़िगर मैप बदलता है लेकिन मेरी जानकारी के लिए यह कुबेरनेट्स 1.2 में अभी तक उपलब्ध नहीं है।

तो मैं क्या करना चाहता हूं (मुझे लगता है) कि विन्यास मानचित्र का उपभोग करने वाले फली से जुड़े परिनियोजन संसाधन का "रोलिंग पुनरारंभ" है । क्या यह संभव है, और यदि ऐसा है, तो वास्तविक टेम्प्लेट में कुछ भी बदले बिना कुबेरनेट्स में एक तैनाती की रोलिंग फिर से शुरू करने के लिए कैसे? क्या वर्तमान में ऐसा करने का सबसे अच्छा तरीका है या कोई बेहतर विकल्प है?


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...मेरे लिए काम करो
maciek

जवाबों:


60

कॉन्फिग मैप अपडेट पर एक पॉड को सिग्नल करना कामों में एक विशेषता है ( https://github.com/kubernetes/kubernetes/issues/22368 )।

आप हमेशा एक कस्टम pid1 लिख सकते हैं जो नोटिस को बदल देता है और आपके ऐप को पुनरारंभ करता है।

आप यह भी देख सकते हैं: 2 कंटेनरों में एक ही कॉन्फिग मैप को माउंट करें, दूसरे कंटेनर में http हेल्थ चेक को एक्सपोज करें जो कि फाल्ट मैप कंटेंट का हैश बदलता है, और पहले कंटेनर की लाईनेस जांच के रूप में शॉव करता है (क्योंकि कंटेनर एक में फली एक ही नेटवर्क नाम स्थान साझा करें)। जब जांच विफल हो जाती है तो क्यूबलेट आपके लिए अपना पहला कंटेनर फिर से चालू करेगा।

बेशक अगर आपको इस बात की परवाह नहीं है कि पॉड्स किस नोड पर हैं, तो आप बस उन्हें हटा सकते हैं और प्रतिकृति नियंत्रक उन्हें आपके साथ "पुनरारंभ" करेगा।


"फली हटाने" के साथ आपका मतलब है: सभी पॉड नामों को एकत्रित करना, एक को हटाना, प्रतिस्थापित होने तक प्रतीक्षा करना, दूसरे को हटाना, प्रतिस्थापित किए जाने तक प्रतीक्षा करें आदि सही हैं?
टॉर्स्टन ब्रोंगर

6
एक तैनाती का उपयोग कर मैं इसे नीचे और फिर ऊपर स्केल करूंगा। आप अभी भी समय की एक छोटी राशि है कि होगा। आप इसे कम करने के लिए एक पंक्ति में कर सकते हैं ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
निक एच

यदि आप सभी पॉड नहीं ढूंढना चाहते हैं, और डाउनटाइम के बारे में परवाह नहीं करते हैं - तो बस आरसी हटा दें और फिर आरसी बनाएं।
ड्रू

1
क्या इसका मतलब यह है कि जिस वॉल्यूम पर इसे माउंट किया गया है वह अपडेट किया गया है और आपको पूरी पॉड को फिर से शुरू किए बिना फाइल को पॉड पर फिर से पढ़ने की जरूरत है?
मैट विलियम्सन

@ निकच त्वरित और गंदा, सौभाग्य से मेरे मामले में डाउनटाइम स्वीकार्य था और यह महान काम किया, धन्यवाद!
ChocolateAndCheese

129

इस समस्या का वर्तमान सबसे अच्छा समाधान ( https://github.com/kubernetes/kubernetes/issues/22368 जो कि भाई के उत्तर में जुड़ा हुआ है) में गहराई से उपयोग किया गया है।

जब आप अपना कॉन्फिगरेशन बदलना चाहते हैं, तो आप जो बदलाव करना चाहते हैं, उसके साथ एक नया कॉन्फिगरेशन बनाएं और नए कॉन्फिगरेशन में अपनी तैनाती को इंगित करें। यदि नया कॉन्फिगरेशन टूट गया है, तो परिनियोजन आपके कार्य प्रतिकृति को स्केल करने से इंकार कर देगा। यदि नया कॉन्फिगर काम करता है, तो आपकी पुरानी रेप्लिकासेट को 0 रेप्लिका में बदल दिया जाएगा और हटा दिया जाएगा, और नए पॉड को नए कॉन्फिगर के साथ शुरू किया जाएगा।

जगह में केवल विन्यास मानचित्र संपादन के रूप में बहुत जल्दी नहीं है, लेकिन बहुत सुरक्षित है।


2
यह वह तरीका है जो हमने साथ में लिया है
जोहान

4
वर्थ उल्लेख है कि नए प्रयोगात्मक उपकरण kustomizeका समर्थन करता है स्वचालित रूप से एक नियतात्मक configmap हैश बनाने, जिसका अर्थ है आप मैन्युअल रूप से एक नया configmap बनाने की जरूरत नहीं है: github.com/kubernetes-sigs/kustomize/blob/...
सममित

यह वही है जो स्पिननेकर पर्दे के पीछे करता है, इसलिए यदि आप इसका उपयोग करते हैं, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं होगी।
गस

32

सबसे अच्छा तरीका है कि मैं यह करने के लिए मिल गया है Reloader चला रहा है

यह आपको कॉन्फ़िगरेशन या रहस्यों को देखने की अनुमति देता है, जब वे अपडेट हो जाते हैं, तो आपकी तैनाती का एक रोलिंग अपडेट किया जाता है। यहाँ एक उदाहरण है:

आपके पास एक परिनियोजन 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
...

Reloader kubernetes> = 1.9
jacktrade

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
सामान्य कुबेरनेट उपयोग के लिए लागू नहीं है, केवल हेल्म पर लागू होता है
Emii खाओस 16'18

2
उत्तर सहायक है लेकिन शायद इस प्रश्न के लिए प्रासंगिक नहीं है
आनंद सिंह कुंवर

helm3 हाल ही में रिलीज़ हुई थी। इस प्रकार, लिंक पुराना है। यह masterशाखा की ओर इशारा करता है। निम्नलिखित URL से (वर्तमान में) नवीनतम helm2 डॉक्स होंगे: github.com/helm/helm/blob/release-2.16/docs/…
Marcel Hoyer

शांत समाधान। मैं sha1sum में बदल गया, क्योंकि मेरे मामले में sha256sum में 65 अक्षर थे, जिसके परिणामस्वरूप Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters। वैकल्पिक होगा | trunc 63, लेकिन sha1sum "अधिक अद्वितीय" होना चाहिए।
16

11

आप मेटाडेटा लेबल को अपडेट कर सकते हैं जो आपकी तैनाती के लिए प्रासंगिक नहीं है। यह एक रोलिंग-अद्यतन को ट्रिगर करेगा

उदाहरण के लिए:

metadata:
  labels:
    configmap-version: 1

मैं मेटाडेटा के बारे में डॉक्स देख रहा हूं: लेबल: configmap-version: 1
c4f4t0r

7
मेटाडाटा लेबल परिवर्तन
डैन कार्टर

इस जवाब में उथल-पुथल है, इसलिए मुझे पूछने की जरूरत है। यदि हम मेटाडेटा को अपडेट करते हैं, तो क्या कुबेरनेट्स क्लस्टर एक रोलिंग अपडेट को ट्रिगर करेगा? @ माओज़-सादोक
टाइटस

1
मेरा मानना ​​है कि यह तब तक काम करता है जब तक मेटाडाटा लेबल के अंतर्गत हैtemplate.spec
साइकिरन येरम

1

यह समस्या थी जहाँ परिनियोजन एक उप-चार्ट में था और इसे नियंत्रित करने वाले मान पैरेंट चार्ट की मान फ़ाइल में थे। यह वही है जो हम पुनः आरंभ करने के लिए उपयोग करते हैं:

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

जाहिर है कि यह किसी भी मूल्य परिवर्तन पर पुनः आरंभ होगा लेकिन यह हमारी स्थिति के लिए काम करता है। मूल रूप से चाइल्ड चार्ट में मूल रूप से क्या काम करेगा यदि चाइल्ड चार्ट में config.yaml ही बदल गया हो:

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

0

मैं क्वांटा का समाधान करता हूं और यह पूरी तरह से काम करता है। लेकिन जो मुझे समझ में नहीं आता है वह यह है कि फली वास्तव में पुनरारंभ नहीं हो रही है ... फली अभी भी वही है लेकिन परिवर्तन है!

उदाहरण के लिए: फली 50min के बाद से चल रही है और मैं कुछ बदल रहा हूं और परिवर्तन ऑनलाइन है मैं इसे अपने ब्राउज़र पर देख सकता हूं और पॉड अभी भी 50min चल रहा है !! मैं हेल्म 3 का उपयोग कर रहा हूं ... क्या आप जानते हैं कि कॉन्फ़िगरेशन को अपडेट किए बिना क्या संभव है?


1
ठीक! मुझे यह पता चला है ... क्योंकि हमने अपने कॉन्फ़िगरेशनमैप को एक वॉल्यूम के रूप में माउंट किया है और गतिशील रूप से अपडेट किया है ... यही कारण है कि जब मैं यह "चेकसम" सामान करता हूं तो मेरी पॉड फिर से शुरू नहीं होती है, लेकिन परिवर्तन होते हैं! अच्छा समाधान :)
इब्राहिम यसयले

-1

दूसरा तरीका यह है कि इसे तैनाती के कमांड सेक्शन में चिपका दिया जाए:

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

वैकल्पिक रूप से, इसे और अधिक विन्यास-जैसा बनाने के लिए, एक अतिरिक्त परिनियोजन का उपयोग करें जो कि commandअनुभाग में उस विन्यास को होस्ट करेगा और kubectl createउसके नाम के लिए एक अद्वितीय 'संस्करण' जोड़ते समय उस पर अमल करेगा (जैसे सामग्री के एक हैश की गणना) और सभी को संशोधित करना उस कॉन्फ़िगरेशन का उपयोग करने वाली तैनाती:

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

मैं शायद पोस्ट करूँगा kubectl-apply-config.shअगर यह काम कर रहा है।

(ऐसा मत करो; यह बहुत बुरा लगता है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.