هيلم سان گڏ ڪيترن ئي ڪبرنيٽس ڪلسٽرن ۾ ايپليڪيشنن کي ترتيب ڏيو

ڪھڙيءَ طرح Dailymotion ڪبرنيٽس استعمال ڪري ٿو: ايپليڪيشن ڊپلائيمينٽ

اسان Dailymotion تي 3 سال اڳ پيداوار ۾ ڪبرنيٽس استعمال ڪرڻ شروع ڪيو. پر ڪيترن ئي ڪلسترن تي ايپليڪيشنن کي ترتيب ڏيڻ مزيدار آهي، تنهن ڪري گذريل ڪجهه سالن کان اسان ڪوشش ڪري رهيا آهيون ته اسان جا اوزار ۽ ڪم فلو بهتر ڪن.

ڪٿان شروع ٿيو

هتي اسان اهو احوال ڪنداسين ته ڪيئن اسان پنهنجي ايپليڪيشنن کي پوري دنيا جي ڪيترن ئي ڪبرنيٽس ڪلسٽرن ۾ ترتيب ڏيون ٿا.

هڪ ئي وقت ڪيترن ئي ڪبرنيٽس شين کي ترتيب ڏيڻ لاءِ، اسان استعمال ڪندا آهيون هيلمٽ، ۽ اسان جا سڀئي چارٽ هڪ گٽ مخزن ۾ محفوظ ٿيل آهن. ڪيترن ئي خدمتن مان مڪمل ايپليڪيشن اسٽيڪ کي ترتيب ڏيڻ لاءِ، اسان استعمال ڪريون ٿا نام نهاد خلاصو چارٽ. لازمي طور تي، هي هڪ چارٽ آهي جيڪو انحصار جو اعلان ڪري ٿو ۽ توهان کي API ۽ ان جي خدمتن کي هڪ حڪم سان شروع ڪرڻ جي اجازت ڏئي ٿو.

اسان چيڪ ڪرڻ، چارٽ ٺاهڻ، راز شامل ڪرڻ، ۽ ايپليڪيشنن کي ترتيب ڏيڻ لاءِ هيلم جي مٿي تي هڪ ننڍڙو پٿون اسڪرپٽ پڻ لکيو. اهي سڀئي ڪم مرڪزي CI پليٽ فارم تي هڪ ڊاکر تصوير استعمال ڪندي ڪيا ويا آهن.

اچو ته ڳالهه ڏانهن وڃو.

نوٽ. جيئن توهان هن کي پڙهيو، هيلم 3 لاءِ پهريون رليز اميدوار اڳ ۾ ئي اعلان ڪيو ويو آهي. مکيه ورزن ۾ ڪجهه مسئلن کي حل ڪرڻ لاءِ سڌارن جي مڪمل ميزباني شامل آهي جن کي اسان ماضي ۾ منهن ڏنو آهي.

چارٽ ڊولپمينٽ ورڪ فلو

اسان ايپليڪيشنن لاءِ برانچنگ استعمال ڪريون ٿا، ۽ اسان چارٽ تي ساڳيو طريقو لاڳو ڪرڻ جو فيصلو ڪيو.

  • شاخ شيطان چارٽ ٺاھڻ لاءِ استعمال ڪيو ويو جيڪي ڊولپمينٽ ڪلستر تي آزمايا ويندا.
  • جڏهن هڪ ڇڪڻ جي درخواست جمع ڪئي وئي آهي رکن ٿا، اهي اسٽيجنگ ۾ چيڪ ڪيا ويا آهن.
  • آخرڪار، اسان برانچ ۾ تبديلين کي انجام ڏيڻ لاء پل درخواست ٺاهي prod ۽ ان کي پيداوار ۾ لاڳو ڪريو.

هر ماحول جو پنهنجو ذاتي مخزن آهي جيڪو اسان جي چارٽس کي محفوظ ڪري ٿو، ۽ اسين استعمال ڪريون ٿا چارٽ ميوزيم تمام مفيد APIs سان. انهي طريقي سان اسان ماحول جي وچ ۾ سخت اڪيلائي کي يقيني بڻايون ٿا ۽ انهن جي پيداوار ۾ استعمال ڪرڻ کان پهريان چارٽ جي حقيقي دنيا جي جانچ.

مختلف ماحول ۾ چارٽ مخزن

