نصائح وحيل Kubernetes: نقل موارد المجموعة إلى Helm 2



يمكن أن تنشأ الحاجة إلى الاستيلاء على موارد مجموعة Kubernetes في ظروف القتال عندما لا يمكنك فقط إعادة إنشائها باستخدام أدوات Helm. يمكن التمييز بين سببين رئيسيين:

  • سيكون الأمر بسيطًا - بغض النظر عما إذا كان لديك سحابة أو معدن مكشوف.
  • عند الإزالة ، قد تُفقد الخدمات في السحاب ، كما ستنطلق خدمة موازن التحميل المرتبطة في Kubernet.

في حالتنا ، كان الحل مطلوبًا للقبض على ingress-nginx أثناء دمج مشغل Kubernetes الخاص بنا.

من غير المقبول تمامًا بالنسبة لـ Helm أن الموارد التي يديرها لا يتم إنشاؤها من قبله.

"إذا كان من الممكن تغيير موارد إصدار فريقك يدويًا ، فاستعد لمواجهة المشكلات الموضحة في القسم: [BUG] بعد النشر ، لا تتوافق حالة موارد الإصدار في المجموعة مع مخطط Helm الموضح ". (من مقالتنا الأخيرة )

كما لوحظ سابقًا ، يعمل حلم على النحو التالي:

  1. في كل عملية تثبيت ( helm install ، أوامر helm upgrade ) ، يقوم Helm بتخزين بيان الإصدار الذي تم إنشاؤه في الواجهة الخلفية للتخزين . بشكل افتراضي ، يتم استخدام ConfigMaps: لكل مراجعة لإصدار ، يتم إنشاء ConfigMap في نفس مساحة الاسم التي يعمل فيها Tiller.
  2. أثناء النشرات المتكررة (أمر helm upgrade ) ، يقارن Helm البيان الذي تم إنشاؤه الجديد مع البيان القديم لأحدث مراجعة لإصدار DEPLOYED من ConfigMap ، ويطبق الفرق الناتج في Kubernetes.

استنادًا إلى هذه الميزات ، توصلنا إلى استنتاج مفاده أنه يكفي تصحيح ConfigMap (إصدار الواجهة الخلفية للتخزين) لالتقاط الصور ، أي اعتماد الموارد الموجودة في الكتلة.

يشير Tiller إلى ConfigMap بالتنسيق التالي: %RELEASE_NAME.v%REVISION . للحصول على إدخالات موجودة ، يجب تشغيل الأمر kubectl get cm -l OWNER=TILLER --namespace kube-system (افتراضيًا ، يتم تثبيت Tiller في kube-system الاسم - وإلا يجب عليك تحديد النظام المستخدم).

 $ kubectl get cm -l OWNER=TILLER -n kube-system NAME DATA AGE release_name_1.v618 1 5d release_name_1.v619 1 1d release_name_2.v1 1 2d release_name_2.v2 1 3d 

