চিত্র আপডেট করার জন্য কীভাবে ডিপ্লোয়মেন্ট করা যায় তা কুবারনেটস


131

আমার নিজস্ব কাস্টম ডকার ইমেজ সহ একক পডের সাথে স্থাপনা আছে:

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
আসলে এটি আপনার কৌশলটি খারাপ নয়, মাইমেজ বিবেচনা করে: লাস্টেট এবং মাইমেজ মূলত একই জিনিস, ধন্যবাদ!
উপরের সান

1
এই কৌশলটি আরও ত্রুটির মতো মনে হচ্ছে, কেন এটি আমাদের দুবার নির্দিষ্ট করার দরকার তা নিশ্চিত নয়।
স্পিড প্লেন

2
আপনি যদি একই চিত্র ব্যবহার করে একটি নতুন পোড শুরু করতে কোনও কুবার্নেটস ডিপ্লোয়মেন্ট চান (এবং এই কৌশলটি "সর্বশেষ" ট্যাগটি দিয়েই কাজ করে) আপনাকে ট্যাগ ছাড়াই এটি নির্দিষ্ট করতে হবে। পরবর্তী সময় "সর্বশেষ" ট্যাগ যুক্ত করুন এবং এটি আপডেটটিকে ট্রিগার করবে। অর্ডারটি বিপরীত করা যেতে পারে, তাতে কিছু আসে যায় না। আপনি উত্পাদনে কখনই "সর্বশেষ" ট্যাগ ব্যবহার করেন না, তবে বিকাশের উদ্দেশ্যে আপনি কখনও কখনও এটি থেকে উপকৃত হতে পারেন।
কামিল

2
এটি কেবল সর্বশেষের জন্য কাজ করে। ডিফল্টরূপে, কমপক্ষে ডকার হবে, কোনও চিত্র ট্যাগ না করে এটি "সর্বশেষ" ট্যাগটি ধরে নেবে। কিন্তু এটি ছাড়া কাজ করবে। এই উদাহরণটি কোনও উত্পাদন পরিবেশে আপনি চাইবেন এমন কিছু নয়, এবং এমন অনেকগুলি ব্যবহারের ঘটনা নেই যা আপনি বিকাশেও এটি থেকে উপকৃত হতে পারেন। সিআই / সিডি সরঞ্জাম ব্যবহার করে একটি চিত্র স্বয়ংক্রিয়ভাবে আপডেট করার জন্য আরও ভাল পদ্ধতি রয়েছে।
ক্যামিল

11
আপনি যখনই ট্যাগ এবং রান kubectl set imageকমান্ডটি পরিবর্তন করবেন , কুবারনেটগুলি রোলিং আপডেট করবে perform উদাহরণস্বরূপ, ধরা যাক আপনি "রেপো / মাইমেজ: সর্বশেষ" স্থাপন করেছেন। ইতিমধ্যে আপনার চিত্রটি পরিবর্তন করা হয়েছিল এবং "v0.2" ট্যাগ সহ রেপোতে ঠেলে দেওয়া হয়েছিল। আপনি চালিয়ে একটি আপডেট সম্পাদন করতে পারেন kubectl set image deployment/my-deployment mycontainer=myimage:v0.2এই চিত্রটিতে "সর্বশেষ" ট্যাগও থাকবে।
কামিল

73

আপডেট 2019-06-24

@ জোডিয়ুগ মন্তব্যের ভিত্তিতে যদি আপনার কোনও 1.15সংস্করণ থাকে তবে আপনি কমান্ডটি ব্যবহার করতে পারেন:

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উভয় ক্ষেত্রে প্রয়োজনীয়।


সম্পর্কিত আরও একটি কৌশল খুঁজে পেয়েছি। যদি আপনি কেবল কোনও নির্দিষ্ট স্থাপনার নাম উল্লেখ না করেই "কুবেক্টেল রোলআউট পুনরায় আরম্ভের স্থাপনা" করেন তবে এগুলি "সমস্ত" করবে।
লেনার্ট রোল্যান্ড