اهو سمجهڻ جي قابل آهي ته جڏهن ڊولپرز هڪ ديو شاخ کي ڌڪيندا آهن، انهن جي چارٽ جو هڪ نسخو خودڪار طور تي ديو چارٽ ميوزيم ڏانهن ڌڪيو ويندو آهي. اهڙيء طرح، سڀ ڊولپر ساڳيا ديو مخزن کي استعمال ڪندا آهن، ۽ توهان کي احتياط سان توهان جي چارٽ جو نسخو بيان ڪرڻ جي ضرورت آهي ته جيئن غلط طور تي ڪنهن ٻئي جي تبديلين کي استعمال نه ڪيو وڃي.

ان کان علاوه، اسان جي ننڍڙي پٿون اسڪرپٽ ڪبرنيٽس جي شين کي استعمال ڪندي ڪبرنيٽس OpenAPI وضاحتن جي خلاف تصديق ڪري ٿي. ڪبيوالچارٽ ميوزيم تي شايع ڪرڻ کان اڳ.

چارٽ ڊولپمينٽ ورڪ فلو جي عام وضاحت

  1. وضاحت جي مطابق پائپ لائن جي ڪم کي ترتيب ڏيڻ gazr.io معيار جي ڪنٽرول لاء (لنٽ، يونٽ ٽيسٽ).
  2. Python اوزارن سان گڏ هڪ ڊاکر تصوير کي ڇڪيو جيڪو اسان جي ايپليڪيشنن کي ترتيب ڏئي ٿو.
  3. شاخ جي نالي سان ماحول کي ترتيب ڏيڻ.
  4. Kubeval استعمال ڪندي Kubernetes yaml فائلن کي درست ڪرڻ.
  5. خودڪار طور تي چارٽ جي ورزن کي وڌايو ۽ ان جي والدين چارٽس (چارٽ جيڪي تبديل ٿيل چارٽ تي منحصر آھن).
  6. ھڪڙي چارٽ ميوزيم ڏانھن ھڪڙو چارٽ جمع ڪرڻ جيڪو پنھنجي ماحول سان ملندو آھي

ڪلسترن ۾ فرق کي منظم ڪرڻ

فيڊريشن آف ڪلسٽرز

هڪ وقت هو جڏهن اسان استعمال ڪندا هئاسين فيڊريشن آف ڪبرنيٽس ڪلستر، جتي ڪبرنيٽس شيون هڪ واحد API جي آخري پوائنٽ مان اعلان ڪري سگھجن ٿيون. پر مسئلا پيدا ٿيا. مثال طور، ڪجهه ڪبرنيٽس شيون فيڊريشن جي آخري نقطي ۾ ٺاهي نه ٿي سگهيون، ان ڪري انفرادي ڪلسٽرز لاءِ فيڊريٽ ٿيل شيون ۽ ٻيون شيون برقرار رکڻ ڏکيو ٿي پيو.

مسئلو حل ڪرڻ لاءِ، اسان ڪلسٽرن کي آزاديءَ سان منظم ڪرڻ شروع ڪيو، جنهن عمل کي تمام گهڻو آسان ڪيو (اسان وفاق جو پهريون نسخو استعمال ڪيو؛ ٻيو ڪجهه تبديل ٿي سگهي ٿو).

جيو ورهايل پليٽ فارم

اسان جو پليٽ فارم هن وقت 6 علائقن ۾ ورهايل آهي - 3 مقامي ۽ 3 ڪلائوڊ ۾.


تقسيم ٿيل تقسيم

گلوبل هيلم قدر

4 عالمي هيلم قدر توهان کي ڪلستر جي وچ ۾ فرق جي نشاندهي ڪرڻ جي اجازت ڏين ٿا. اسان جا سڀئي چارٽ ڊفالٽ گھٽ ۾ گھٽ قدر آھن.

global:
  cloud: True
  env: staging
  region: us-central1
  clusterName: staging-us-central1

عالمي قدر

اهي قدر اسان جي ايپليڪيشنن جي حوالي سان وضاحت ڪرڻ ۾ مدد ڪن ٿا ۽ مختلف مقصدن لاءِ استعمال ڪيا ويا آهن: مانيٽرنگ، ٽريڪنگ، لاگنگ، خارجي ڪالون ٺاهڻ، اسڪيلنگ وغيره.

  • "Cloud": اسان وٽ هڪ هائبرڊ ڪبرنيٽس پليٽ فارم آهي. مثال طور، اسان جي API کي GCP زونن ۽ اسان جي ڊيٽا سينٽرن ۾ لڳايو ويو آهي.
  • "env": ڪجھ قدر غير پيداوار واري ماحول لاءِ تبديل ٿي سگھن ٿا. مثال طور، وسيلن جي وصف ۽ خودڪار اسڪيلنگ ترتيب.
  • "علائقو": ھي معلومات ڪلستر جي جڳھ کي طئي ڪرڻ ۾ مدد ڪري ٿي ۽ خارجي خدمتن لاء ويجھي آخري پوائنٽ کي طئي ڪرڻ لاء استعمال ڪري سگھجي ٿو.
  • "clusterName": جيڪڏهن ۽ جڏهن اسان هڪ فرد ڪلستر لاءِ قدر جو تعين ڪرڻ چاهيون ٿا.