يتم تقديم كل ConfigMap بهذا التنسيق:

 apiVersion: v1 data: release: H4sIAHEEd1wCA5WQwWrDMAyG734Kwc52mtvwtafdAh27FsURjaljG1kp5O3nNGGjhcJ21M/nT7+stVZvcEozO7LAFAgLnSNOdG4boSkHFCpNIb55R2bBKSjM/ou4+BQt3Fp19XGwcNoINZHggIJWAayaH6leJ/24oTIBewplpQEwZ3Ode+JIdanxqXkw/D4CGClMpoyNG5HlmdAH05rDC6WPRTC6p2Iv4AkjXmjQ/WLh04dArEomt9aVJVfHMcxFiD+6muTEsl+i74OF961FpZEvJN09HEXyHmdOklwK1X7s9my7eYdK7egk8b8/6M+HfwNgE0MSAgIAAA== kind: ConfigMap metadata: creationTimestamp: 2019-02-08T11:12:38Z labels: MODIFIED_AT: "1550488348" NAME: release_name_1 OWNER: TILLER STATUS: DEPLOYED VERSION: "618" name: release_name_1.v618 namespace: kube-system resourceVersion: "298818981" selfLink: /api/v1/namespaces/kube-system/configmaps/release_name_1.v618 uid: 71c3e6f3-2b92-11e9-9b3c-525400a97005 OU4 + BQt3Fp19XGwcNoINZHggIJWAayaH6leJ / 24oTIBewplpQEwZ3Ode + JIdanxqXkw / D4CGClMpoyNG5HlmdAH05rDC6WPRTC6p2Iv4AkjXmjQ / WLh04dArEomt9aVJVfHMcxFiD + 6muTEsl + i74OF961FpZEvJN09HEXyHmdOklwK1X7s9my7eYdK7egk8b8 / 6M + HfwNgE0MSAgIAAA == apiVersion: v1 data: release: H4sIAHEEd1wCA5WQwWrDMAyG734Kwc52mtvwtafdAh27FsURjaljG1kp5O3nNGGjhcJ21M/nT7+stVZvcEozO7LAFAgLnSNOdG4boSkHFCpNIb55R2bBKSjM/ou4+BQt3Fp19XGwcNoINZHggIJWAayaH6leJ/24oTIBewplpQEwZ3Ode+JIdanxqXkw/D4CGClMpoyNG5HlmdAH05rDC6WPRTC6p2Iv4AkjXmjQ/WLh04dArEomt9aVJVfHMcxFiD+6muTEsl+i74OF961FpZEvJN09HEXyHmdOklwK1X7s9my7eYdK7egk8b8/6M+HfwNgE0MSAgIAAA== kind: ConfigMap metadata: creationTimestamp: 2019-02-08T11:12:38Z labels: MODIFIED_AT: "1550488348" NAME: release_name_1 OWNER: TILLER STATUS: DEPLOYED VERSION: "618" name: release_name_1.v618 namespace: kube-system resourceVersion: "298818981" selfLink: /api/v1/namespaces/kube-system/configmaps/release_name_1.v618 uid: 71c3e6f3-2b92-11e9-9b3c-525400a97005 

يتم تخزين البيانات التي تم إنشاؤها في شكل ثنائي (في المثال أعلاه .data.release ) ، لذلك قررنا إنشاء الإصدار باستخدام أدوات Helm القياسية ، ولكن باستخدام كعب روتين خاص ، يتم استبداله لاحقًا .data.release الموارد المحددة.

التنفيذ


خوارزمية الحل هي كما يلي:

  1. نحن بصدد إعداد ملف manifest.yaml مع بيانات الموارد لاعتماده (سيتم مناقشة هذا البند بمزيد من التفاصيل أدناه).
  2. نقوم بإنشاء مخطط فيه قالب واحد مع ConfigMap مؤقت ، لأنه لا يمكن لـ Helm إنشاء إصدار بدون موارد.
  3. نقوم بإنشاء templates/stub.yaml مع كعب روتين يساوي طوله عدد الأحرف في manifest.yaml (خلال التجارب تبين أنه يجب أن يتطابق عدد البايتات). وككعب ، يجب تحديد مجموعة أحرف قابلة للتكرار ، والتي ستبقى بعد الإنشاء وتخزينها في الواجهة الخلفية للتخزين. من أجل البساطة والوضوح ، # استخدام # ، أي:

     {{ repeat ${manifest_file_length} "#" }} 
  4. تثبيت المخطط: helm install helm upgrade --install و helm upgrade --install .
  5. نستبدل كعب الروتين في إصدار الواجهة الخلفية للتخزين بمورد manifest.yaml من manifest.yaml التي تم اختيارها لاعتمادها في الخطوة الأولى:

     stub=$(printf '#%.0s' $(seq 1 ${manifest_file_length})) release_data=$(kubectl get -n ${tiller_namespace} cm/${release_name}.v1 -o json | jq .data.release -r) updated_release_data=$(echo ${release_data} | base64 -d | zcat | sed "s/${stub}/$(sed -z 's/\n/\\n/g' ${manifest_file_path} | sed -z 's/\//\\\//g')/" | gzip -9 | base64 -w0) kubectl patch -n ${tiller_namespace} cm/${release_name}.v1 -p '{"data":{"release":"'${updated_release_data}'"}}' 
  6. نتحقق من أن Tiller متاح واستلم تغييراتنا.
  7. حذف ConfigMap المؤقتة (من الخطوة الثانية).
  8. علاوة على ذلك ، لا يختلف العمل مع الإصدار عن الإصدار العادي.

