मैं कुबेरनेट्स को एक छवि को फिर से खींचने के लिए कैसे मजबूर करूं?


161

मेरे पास GKE पर कुबेरनेट्स में निम्नलिखित प्रतिकृति नियंत्रक है:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    app: myapp
    deployment: initial
  template:
    metadata:
      labels:
        app: myapp
        deployment: initial
    spec:
      containers:
      - name: myapp
        image: myregistry.com/myapp:5c3dda6b
        ports:
        - containerPort: 80
      imagePullPolicy: Always
      imagePullSecrets:
        - name: myregistry.com-registry-key

अब अगर मैं कहूं

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b

रोलिंग अपडेट किया जाता है, लेकिन कोई पुन: नहीं खींचता है। क्यों?


12
मैंने एक ही टैग के साथ एक अलग छवि दी। यदि एक अलग टैग देना आवश्यक है, तो ठीक है, मुझे imagePullPolicyक्षेत्र में कोई मतलब नहीं दिखता है ।
टॉरस्ट ब्रोंगर

4
मैं एक विशिष्ट टैग का उपयोग करना चाहता हूं, लेकिन इसका नवीनतम संस्करण।
टॉरस्टेन ब्रॉन्गर

3
@TorstenBronger मुझे लगता है कि यह कुबेरनेट्स / डॉकर सिद्धांत में एक ब्रेकिंग परिवर्तन है। यह विचार कि आप छवि को खींच सकते हैं: टैग (नवीनतम के अलावा) दो अलग-अलग समय पर और दो अलग-अलग छवियां प्राप्त करना समस्याग्रस्त होगा। एक टैग एक संस्करण संख्या के समान है। छवि बदलने पर टैग को हमेशा बदलना बेहतर होगा।
duct_tape_coder

2
निर्भर करता है। एक बहुत ही स्थिर एपीआई लेकिन सुरक्षा अद्यतन के साथ सॉफ्टवेयर है। फिर, मैं स्पष्ट रूप से कहने के बिना नवीनतम संस्करण चाहता हूं।
टॉर्स्टन ब्रॉन्जर

1
@TorstenBronger का उपयोग करने के बारे में latest, यह मत करो। लेटेस्ट टैग के साथ लेटेस्ट, हाल ही में और अधिक इमेज खींचेगा। आप जो चाहते हैं, वह सेमी वीर श्रेणी है। उदाहरण के लिए ~ 1.2.3। यह> = 1.2.3 और <1.3.0 की सीमा के बीच टैग के साथ चित्र खींचेगा। जब तक छवि विक्रेता आपके वीवीयर को जानता है (और यह महत्वपूर्ण हिस्सा है) तब तक कोई बैकवर्ड ब्रेकिंग परिवर्तन नहीं जोड़ा गया था (उद्देश्य पर) और इसमें कोई नई सुविधाएँ नहीं जोड़ी गई थीं (संभावित सुरक्षा चिंता)। कृपया, कृपया latestउत्पादन प्रणाली में कभी उपयोग न करें ।
डेविड जे एडी

जवाबों:


141

कुबेरनेट्स पॉड निर्माण पर खींच लेंगे यदि या तो ( अपडेट-छवियों को देखें ):

  • टैग की गई छवियों का उपयोग करना :latest
  • imagePullPolicy: Always अधिकृत है

यह बहुत अच्छा है अगर आप हमेशा खींचना चाहते हैं। लेकिन क्या होगा यदि आप इसे मांग पर करना चाहते हैं : उदाहरण के लिए, यदि आप उपयोग करना चाहते हैं, some-public-image:latestलेकिन केवल एक नया संस्करण मैन्युअल रूप से खींचना चाहते हैं जब आप इसे पूछते हैं। आप वर्तमान में कर सकते हैं:

  • सेट imagePullPolicyकरने के लिए IfNotPresentया Neverऔर पूर्व पुल : प्रत्येक क्लस्टर नोड इतना नवीनतम कैश किया गया है पर पुल के चित्रों को मैन्युअल, तो एक कर kubectl rolling-updateया फलियाँ पुनः आरंभ करने के समान (बदसूरत आसानी से टूट हैक!)
  • अस्थायी रूप से बदलें imagePullPolicy, ए करें kubectl apply, फली को पुनः आरंभ करें (जैसे kubectl rolling-update) imagePullPolicy, फिर से करें, फिर से करें kubectl apply(बदसूरत!)
  • खींचो और some-public-image:latest अपने निजी भंडार के लिए धक्का और एक kubectl rolling-updateभारी (!)