هتي هڪ خاص مثال آهي:

{{/* Returns Horizontal Pod Autoscaler replicas for GraphQL*/}}
{{- define "graphql.hpaReplicas" -}}
{{- if eq .Values.global.env "prod" }}
{{- if eq .Values.global.region "europe-west1" }}
minReplicas: 40
{{- else }}
minReplicas: 150
{{- end }}
maxReplicas: 1400
{{- else }}
minReplicas: 4
maxReplicas: 20
{{- end }}
{{- end -}}

هيلم ٽيمپليٽ مثال

هي منطق ڪبرنيٽس YAML کي ڇڪڻ کان بچڻ لاءِ مددگار ٽيمپليٽ ۾ بيان ڪيو ويو آهي.

درخواست جو اعلان

اسان جا ٺاھڻ جا اوزار ڪيترن ئي YAML فائلن تي ٻڌل آھن. هيٺ ڏنل هڪ مثال آهي ته اسان هڪ خدمت ۽ ان جي اسڪيلنگ ٽوپولوجي کي ڪلستر ۾ ڪيئن بيان ڪريون ٿا.

releases:
  - foo.world

foo.world:                # Release name
  services:               # List of dailymotion's apps/projects
    foobar:
      chart_name: foo-foobar
      repo: [email protected]:dailymotion/foobar
      contexts:
        prod-europe-west1:
          deployments:
            - name: foo-bar-baz
              replicas: 18
            - name: another-deployment
              replicas: 3

خدمت جي تعريف

هي انهن سڀني مرحلن جو هڪ خاڪو آهي جيڪو اسان جي مقرري واري ڪم جي فلو کي بيان ڪري ٿو. آخري مرحلو ايپليڪيشن کي گڏ ڪري ٿو ڪيترن ئي ڪارڪنن جي ڪلسٽرن ۾ هڪ ئي وقت.


جينڪنز جي مقرري جا مرحلا

رازن بابت ڇا؟

سيڪيورٽي جي حوالي سان، اسان مختلف هنڌن کان سڀني رازن کي ٽريڪ ڪندا آهيون ۽ انهن کي هڪ منفرد والٽ ۾ محفوظ ڪندا آهيون نقص پيرس ۾.

اسان جا ڊيپلائيمينٽ ٽولز Vault مان ڳجهي قيمتون ڪڍن ٿا ۽، جڏهن ڊيپلائيمينٽ جو وقت اچي ٿو، انهن کي هيلم ۾ داخل ڪريو.

ائين ڪرڻ لاءِ، اسان والٽ ۾ موجود رازن ۽ رازن جي وچ ۾ نقشن جي وضاحت ڪئي آھي جيڪي اسان جي ايپليڪيشنن کي گهربل آھن:

secrets:                                                                                                                                                                                                        
     - secret_id: "stack1-app1-password"                                                                                                                                                                                  
       contexts:                                                                                                                                                                                                   
         - name: "default"                                                                                                                                                                                         
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"                                                                                                                                                                                    
         - name: "cluster1"                                                                                                                                                                           
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"

  • اسان وائلٽ ۾ رازن کي رڪارڊ ڪرڻ وقت پيروي ڪرڻ لاءِ عام قاعدن جي وضاحت ڪئي آهي.
  • جيڪڏهن راز لاڳو ٿئي ٿو ڪنهن خاص حوالي يا ڪلستر ڏانهن، توهان کي هڪ مخصوص داخلا شامل ڪرڻ جي ضرورت آهي. (هتي ڪلستر 1 جي حوالي سان ڳجهي اسٽيڪ-ايپ 1-پاسورڊ لاءِ پنهنجي قيمت آهي).
  • ٻي صورت ۾ قدر استعمال ڪيو ويندو آهي ڊفالٽ طرفان.
  • هن فهرست ۾ هر شيء لاء Kubernetes راز هڪ اهم-قدر جوڙو داخل ڪيو ويو آهي. تنهن ڪري، اسان جي چارٽس ۾ ڳجهي ٽيمپليٽ تمام سادي آهي.

