د کوبرنیټس لارښوونې او چلونه: د ځایی پراختیا او ټیلی پریزنس په اړه

د کوبرنیټس لارښوونې او چلونه: د ځایی پراختیا او ټیلی پریزنس په اړه

موږ په زیاتیدونکي توګه په کبرنیټس کې د مایکرو خدماتو رامینځته کولو په اړه پوښتل شوي. پرمخ وړونکي، په ځانګړې توګه د تشریح شوي ژبو، غواړي په چټکۍ سره د دوی د خوښې IDE کې کوډ سم کړي او پایله یې د جوړولو / ځای پرځای کولو انتظار پرته وګوري - یوازې د F5 په فشارولو سره. او کله چې دا یو واحد غوښتنلیک ته راغی ، نو دا په ځایی توګه د ډیټابیس او ویب سرور نصبولو لپاره کافي و (په ډاکر ، ورچوئل بوکس ...) ، او بیا سمدلاسه د پراختیا څخه خوند واخلئ. په مایکرو سرویسونو کې د monoliths له مینځه وړلو او د Kubernetes په راتګ سره، په یو بل باندې د انحصار په څرګندیدو سره، هرڅه دا یو څه ډیر ستونزمن شو. هرڅومره چې دا کوچني خدمتونه ډیر وي ، هومره ستونزې. د بیا پراختیا څخه خوند اخیستو لپاره ، تاسو اړتیا لرئ له یو یا دوه څخه ډیر ډاکر کانټینرونه پورته کړئ ، او ځینې وختونه حتی له درجن څخه ډیر ... .

په مختلفو وختونو کې موږ د ستونزې مختلف حلونه هڅه وکړه. او زه به د راټول شوي کاري حل یا په ساده ډول "کرچچ" سره پیل وکړم.

1. کرچچه

ډیری IDEs د FTP/SFTP په کارولو سره په مستقیم سرور کې کوډ ایډیټ کولو وړتیا لري. دا لاره خورا څرګنده ده او موږ سمدلاسه پریکړه وکړه چې دا وکاروو. جوهر یې په لاندې ډول دی:

  1. د پرمختیایي چاپیریال پوډ کې (dev/review)، یو اضافي کانټینر د SSH لاسرسي سره پیل شوی او د پراختیا کونکي عامه SSH کیلي ته لیږل کیږي څوک چې غوښتنلیک ژمن / ځای په ځای کوي.
  2. په پیل کې (د کانټینر دننه prepare-app) ته کوډ انتقال کړئ emptyDirد غوښتنلیک کانټینرونو او SSH سرور څخه کوډ ته لاسرسی لپاره.

د کوبرنیټس لارښوونې او چلونه: د ځایی پراختیا او ټیلی پریزنس په اړه

د دې ډول سکیم تخنیکي پلي کولو ښه پوهیدو لپاره ، زه به په کوبرنیټس کې د شامل YAML تشکیلاتو برخې چمتو کړم.

CONFIGURACII

۱.۱. values.yaml

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

