ڪبرنيٽس جا ٽوٽڪا ۽ ترڪيبون: مقامي ترقي ۽ ٽيلي پريزنس بابت

ڪبرنيٽس جا ٽوٽڪا ۽ ترڪيبون: مقامي ترقي ۽ ٽيلي پريزنس بابت

اسان کي ڪبرنيٽس ۾ مائڪرو سروسز کي ترقي ڪرڻ بابت وڌ ۾ وڌ پڇيو وڃي ٿو. ڊولپرز، خاص طور تي تشريح ڪيل ٻولين جا، پنھنجي پسنديده IDE ۾ ڪوڊ کي تڪڙو درست ڪرڻ چاھيو ٿا ۽ بغير تعمير/تعمير جي انتظار کان سواءِ نتيجو ڏسو - صرف F5 کي دٻائڻ سان. ۽ جڏهن اهو هڪ واحد ايپليڪيشن تي آيو، اهو مقامي طور تي ڊيٽابيس ۽ ويب سرور کي نصب ڪرڻ لاء ڪافي هو (ڊاڪر، ورچوئل بڪس ۾ ...)، ۽ پوء فوري طور تي ترقي جو مزو وٺو. monoliths جي microservices ۾ ڪٽڻ ۽ Kubernetes جي اچڻ سان، هڪ ٻئي تي انحصار جي ظاهر ٿيڻ سان، هر شيء اهو ٿورو وڌيڪ ڏکيو ٿي ويو. انهن مان وڌيڪ microservices، وڌيڪ مسئلا. ٻيهر ترقي جو مزو وٺڻ لاءِ، توهان کي هڪ يا ٻه کان وڌيڪ ڊڪر ڪنٽينر کڻڻا پوندا، ۽ ڪڏهن ڪڏهن درجن کان به وڌيڪ... عام طور تي، اهو سڀ ڪجهه گهڻو وقت وٺي سگهي ٿو، ڇاڪاڻ ته ان کي پڻ اپڊيٽ رکڻو پوندو. .

مختلف وقتن تي اسان مسئلي جي مختلف حلن جي ڪوشش ڪئي. ۽ مان شروع ڪندس گڏ ڪيل ڪم ڪارن سان يا صرف ”بيچين“ سان.

1. ڪچي

اڪثر IDEs وٽ FTP/SFTP استعمال ڪندي ڪوڊ سڌو سنئون سرور تي ايڊٽ ڪرڻ جي صلاحيت هوندي آهي. اهو رستو تمام واضح آهي ۽ اسان فوري طور تي ان کي استعمال ڪرڻ جو فيصلو ڪيو. ان جو جوهر هيٺين ريت آهي:

  1. پوڊ آف ڊولپمينٽ ماحوليات (dev/review) ۾، هڪ اضافي ڪنٽينر شروع ڪيو ويو آهي SSH رسائي سان ۽ ڊولپر جي عوامي SSH ڪيچ کي اڳتي وڌائڻ جيڪو ايپليڪيشن کي انجام ڏيندو / ترتيب ڏيندو.
  2. شروعاتي اسٽيج تي (ڪنٽينر اندر prepare-app) ڏانهن ڪوڊ منتقل ڪريو emptyDirايپليڪيشن ڪنٽينرز ۽ SSH سرور کان ڪوڊ تائين رسائي حاصل ڪرڻ لاء.

ڪبرنيٽس جا ٽوٽڪا ۽ ترڪيبون: مقامي ترقي ۽ ٽيلي پريزنس بابت

اهڙي منصوبي جي ٽيڪنيڪل عمل کي بهتر سمجهڻ لاءِ، مان ڪبرنيٽس ۾ شامل YAML ترتيبن جا ٽڪرا مهيا ڪندس.

ترتيبون

1.1. values.yaml

ssh_pub_key:
  vasya.pupkin: <ssh public key in base64> 

اهو آهي vasya.pupkin variable جو قدر آهي ${GITLAB_USER_LOGIN}.

1.2. deployment.yaml