apiVersion: v1
data:
{{- range $key,$value := .Values.secrets }}
  {{ $key }}: {{ $value | b64enc | quote }}
{{ end }}
kind: Secret
metadata:
  name: "{{ .Chart.Name }}"
  labels:
    chartVersion: "{{ .Chart.Version }}"
    tillerVersion: "{{ .Capabilities.TillerVersion.SemVer }}"
type: Opaque

مسئلا ۽ حدون

ڪيترن ئي ذخيرو سان ڪم ڪرڻ

هاڻي اسان چارٽ ۽ ايپليڪيشنن جي ترقي کي الڳ ڪريون ٿا. هن جو مطلب اهو آهي ته ڊولپرز کي ٻن گٽ مخزن ۾ ڪم ڪرڻو پوندو: هڪ ايپليڪيشن لاءِ، ۽ ٻيو ڪبرنيٽس ڏانهن ان جي مقرري جي وضاحت ڪرڻ لاءِ. 2 git repositories جو مطلب آھي 2 workflows، ۽ اھو آسان آھي ھڪڙي نئين لاءِ پريشان ٿيڻ.

عام چارٽ کي منظم ڪرڻ هڪ پريشاني آهي

جيئن ته اسان اڳ ۾ ئي چيو آهي، عام چارٽ انحصار کي سڃاڻڻ ۽ جلدي ڪيترن ئي ايپليڪيشنن کي ترتيب ڏيڻ لاء تمام ڪارائتو آهن. پر اسان استعمال ڪريون ٿا --reuse-valuesهر دفعي سڀني قدرن کي پاس ڪرڻ کان بچڻ لاءِ جڏهن اسان هڪ ايپليڪيشن ترتيب ڏيون ٿا جيڪا هن عام چارٽ جو حصو آهي.

مسلسل پهچائڻ واري ڪم جي فلو ۾، اسان وٽ صرف ٻه قدر آهن جيڪي باقاعده تبديل ڪندا آهن: نقلن جو تعداد ۽ تصويري ٽيگ (نسخ). ٻيا، وڌيڪ مستحڪم قدر دستي طور تي تبديل ڪيا ويا آهن، ۽ اهو ڪافي ڏکيو آهي. ان کان علاوه، هڪ عام چارٽ کي ترتيب ڏيڻ ۾ هڪ غلطي سنگين ناڪامين جي ڪري سگھي ٿي، جيئن اسان اسان جي پنهنجي تجربي مان ڏٺو آهي.

ڪيترن ئي ترتيب واري فائلن کي اپڊيٽ ڪرڻ

جڏهن هڪ ڊولپر هڪ نئين ايپليڪيشن شامل ڪري ٿو، هن کي ڪيترن ئي فائلن کي تبديل ڪرڻو پوندو: ايپليڪيشن جو اعلان، رازن جي فهرست، ايپليڪيشن کي انحصار جي طور تي شامل ڪرڻ جيڪڏهن اهو عام چارٽ ۾ شامل آهي.

والٽ ۾ جينڪنز جون اجازتون تمام گهڻيون آهن

هاڻي اسان وٽ هڪ آهي AppRole، جيڪو والٽ مان سڀ راز پڙهي ٿو.

rollback عمل خودڪار نه آهي

رول بيڪ ڪرڻ لاء، توهان کي ڪيترن ئي ڪلستر تي حڪم هلائڻ جي ضرورت آهي، ۽ اهو غلطين سان ڀريل آهي. اسان هن آپريشن کي دستي طور تي انجام ڏيون ٿا انهي کي يقيني بڻائڻ لاءِ ته صحيح ورزن ID بيان ڪيل آهي.

اسان GitOps ڏانهن وڌي رهيا آهيون

اسان جو مقصد

اسان چارٽ کي واپس ڪرڻ چاهيون ٿا ايپليڪيشن جي مخزن ڏانهن جيڪو اهو ترتيب ڏئي ٿو.

ڪم فلو ساڳيو ٿيندو جيئن ترقي لاء. مثال طور، جڏهن هڪ شاخ ماسٽر ڏانهن ڌڪيو ويندو آهي، تعیناتي خودڪار طريقي سان شروع ٿي ويندي. هن طريقي ۽ موجوده ڪم جي فلو جي وچ ۾ بنيادي فرق اهو هوندو هر شي کي git ۾ منظم ڪيو ويندو (اپليڪيشن پاڻ ۽ اهو طريقو ڪبرنيٽس ۾ لڳايو ويو آهي).