20
kubectl rollout restart deployment myapp

রোলিং আপডেটগুলি ট্রিগার করার এবং kubectl rolloutরোলব্যাকের মতো সরবরাহিত অন্যান্য ক্রিয়াকলাপগুলির জন্য পুরানো প্রতিলিপি সেটগুলিতে রেখে যাওয়ার বর্তমান উপায় ।


@ প্রথমেশধনবাদে প্যাচ অপারেশনের কোনও undoআদেশ বা সমমান নেই।
মার্টিন পিটার

7

আমি চিত্রটি তৈরি করতে গিটল্যাব-সিআই ব্যবহার করি এবং তারপরে এটি সরাসরি জিসিকেতে স্থাপন করি। ধারকটির কোনও আসল সেটিংস পরিবর্তন না করে কোনও রোলিং আপডেট অর্জনের জন্য যদি একটি ঝরঝরে সামান্য কৌশল ব্যবহার করা হয়, যা বর্তমান কমিট-শর্ট-শে একটি লেবেল পরিবর্তন করছে।

আমার আদেশটি এরকম দেখাচ্ছে:

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

যেখানে আপনি প্রতিটি বিল্ডের সাথে পরিবর্তিত হওয়া অবধি লেবেলের জন্য কোনও নাম এবং কোনও মান ব্যবহার করতে পারেন।

আনন্দ কর!


6

দেখে মনে হচ্ছে কে-কে আমাদের প্রতিটি স্থাপনার জন্য একটি আলাদা চিত্র ট্যাগ সরবরাহ করবে। আমার ডিফল্ট কৌশলটি হ'ল সিআই সিস্টেমটিকে ডকারের চিত্রগুলি তৈরি এবং ধাক্কা দিয়ে, বিল্ড নম্বর দিয়ে ট্যাগ করে 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

আমি কন্টেইনারাইজ অ্যাপ্লিকেশন মোতায়েনের জন্য অ্যাজুর ডিভোপস ব্যবহার করছি, বিল্ড আইডি ব্যবহার করে আমি সহজেই এই সমস্যাটি কাটিয়ে ওঠার ব্যবস্থা করছি

যতবার এটি তৈরি হয় এবং নতুন বিল্ড আইডি উত্পন্ন করে, আমি এই বিল্ড আইডিটিকে ডকার চিত্রের ট্যাগ হিসাবে ব্যবহার করি এখানে উদাহরণস্বরূপ

imagename: buildID

একবার আপনার চিত্রটি সফলভাবে বিল্ড (সিআই) হয়ে গেলে, ডিপ্লোয়মেন্ট yML ফাইলের সিডি পাইপলাইনে আমি চিত্রটির নাম দিয়েছি

imagename: env: buildID

এখানে প্রকোপ: বিল্ডিড হ'ল অ্যাজুর ডিওপস ভেরিয়েবল যা বিল্ড আইডির মান রাখে।

সুতরাং এখন প্রতিবার আমার কাছে বিল্ড (সিআই) এবং নতুন স্থাপনার (সিডি) নতুন পরিবর্তন রয়েছে।

আপনার যদি সিআই / সিডির জন্য বিল্ড সংজ্ঞা প্রয়োজন হয় তবে মন্তব্য করুন।


ম্যানিফেস্টটি রেপুর অংশ। আমি এর জন্য সেরা অনুশীলনগুলি কী তা বুঝতে পারি না। যদি আমি পাইপলাইনে চিত্রটি তৈরি করি, তবে আমি কি আপডেটেড ম্যানিফেস্টে মাস্টার করার জন্য চাপ দিতে পারি? বা আমি কি শিল্পাগুলিতে একটি আপডেট ম্যানিফেস্ট উত্পাদন করতে পারি (এবং এভাবে রেপোতে ম্যানিফেস্টটি প্রকৃত ট্যাগযুক্ত চিত্র ব্যতিরেকে কেবল একটি টেম্পলেট হবে)?
pablete
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.