...
{{ if eq .Values.global.debug "yes" }}
      volumes:
      - name: ssh-pub-key
        secret:
          defaultMode: 0600
          secretName: {{ .Chart.Name }}-ssh-pub-key
      - name: app-data
        emptyDir: {}
      initContainers:
      - name: prepare-app
{{ tuple "backend" . | include "werf_container_image" | indent 8 }}
        volumeMounts:
        - name: app-data
          mountPath: /app-data
        command: ["bash", "-c", "cp -ar /app/* /app-data/" ]
{{ end }}
      containers:
{{ if eq .Values.global.debug "yes" }}
      - name: ssh
        image: corbinu/ssh-server
        volumeMounts:
        - name: ssh-pub-key
          readOnly: true
          mountPath: /root/.ssh/authorized_keys
          subPath: authorized_keys
        - name: app-data
          mountPath: /app
        ports:
        - name: ssh
          containerPort: 22
          protocol: TCP
{{ end }}
      - name: backend
        volumeMounts:
{{ if eq .Values.global.debug "yes" }}
        - name: app-data
          mountPath: /app
{{ end }}
        command: ["/usr/sbin/php-fpm7.2", "--fpm-config", "/etc/php/7.2/php-fpm.conf", "-F"]
...

1.3. secret.yaml

{{ if eq .Values.global.debug "yes" }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .Chart.Name }}-ssh-pub-key
type: Opaque
data:
  authorized_keys: "{{ first (pluck .Values.global.username .Values.ssh_pub_key) }}"
{{ end }}

آخري رابطي

ان کان پوء باقي رهي ٿو منتقل ڪرڻ لاء گهربل gitlab-ci.yml متغير:

dev:
  stage: deploy
  script:
   - type multiwerf && source <(multiwerf use 1.0 beta)
   - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
   - werf deploy
     --namespace ${CI_PROJECT_NAME}-stage
     --set "global.env=stage"
     --set "global.git_rev=${CI_COMMIT_SHA}"
     --set "global.debug=yes"
     --set "global.username=${GITLAB_USER_LOGIN}"
 tags:
   - build

Voila: ڊولپر جيڪو ڊولپمينٽ شروع ڪيو سروس جي نالي سان ڳنڍي سگھي ٿو (ڪيئن محفوظ طور تي ڪلستر تائين رسائي فراهم ڪرڻ، اسان اڳ ۾ ئي ٻڌايو آهي) توهان جي ڊيسڪ ٽاپ تان SFTP ذريعي ۽ ڪوڊ کي ايڊٽ ڪريو بغير ان جي ڪلستر تائين پهچائڻ جو انتظار ڪريو.

اهو هڪ مڪمل طور تي ڪم ڪندڙ حل آهي، پر عمل درآمد جي نقطي نظر کان ان جا واضح نقصان آهن:

  • هيلم چارٽ کي بهتر ڪرڻ جي ضرورت آهي، جيڪو مستقبل ۾ پڙهڻ ڏکيو آهي؛
  • صرف ان شخص طرفان استعمال ڪري سگھجي ٿو جيڪو خدمت کي ترتيب ڏنو؛
  • توهان کي ياد رکڻ جي ضرورت آهي ته پوءِ ان کي ڪوڊ سان مقامي ڊاريڪٽري سان هم وقت سازي ڪريو ۽ ان کي گيٽ سان انجام ڏيو.

2. ٽيليفون

پروجيڪٽ ٽيلي ويزن ڪافي عرصي کان سڃاتل آھي، پر اسان، جيئن چوندا آھن ته، "ان کي عملي طور تي سنجيدگيءَ سان ڪوشش ڪرڻ جي آس پاس نه ٿي سگھيا." بهرحال، مطالبو پنهنجو ڪم ڪري چڪو آهي ۽ هاڻي اسان کي پنهنجو تجربو شيئر ڪرڻ ۾ خوشي ٿي آهي، جيڪا شايد اسان جي بلاگ جي پڙهندڙن لاءِ ڪارآمد ٿي سگهي ٿي - خاص ڪري جڏهن ته هن وقت تائين حب تي ٽيليپريسنس بابت ٻيو ڪو به مواد موجود ناهي.

مختصر ۾، سڀڪنھن شيء کي ايترو خوفناڪ نه ٿي نڪتو. اسان سڀني ڪارناما رکيا آهن جن کي ڊولپر جي حصي تي عمل ڪرڻ جي ضرورت آهي هيلم چارٽ ٽيڪسٽ فائل ۾ سڏيو ويندو آهي NOTES.txt. اهڙيء طرح، Kubernetes تي خدمت کي ترتيب ڏيڻ کان پوء، ڊولپر GitLab نوڪري لاگ ۾ مقامي ديو ماحول کي شروع ڪرڻ لاء هدايتون ڏسي ٿو:

!!! Разработка сервиса локально, в составе Kubernetes !!!

* Настройка окружения
* * Должен быть доступ до кластера через VPN
* * На локальном ПК установлен kubectl ( https://kubernetes.io/docs/tasks/tools/install-kubectl/ )
* * Получить config-файл для kubectl (скопировать в ~/.kube/config)
* * На локальном ПК установлен telepresence ( https://www.telepresence.io/reference/install )
* * Должен быть установлен Docker
* * Необходим доступ уровня reporter или выше к репозиторию https://gitlab.site.com/group/app
* * Необходимо залогинится в registry с логином/паролем от GitLab (делается один раз):

#########################################################################
docker login registry.site.com
#########################################################################

* Запуск окружения

#########################################################################
telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name  }}:backend --mount=/tmp/app --docker-run -v `pwd`:/app -v /tmp/app/var/run/secrets:/var/run/secrets -ti registry.site.com/group/app/backend:v8
#########################################################################

اسان هن هدايت ۾ بيان ڪيل قدمن تي تفصيل سان نه رهنداسين... آخري هڪ جي استثنا سان. Telepresence جي لانچ دوران ڇا ٿيندو؟

Telepresence سان ڪم ڪرڻ

شروع ڪرڻ تي (مٿي ڏنل هدايتن ۾ بيان ڪيل آخري حڪم استعمال ڪندي)، اسان سيٽ ڪيو:

  • نالي جي جاءِ جنهن ۾ مائڪرو سروس هلي رهي آهي؛
  • تعیناتي ۽ ڪنٽينر جا نالا جيڪي اسان داخل ڪرڻ چاهيون ٿا.

باقي دليل اختياري آهن. جيڪڏهن اسان جي خدمت ڪبرنيٽس API سان ۽ ان لاءِ رابطو ڪري ٿي سروس اڪائونٽ ٺاهي وئي، اسان کي اسان جي ڊيسڪ ٽاپ تي سرٽيفڪيٽ/ ٽوڪن کي نصب ڪرڻ جي ضرورت آهي. هن کي ڪرڻ لاء، اختيار استعمال ڪريو --mount=true (يا --mount=/dst_path)، جيڪو اسان جي ڊيسڪ ٽاپ تي ڪبرنيٽس ڪنٽينر کان روٽ (/) کي نصب ڪندو. ان کان پوء، اسان ڪري سگھون ٿا (او ايس تي منحصر ڪري ٿو ۽ ايپليڪيشن ڪيئن شروع ٿئي ٿي) ڪلستر مان "ڪيز" استعمال ڪريو.

پهرين، اچو ته ڏسو سڀ کان وڌيڪ آفاقي اختيار هڪ ايپليڪيشن هلائڻ لاءِ - هڪ ڊڪر ڪنٽينر ۾. هن کي ڪرڻ لاء اسان کي استعمال ڪندا سين --docker-run ۽ ڊاريڪٽري کي ڪوڊ سان گڏ ڪنٽينر ۾ لڳايو: -v `pwd`:/app

مهرباني ڪري نوٽ ڪريو ته اهو فرض ڪري ٿو پروجيڪٽ ڊاريڪٽري مان. ايپليڪيشن ڪوڊ ڊاريڪٽري ۾ نصب ڪيو ويندو /app هڪ ڪنٽينر ۾.

اڳيون: -v /tmp/app/var/run/secrets:/var/run/secrets - ڊاريڪٽري کي سرٽيفڪيٽ/ٽوڪن سان گڏ ڪنٽينر ۾ نصب ڪرڻ لاءِ.

هي اختيار آخرڪار تصوير جي پٺيان آهي جنهن ۾ ايپليڪيشن هلندي. NB: جڏهن هڪ تصوير ٺاهي، توهان کي وضاحت ڪرڻ گهرجي CMD يا ENTRYPOINT!