دا vasya.pupkin د متغیر ارزښت دی ${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 سره کار کول

په پیل کې (په پورته لارښوونو کې مشخص شوي وروستي کمانډ په کارولو سره) ، موږ تنظیم کوو:

  • د نوم ځای په کوم کې چې مایکرو خدمت روان دی؛
  • د ځای پرځای کولو او کانټینر نومونه چې موږ یې ننوتل غواړو.

پاتې دلیلونه اختیاري دي. که زموږ خدمت د Kubernetes API سره او د دې لپاره اړیکه ونیسي د خدماتو حساب جوړ شو، موږ اړتیا لرو په خپل ډیسټاپ کې سندونه/ټوکنونه نصب کړو. د دې کولو لپاره، اختیار وکاروئ --mount=true (يا --mount=/dst_path)، کوم چې به ریښه (/) د کوبرنیټس کانټینر څخه زموږ ډیسټاپ ته پورته کړي. له دې وروسته، موږ کولی شو (د OS پورې اړه لري او څنګه چې غوښتنلیک پیل شوی) د کلستر څخه "کیلي" وکاروو.

لومړی ، راځئ چې د غوښتنلیک چلولو لپاره ترټولو نړیوال اختیار وګورو - په ډاکر کانټینر کې. د دې کولو لپاره موږ به کیلي وکاروو --docker-run او ډایرکټر د کوډ سره په کانټینر کې نصب کړئ: -v `pwd`:/app

مهرباني وکړئ په یاد ولرئ چې دا د پروژې لارښود څخه روان دی. د غوښتنلیک کوډ به په لارښود کې نصب شي /app په یوه کانتینر کې

بله: -v /tmp/app/var/run/secrets:/var/run/secrets - د سند/ټوکن سره ډایرکټر په کانټینر کې نصب کړئ.

دا اختیار په نهایت کې د عکس لخوا تعقیب کیږي په کوم کې چې غوښتنلیک به پرمخ ځي. NB: کله چې یو انځور جوړ کړئ، تاسو باید مشخص کړئ CMD او یا ENTRYPOINT!

په حقیقت کې به څه پیښ شي؟

  • په Kubernetes کې، د ټاکل شوي ځای پرځای کولو لپاره، د نقلونو شمیر به 0 ته بدل شي. پرځای یې، یو نوی ځای پرځای کول به پیل شي - د بدیل کانټینر سره backend.
  • 2 کانټینرونه به په ډیسټاپ کې پیل شي: لومړی د Telepresence سره (دا به د کوبرنیټس څخه / ته پراکسي غوښتنه وکړي) ، دوهم د غوښتنلیک رامینځته کیدو سره.
  • که موږ د غوښتنلیک سره کانټینر ته ورسوو، نو د ګمارلو پرمهال د هیلم لخوا لیږدول شوي ټول ENV تغیرات به موږ ته شتون ولري، او ټول خدمتونه به هم شتون ولري. ټول هغه څه چې پاتې دي دا دي چې ستاسو په غوره IDE کې کوډ ایډیټ کړئ او له پایلې څخه خوند واخلئ.
  • د کار په پای کې ، تاسو اړتیا لرئ هغه ټرمینل وتړئ چیرې چې ټیلی پریزنس روان دی (د Ctrl+C سره ناسته پای ته ورسوئ) - د ډاکر کانټینرونه به په ډیسټاپ کې ودریږي ، او په کوبرنیټس کې به هرڅه خپل لومړني حالت ته راستون شي. ټول هغه څه چې پاتې دي هغه ژمنې دي، MR صادر کړئ او بیاکتنې/ضمې/... (ستاسو د کاري جریان پورې اړه لري).

که موږ نه غواړو غوښتنلیک په ډاکر کانټینر کې پرمخ بوځو - د مثال په توګه ، موږ په PHP کې نه ، مګر په Go کې وده کوو ، او بیا هم دا په ځایی ډول جوړوو - د ټیلیپریسینس پیل کول به خورا ساده وي:

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 او نور سرعت کونکي غیر فعال کړئ - که نه نو د کوډ ترمیم به مطلوب پایلې ته ونه رسیږي.

پایلې

د Kubernetes سره محلي پراختیا یوه ستونزه ده چې حل یې د دې پلیټ فارم د خپریدو په تناسب وده کوي. د پراختیا کونکو (زموږ د پیرودونکو څخه) اړونده غوښتنې ترلاسه کول ، موږ دوی د لومړي موجود وسیلو سره حل کول پیل کړل ، کوم چې په هرصورت ، د اوږدې مودې لپاره ځان ثابت نه کړ. خوشبختانه ، دا نه یوازې اوس او نه یوازې موږ ته څرګنده شوې ، نو لا دمخه په نړۍ کې ډیر مناسب وسیلې څرګندې شوې ، او ټیلیپریسنس د دوی ترټولو مشهور دی (په لاره کې ، دلته هم شتون لري. سکافولډ د ګوګل څخه). زموږ د دې کارولو تجربه لاهم عالي نه ده ، مګر دا دمخه موږ ته دلیل راکوي چې زموږ "په پلورنځي کې همکارانو" ته یې وړاندیز وکړو - هڅه وکړئ!

PS

د K8s لارښوونو او چلونو لړۍ څخه نور:

سرچینه: www.habr.com

Add a comment