Kubernetes छवि को अपडेट करने के लिए परिनियोजन कैसे करें


131

मेरे पास एकल पॉड के साथ परिनियोजन है, जैसे मेरी कस्टम docker छवि:

containers:
  - name: mycontainer
    image: myimage:latest

विकास के दौरान मैं नए नवीनतम संस्करण को आगे बढ़ाना चाहता हूं और तैनाती को अद्यतन करना चाहता हूं। स्पष्ट रूप से परिभाषित / संस्करण को परिभाषित किए बिना और प्रत्येक बिल्ड के लिए इसे बढ़ाएँ और क्या करें, यह नहीं पता

kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1

जवाबों:


151

आप अपने पॉड को एक ग्रेस अवधि (उदाहरण के लिए 30 सेकंड या अधिक, कंटेनर स्टार्टअप समय और छवि आकार पर निर्भर करता है) और सेट के साथ कॉन्फ़िगर कर सकते हैं "imagePullPolicy: "Always"। और उपयोग करें kubectl delete pod pod_name। एक नया कंटेनर बनाया जाएगा और नवीनतम छवि स्वचालित रूप से डाउनलोड की जाएगी, फिर पुराने कंटेनर को समाप्त कर दिया जाएगा।

उदाहरण:

spec:
  terminationGracePeriodSeconds: 30
  containers:
  - name: my_container
    image: my_image:latest
    imagePullPolicy: "Always"

मैं वर्तमान में स्वचालित बिल्ड और इमेज टैगिंग के लिए जेनकिन्स का उपयोग कर रहा हूं और यह कुछ इस तरह दिखता है:

kubectl --user="kube-user" --server="https://kubemaster.example.com"  --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"

एक और ट्रिक है इंटेलीली रन करने के लिए:

kubectl set image deployment/my-deployment mycontainer=myimage:latest

और फिर:

kubectl set image deployment/my-deployment mycontainer=myimage

यह वास्तव में रोलिंग-अपडेट को ट्रिगर करेगा लेकिन सुनिश्चित करें कि आपने भी imagePullPolicy: "Always"सेट किया है।

अपडेट करें:

एक और चाल मैंने पाया, जहां आपको छवि का नाम नहीं बदलना है, एक फ़ील्ड का मान बदलना है जो रोलिंग अपडेट को ट्रिगर करेगा, जैसे terminationGracePeriodSeconds। आप इस का उपयोग कर सकते kubectl edit deployment your_deploymentया kubectl apply -f your_deployment.yamlया इस तरह एक पैच का उपयोग कर:

kubectl patch deployment your_deployment -p \
  '{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'

बस सुनिश्चित करें कि आप हमेशा संख्या मान को बदलते हैं।


1
वास्तव में यह आपकी चाल बुरी नहीं है, म्युमैज को देखते हुए: लास्ट और मायमैज मूल रूप से एक ही बात है, धन्यवाद!
abovesun

1
यह चाल बग की तरह अधिक प्रतीत होती है, निश्चित नहीं कि हमें इसे दो बार निर्दिष्ट करने की आवश्यकता क्यों है।
स्पीडप्लेन

2
यदि आप एक ही छवि का उपयोग करके एक नया पॉड शुरू करने के लिए कुबेरनेट की तैनाती चाहते हैं (और यह ट्रिक केवल "नवीनतम" टैग के साथ काम करती है) तो आपको इसे बिना टैग के निर्दिष्ट करना होगा। अगली बार "नवीनतम" टैग जोड़ें और यह अपडेट को ट्रिगर करेगा। आदेश उलटा हो सकता है, इससे कोई फर्क नहीं पड़ता। आप कभी भी उत्पादन में "नवीनतम" टैग का उपयोग नहीं करते हैं, लेकिन विकास के उद्देश्यों के लिए आप कभी-कभी इसका लाभ उठा सकते हैं।
कैमिल

2
यह केवल नवीनतम के लिए काम करता है। डिफ़ॉल्ट रूप से, कम से कम डॉकटर हब में, एक छवि को टैग नहीं करने से यह "नवीनतम" टैग मान लेगा। लेकिन इसके बिना भी काम करेंगे। यह उदाहरण कुछ ऐसा नहीं है जिसे आप उत्पादन परिवेश में चाहते हैं, और ऐसे कई उपयोग मामले नहीं हैं जहां आप विकास में भी इसका लाभ उठा सकते हैं। CI / CD टूल का उपयोग करके किसी छवि को स्वचालित रूप से अपडेट करने के लिए बेहतर तरीके हैं।
कैमिल

11
हर बार जब आप टैग बदलते हैं और kubectl set imageकमांड चलाते हैं , तो कुबेरनेट एक रोलिंग अपडेट करेगा। उदाहरण के लिए, मान लें कि आपने "रेपो / माइमेज: लेटेस्ट" तैनात किया है। इस बीच आपकी छवि बदल दी गई और "v0.2" टैग के साथ रेपो में धकेल दी गई। आप एक अद्यतन चलाकर प्रदर्शन कर सकते हैं। kubectl set image deployment/my-deployment mycontainer=myimage:v0.2इस चित्र में "नवीनतम" टैग भी होगा।
कैमिल

73

अद्यतन 2019-06-24

यदि आपके पास एक 1.15संस्करण है तो @Jodiug टिप्पणी के आधार पर आप कमांड का उपयोग कर सकते हैं:

kubectl rollout restart deployment/demo