واقعي اڳتي ڇا ٿيندو؟

  • Kubernetes ۾، مخصوص ڊيپلائيمينٽ لاءِ، نقلن جو تعداد 0 ۾ تبديل ڪيو ويندو. ان جي بدران، ھڪ نئين ڊيپلائيمينٽ شروع ڪئي ويندي - ھڪ متبادل ڪنٽينر سان backend.
  • 2 ڪنٽينر ڊيسڪٽاپ تي لانچ ٿيندا: پهريون ٽيليپريسينس سان (اهو پراڪسي درخواستن کي / کان ڪبرنيٽس تائين ڏيندو)، ٻيو ايپليڪيشن سان ترقي ڪئي پئي وڃي.
  • جيڪڏهن اسان ايپليڪيشن سان گڏ ڪنٽينر ۾ عمل ڪريون ٿا، ته پوءِ هيلم طرفان منتقل ڪيل سڀئي ENV متغير اسان وٽ دستياب هوندا، ۽ سڀئي خدمتون پڻ دستياب هونديون. باقي اهو آهي ته توهان جي پسنديده IDE ۾ ڪوڊ ايڊٽ ڪريو ۽ نتيجو مزو ڪريو.
  • ڪم جي آخر ۾، توهان کي صرف ٽرمينل کي بند ڪرڻ جي ضرورت آهي جنهن ۾ Telepresence هلي رهي آهي (سيشن کي Ctrl+C سان ختم ڪريو) - ڊاکر ڪنٽينرز ڊيسڪ ٽاپ تي بند ٿي ويندا، ۽ ڪبرنيٽس ۾ هر شيء پنهنجي شروعاتي حالت ڏانهن موٽندي. باقي اهو آهي ته ڪم ڪرڻ، ايم آر کي جاري ڪريو ۽ ان کي جائزو وٺڻ/ضم ڪرڻ/... (توهان جي ڪم جي فلوز تي منحصر آهي).

جيڪڏهن اسان ڊاڪر ڪنٽينر ۾ ايپليڪيشن کي هلائڻ نٿا چاهيون - مثال طور، اسان پي ايڇ پي ۾ نه، پر گو ۾ ترقي ڪريون ٿا، ۽ اڃا به ان کي مقامي طور تي ٺاهيون ٿا - ٽيليپريسنس لانچ ڪرڻ اڃا به آسان ٿيندو:

telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name  }}:backend --mount=true

جيڪڏهن ايپليڪيشن Kubernetes API تائين رسائي حاصل ڪري ٿي، توهان کي ڪيچ ڊاريڪٽري کي نصب ڪرڻ جي ضرورت پوندي (https://www.telepresence.io/howto/volumes). لينڪس لاءِ هڪ افاديت آهي پاڙ:

proot -b $TELEPRESENCE_ROOT/var/run/secrets/:/var/run/secrets bash

اختيار کان سواء Telepresence لانچ ڪرڻ کان پوء --docker-run موجوده ٽرمينل ۾ سڀ ماحولياتي متغير موجود هوندا، تنهن ڪري ان ۾ اپليڪيشن شروع ٿيڻ گهرجي.

NB: استعمال ڪرڻ وقت، مثال طور، PHP، توهان کي ياد رکڻ گهرجي ته مختلف op_cache، apc ۽ ٻين تيز ڪندڙ ڊولپمينٽ لاءِ بند ڪرڻ - ٻي صورت ۾ ڪوڊ کي ايڊٽ ڪرڻ سان گهربل نتيجو نه ٿيندو.

نتيجو

ڪبرنيٽس سان مقامي ترقي هڪ مسئلو آهي جنهن جو حل هن پليٽ فارم جي پکيڙ جي تناسب ۾ وڌي رهيو آهي. ڊولپرز کان لاڳاپيل درخواستون حاصل ڪرڻ (اسان جي گراهڪن کان)، اسان انهن کي پهرين دستياب طريقن سان حل ڪرڻ شروع ڪيو، جيڪو، جيتوڻيڪ، پاڻ کي ڊگهي عرصي تائين ثابت نه ڪيو. خوشقسمتيءَ سان، اها ڳالهه واضح ٿي چڪي آهي نه رڳو هاڻي ۽ نه رڳو اسان لاءِ، تنهن ڪري وڌيڪ موزون وسيلا اڳ ۾ ئي دنيا ۾ ظاهر ٿي چڪا آهن، ۽ Telepresence انهن مان سڀ کان وڌيڪ مشهور آهي. اسڪافولڊ گوگل کان). ان کي استعمال ڪرڻ جو اسان جو تجربو اڃا ايترو وڏو نه آهي، پر اهو اڳ ۾ ئي اسان کي ان جي سفارش ڪرڻ جو سبب ڏئي ٿو اسان جي "دڪان ۾ ساٿي" - ڪوشش ڪريو!

پي ايس

ٻيا K8s ٽوٽڪا ۽ چالون سيريز مان:

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

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