ऑन-डिमांड पुल के लिए कोई अच्छा समाधान नहीं। यदि वह बदलता है, तो कृपया टिप्पणी करें; मैं इस जवाब को अपडेट करूंगा।


आप कहते हैं कि कुबेरनेट्स पॉड क्रिएशन का उपयोग करते समय खींचेंगे :latest- patchआईएनजी के बारे में क्या ? क्या यह भी हमेशा नवीनतम / नवीनतम छवि खींचता है? मेरे लिए काम नहीं लगता है :(
pkyeck

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

यह एक अलग सवाल का जवाब है। मैं के लिए कहा मजबूर कर एक फिर से पुल।
टॉर्स्टन ब्रॉन्गर

इसने मुझे GCR से एक नए पुल को मजबूर करने की अनुमति दी। मेरे पास एक :latestटैग था जो एक नई छवि को इंगित करता था, और kubectl rolling-updateपॉड्स को अपडेट करने के लिए काम करता था।
रैंडी एल

धन्यवाद। खींचो और धक्का दृष्टिकोण के लिए चला गया। बैश स्क्रिप्ट के साथ जितना संभव हो उतना स्वचालित, लेकिन सहमत, यह भारी है :)
आर्केल्डन

77

किसी को विशेष imagePullPolicyडेटा के बजाय कंटेनर डेटा के अंदर समूह करना होगा। हालाँकि, मैंने इस बारे में एक मुद्दा दायर किया क्योंकि मुझे यह अजीब लगता है। इसके अलावा, कोई त्रुटि संदेश नहीं है।

तो, यह युक्ति स्निपेट काम करता है:

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key

3
imagePullPolicy(या टैगिंग :latest) अच्छा है यदि आप हमेशा खींचना चाहते हैं, लेकिन मांग पर खींचने के सवाल को हल नहीं करता है।
Wernight

1
हां, मैं हमेशा खींचना चाहता हूं , जैसा कि प्रश्न में कहा गया है।
टॉर्स्टन ब्रॉन्गर

1
imagePullPolicy: Alwaysकंटेनर परिभाषा के अंदर का उपयोग करने kubernetesसे :latestजब भी उनका कोई नया संस्करण रजिस्ट्री में धकेला जाता है, तो उसके साथ टैग की गई छवियां होंगी ?
पकरमोल

1
@pkaramol नंबर imagePullPolicy: Alwaysकेवल कुबेरनेट्स को हमेशा रजिस्ट्री से छवि खींचने के लिए कहता है। क्या छवि यह imageविशेषता द्वारा कॉन्फ़िगर किया गया है। यदि आप इसे कॉन्फ़िगर करते हैं image: your-image:latest, तो यह हमेशा टैग के your-imageसाथ छवि को खींच लेगा latest
गजस

26

विकास के दौरान मेरी हैक नवीनतम टैग जोड़ने और हमेशा की तरह खींचने के लिए मेरे परिनियोजन प्रकटन को बदलना है

image: etoews/my-image:latest
imagePullPolicy: Always

फिर मैं फली को मैन्युअल रूप से हटाता हूं

kubectl delete pod my-app-3498980157-2zxhd

क्योंकि यह एक परिनियोजन है, कुबेरनेट्स स्वचालित रूप से फली को फिर से बनाएंगे और नवीनतम छवि को खींचेंगे।


मुझे "तैनाती" वस्तु के "वांछित राज्य" परिसर का लाभ उठाना पसंद है ... सुझाव के लिए धन्यवाद!
मार्सेलो डे सेल्स

2
यह ध्यान देने योग्य है कि रणनीति तभी व्यवहार्य है जब सेवा में विफलताएं और डाउनटाइम सहनीय हो। विकास के लिए यह उचित लगता है, लेकिन मैं इस रणनीति को कभी भी उत्पादन के लिए लागू नहीं करूंगा।
digitaldreamer

जैसा कि एवरेट ने सुझाव दिया था कि तैनाती को संपादित करें, छविपॉलिश को हमेशा के लिए बदलना और फली को हटाना मेरे लिए पर्याप्त था। हालांकि यह एक विकास का माहौल है। kubernetes.io/docs/concepts/containers/images
जोस रॉबर्टो

17