يتوفر التطبيق الموضح أعلاه على:

 $ ./script.sh Example: ./script.sh foo bar-prod manifest.yaml Usage: ./script.sh CHART_NAME RELEASE_NAME MANIFEST_FILE_TO_ADOPT [TILLER_NAMESPACE] 

نتيجة للبرنامج النصي ، يتم إنشاء إصدار RELEASE_NAME . يرتبط مع الموارد التي تم توضيح MANIFEST_FILE_TO_ADOPT ملف MANIFEST_FILE_TO_ADOPT . يتم أيضًا إنشاء مخطط CHART_NAME ، والذي يمكن استخدامه لمرافقة البيانات والإصدارات بشكل خاص.

عند إعداد بيان بالموارد ، من الضروري حذف حقول الخدمة التي تستخدمها Kubernetes (هذه بيانات خدمة ديناميكية ، وبالتالي فإنه من الخطأ إصدارها في Helm). في عالم مثالي ، يأتي التدريب في أمر واحد: kubectl get RESOURCE -o yaml --export . بعد كل شيء ، تقول الوثائق:

  --export=false: If true, use 'export' for the resources. Exported resources are stripped of cluster-specific information. 

... ولكن ، كما أثبتت الممارسة ، فإن خيار --export لا يزال --export ، لذلك ستكون هناك حاجة إلى تنسيق بيان إضافي. في بيان service/release-name-habr أدناه ، يجب عليك إزالة selfLink و selfLink .

نسخة kubectl
 $ kubectl version Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:08:12Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:00:57Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"} 

kubectl الحصول على الخدمة / الإفراج عن اسم هابر -o yaml - تصدير
 apiVersion: v1 kind: Service metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"release-name","app.kubernetes.io/managed-by":"Tiller","app.kubernetes.io/name":"habr","helm.sh/chart":"habr-0.1.0"},"name":"release-name-habr","namespace":"default"},"spec":{"ports":[{"name":"http","port":80,"protocol":"TCP","targetPort":"http"}],"selector":{"app.kubernetes.io/instance":"release-name","app.kubernetes.io/name":"habr"},"type":"ClusterIP"}} creationTimestamp: null labels: app.kubernetes.io/instance: release-name app.kubernetes.io/managed-by: Tiller app.kubernetes.io/name: habr helm.sh/chart: habr-0.1.0 name: release-name-habr selfLink: /api/v1/namespaces/default/services/release-name-habr spec: ports: - name: http port: 80 protocol: TCP targetPort: http selector: app.kubernetes.io/instance: release-name app.kubernetes.io/name: habr sessionAffinity: None type: ClusterIP status: loadBalancer: {} 

فيما يلي أمثلة لاستخدام البرنامج النصي. يوضح كلاهما كيفية استخدام البرنامج النصي لاعتماد موارد تعمل في الكتلة وحذفها لاحقًا باستخدام أدوات Helm.

مثال 1




مثال 2




الخاتمة


يمكن وضع اللمسات الأخيرة على الحل الموصوف في المقالة واستخدامها ليس فقط لاعتماد موارد Kubernetes من نقطة الصفر ، ولكن أيضًا لإضافتها إلى الإصدارات الحالية.

في الوقت الحالي ، لا توجد حلول تتيح الاستيلاء على الموارد الموجودة في المجموعة ، ونقلها إلى إدارة هيلم. من الممكن أن يتم تطبيق حل في Helm 3 يغطي هذه المشكلة (على الأقل يوجد اقتراح حول هذا الموضوع).

PS


بخلاف دورة نصائح وحيل K8s:


اقرأ أيضًا في مدونتنا:

Source: https://habr.com/ru/post/ar441964/


All Articles