मुद्दे पर और पढ़ें:

https://github.com/kubernetes/kubernetes/issues/13488


वैसे इस विषय पर एक दिलचस्प चर्चा कुबेरनेट्स गीथहब परियोजना पर है। मुद्दा देखें: https://github.com/kubernetes/kubernetes/issues/33664

वहाँ वर्णित समाधान से, मैं दो में से एक का सुझाव दूंगा।

प्रथम

1. संक्षिप्त तैनाती

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: registry.example.com/apps/demo:master
        imagePullPolicy: Always
        env:
        - name: FOR_GODS_SAKE_PLEASE_REDEPLOY
          value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'

2.Deploy

sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml

दूसरा (एक लाइनर):

kubectl patch deployment web -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

बेशक imagePullPolicy: Alwaysदोनों मामलों पर आवश्यक है।


दूसरी संबंधित ट्रिक मिली। यदि आप किसी भी विशिष्ट तैनाती को निर्दिष्ट किए बिना "कुबेटल रोलआउट रिस्टार्ट तैनाती" करते हैं, तो यह "सभी" करेगा।
लेनार्ट रोलैंड

21
kubectl rollout restart deployment myapp

यह एक रोलिंग अपडेट को ट्रिगर करने और kubectl rolloutरोलबैक जैसे अन्य संचालन के लिए पुराने प्रतिकृति सेट को छोड़ने का वर्तमान तरीका है ।


@Prathameshdhanawade पैच ऑपरेशन का कोई undoकमांड या समकक्ष नहीं है।
मार्टिन पीटर

7

मैं छवि बनाने के लिए Gitlab-CI का उपयोग करता हूं और फिर इसे सीधे GCK पर तैनात करता हूं। यदि कंटेनर की किसी भी वास्तविक सेटिंग्स को बदलने के बिना रोलिंग अपडेट प्राप्त करने के लिए एक साफ छोटी चाल का उपयोग करें, जो वर्तमान कम-शॉर्ट-शा के लिए एक लेबल बदल रहा है।

मेरी आज्ञा इस प्रकार दिखती है:

kubectl patch deployment my-deployment -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"build\":\"$CI_COMMIT_SHORT_SHA\"}}}}}}"

जहां आप लेबल के लिए किसी भी नाम और किसी भी मूल्य का उपयोग कर सकते हैं जब तक कि यह प्रत्येक बिल्ड के साथ बदलता है।

मज़े करो!


6

ऐसा लगता है कि k8 हमें हर तैनाती के लिए एक अलग छवि टैग प्रदान करने की उम्मीद करता है। मेरी डिफ़ॉल्ट रणनीति सीआई सिस्टम को बनाने और डॉक छवियों को पुश करने के लिए होगी, उन्हें बिल्ड नंबर के साथ टैग करना xpmatteo/foobar:456:।

स्थानीय विकास के लिए स्क्रिप्ट या मेकफाइल का उपयोग करना सुविधाजनक हो सकता है, जैसे:

# create a unique tag    
VERSION:=$(shell date +%Y%m%d%H%M%S)
TAG=xpmatteo/foobar:$(VERSION)

deploy:
    npm run-script build
    docker build -t $(TAG) . 
    docker push $(TAG)
    sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record

sedआदेश वास्तविक उत्पन्न छवि टैग के साथ तैनाती दस्तावेज़ में एक प्लेसहोल्डर बदल देता है।


कुबेरनेट्स को किसी भी छवि के सबसे हाल के संस्करण को खींचने के लिए आपको एक नए टैग के साथ तैनाती को अपडेट करने की आवश्यकता नहीं है, "नवीनतम" सबसे आम उदाहरण है।
डेव व्हाइट

1

मैं कंटेनरीकृत अनुप्रयोगों को तैनात करने के लिए Azure DevOps का उपयोग कर रहा हूं, मैं आसानी से बिल्ड आईडी का उपयोग करके इस समस्या को दूर करने का प्रबंधन कर रहा हूं

हर बार इसकी बिल्ड और नई बिल्ड आईडी को जेनरेट करता है, मैं इस बिल्ड आईडी को डॉकटर इमेज के लिए टैग के रूप में उपयोग करता हूं

imagename: buildID

एक बार जब आपकी छवि सफलतापूर्वक (CI) बन जाती है, तो तैनाती yml फ़ाइल में सीडी पाइपलाइन में मैंने छवि नाम दिया है

imagename: env: buildID

यहाँ evn: buildid azure devops वैरिएबल है जिसमें बिल्ड ID का मान है।

इसलिए अब हर बार मेरे पास (CI) और तैनाती (CD) के नए बदलाव हैं।

कृपया टिप्पणी करें कि क्या आपको CI / CD के लिए बिल्ड परिभाषा की आवश्यकता है।


मेनिफेस्टो रेपो का हिस्सा है। मुझे समझ नहीं आ रहा है कि इसके लिए सबसे अच्छे तरीके क्या हैं। यदि मैं पाइपलाइन में छवि बनाता हूं, तो क्या मुझे अपडेटेड मैनिफ़ेस्ट में मास्टर करने के लिए धक्का देना चाहिए? या क्या मुझे कलाकृतियों के लिए एक अद्यतन अभिव्यक्ति का उत्पादन करना चाहिए (और इस प्रकार रेपो में प्रकट वास्तविक टैग छवि के बिना सिर्फ एक टेम्पलेट होगा)?
pablete
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.