डमी एनोटेशन (या लेबल) के साथ तैनाती को पैच करने के लिए एक लोकप्रिय समाधान है:

kubectl patch deployment <name> -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

अपनी तैनाती को इन आवश्यकताओं को पूरा करने के लिए मानते हैं , इससे K8s किसी भी नई छवि और पुनर्विकास को खींच लेगा।


2
हां, मैं इसके लिए एक एनोटेशन का उपयोग करता हूं।
टॉर्स्टन ब्रॉन्गर

क्या एनोटेशन है?
Jeryl कुक

1
एक और परिष्कृत समाधान दोनों का एक संयोजन होगा। हमेशा कीImagePullPolicy तरह एक एनोटेशन और सेटिंग जोड़ना । जैसे एनोटेशन और काफी मददगार हो सकते हैं और अपरिवर्तनीय तैनाती की ओर अग्रसर होते हैं। deployment.kubernetes.io/revision: "v-someversion"kubernetes.io/change-cause: the reason
चंदन

16

Wil सीधे करने के लिए एक नया कॉमन हो सकता है:

एक नया kubectl rollout restartकमांड बनाएँ जो एक परिनियोजन का पुनः आरंभ करता है।

पुल अनुरोध गॉट विलय कर दिया। यह संस्करण का हिस्सा होगा 1.15( चैंज )


हाँ समस्या का हिस्सा: github.com/kubernetes/kubernetes/issues/13488
Tilo

हां, यह 1.15 के नए कुबेरनेट्स वर्जन में अपडेट को ट्रिगर करने का सबसे अच्छा तरीका है।
डॉल्फिन

7

जाहिरा तौर पर अब जब आप --imageमौजूदा कंटेनर छवि के समान तर्क के साथ रोलिंग-अपडेट चलाते हैं, तो आपको एक भी निर्दिष्ट करना होगा --image-pull-policy। निम्नलिखित कमांड को छवि के एक पुल को मजबूर करना चाहिए जब यह कंटेनर की छवि के समान हो:

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always


6
# Linux

kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

# windows

kubectl patch deployment <name> -p (-join("{\""spec\"":{\""template\"":{\""metadata\"":{\""annotations\"":{\""date\"":\""" , $(Get-Date -Format o).replace(':','-').replace('+','_') , "\""}}}}}"))

3

अब, kubectl rollout restart deploy YOUR-DEPLOYMENTएक imagePullPolicy: Alwaysनीति के साथ संयुक्त कमांड आपको अपनी छवि के नवीनतम संस्करण के साथ अपने सभी पॉड को फिर से शुरू करने की अनुमति देगा।


3

रोलिंग अपडेट कमांड, जब एक छवि तर्क दिया जाता है, मान लेता है कि छवि प्रतिकृति नियंत्रक में वर्तमान में मौजूद की तुलना में अलग है।


क्या इसका मतलब छवि टैग (उर्फ नाम) अलग होना चाहिए?
टॉरस्टेन ब्रोंगर

हां, यदि आप --imageझंडा पास करते हैं तो छवि का नाम अलग होना चाहिए ।
रॉबर्ट बेली

1
जैसा कि मेरा अपना जवाब कहता है, यह भी काम करता है अगर छवि का नाम समान है। यह केवल यह था कि ImagePullPolicy गलत जगह पर थी। मेरे बचाव के लिए, इस पहलू में k8s 1.0 डॉक्स त्रुटिपूर्ण हैं।
टॉरस्ट ब्रोंगर

जब डॉक्स व्यवहार के साथ सिंक से बाहर हो जाए तो प्यार करना चाहिए। : /
रॉबर्ट बैली

1
वह url पुराना भी है।
दान तेनाबाम


0

छवि खींचने की नीति वास्तव में हमेशा हर बार एक नई पॉड बनाने के लिए छवि को खींचने में मदद करेगी (यह किसी भी मामले में हो सकती है जैसे प्रतिकृतियों को स्केल करना, या पॉड मर जाता है और नई पॉड बनाई जाती है)

लेकिन अगर आप मौजूदा रनिंग पॉड की छवि को अपडेट करना चाहते हैं, तो तैनाती सबसे अच्छा तरीका है। यह आपको किसी भी समस्या के बिना निर्दोष अद्यतन छोड़ देता है (मुख्यतः जब आपके पास फली से जुड़ी लगातार मात्रा होती है) :)

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