اتي ڪيترائي فائدا آھن:

  • گهڻو وڌيڪ صاف ڊولپر لاء. اهو سکڻ آسان آهي ته مقامي چارٽ ۾ تبديلين کي ڪيئن لاڳو ڪجي.
  • خدمت جي مقرري جي تعريف بيان ڪري سگهجي ٿي ڪوڊ جي طور تي ساڳي جڳهه خدمت.
  • عام ٿيل چارٽ کي ختم ڪرڻ جو انتظام. خدمت کي ان جي پنهنجي هيلم رليز هوندي. اهو توهان کي اجازت ڏيندو ته ايپليڪيشن لائف سائيڪل (رول بيڪ، اپ گريڊ) کي ننڍي سطح تي منظم ڪري، جيئن ٻين خدمتن کي متاثر نه ڪري.
  • گيت جا فائدا چارٽ مئنيجمينٽ لاءِ: تبديلين کي واپس ڪريو، آڊٽ لاگ، وغيره. جيڪڏھن توھان کي چارٽ ۾ تبديلي کي رد ڪرڻ جي ضرورت آھي، توھان ھي ڪري سگھوٿا git استعمال ڪندي. لڳائڻ خودڪار طريقي سان شروع ٿئي ٿو.
  • توھان غور ڪري سگھوٿا توھان جي ترقياتي ڪم جي فلو کي بھترين اوزارن سان اسڪافولڊ، جنهن سان ڊولپرز پيداوار جي ويجهو هڪ حوالي سان تبديلين جي جانچ ڪري سگهن ٿا.

ٻه قدم لڏپلاڻ

اسان جا ڊولپر هن ورڪ فلو کي 2 سالن کان استعمال ڪري رهيا آهن، تنهنڪري اسان چاهيون ٿا ته لڏپلاڻ ممڪن طور تي بي درد هجي. تنهن ڪري، اسان مقصد جي رستي تي هڪ وچولي قدم شامل ڪرڻ جو فيصلو ڪيو.
پهريون مرحلو سادو آهي:

  • اسان ايپليڪيشن جي ترتيب کي ترتيب ڏيڻ لاء هڪ جهڙي جوڙجڪ رکون ٿا، پر هڪ واحد اعتراض ۾ جنهن کي DailymotionRelease سڏيو ويندو آهي.

apiVersion: "v1"
kind: "DailymotionRelease"
metadata:
  name: "app1.ns1"
  environment: "dev"
  branch: "mybranch"
spec:
  slack_channel: "#admin"
  chart_name: "app1"
  scaling:
    - context: "dev-us-central1-0"
      replicas:
        - name: "hermes"
          count: 2
    - context: "dev-europe-west1-0"
      replicas:
        - name: "app1-deploy"
          count: 2
  secrets:
    - secret_id: "app1"
      contexts:
        - name: "default"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"
        - name: "dev-europe-west1-0"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"

  • 1 رليز في ايپليڪيشن (عام چارٽ کان سواء).
  • اپليڪيشن جي گٽ مخزن ۾ چارٽس.

اسان سڀني ڊولپرز سان ڳالهايو آهي، تنهنڪري لڏپلاڻ وارو عمل اڳ ۾ ئي شروع ٿي چڪو آهي. پهرين اسٽيج اڃا تائين CI پليٽ فارم استعمال ڪندي ڪنٽرول آهي. مان ٻئي پوسٽ جلد ئي ٻئي مرحلي بابت لکندس: ڪيئن اسان هڪ GitOps ورڪ فلو ڏانهن منتقل ڪيو وهڪري. مان توهان کي ٻڌايان ٿو ته اسان هر شي کي ڪيئن سيٽ ڪيو ۽ اسان کي ڪهڙي مشڪلاتن جو سامنا ڪيو (گهڻن مخزن، راز، وغيره). خبرن جي تابعداري ڪريو.

هتي اسان گذريل سالن ۾ ايپليڪيشن جي ترتيب واري ڪم جي فلو ۾ اسان جي ترقي کي بيان ڪرڻ جي ڪوشش ڪئي آهي، جنهن جي باري ۾ خيالن جي ڏي وٺ ڪئي وئي GitOps طريقي سان. اسان اڃا تائين مقصد تي پهچي نه سگهيا آهيون ۽ نتيجن تي رپورٽ ڪنداسين، پر هاڻي اسان کي يقين آهي ته اسان صحيح ڪم ڪيو جڏهن اسان هر شي کي آسان ڪرڻ جو فيصلو ڪيو ۽ ان کي ڊولپرز جي عادتن جي ويجهو آڻڻ جو فيصلو ڪيو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو