Маслиҳатҳо ва ҳилаҳои Kubernetes: дар бораи рушди маҳаллӣ ва Telepresence

Маслиҳатҳо ва ҳилаҳои Kubernetes: дар бораи рушди маҳаллӣ ва Telepresence

Аз мо бештар дар бораи таҳияи хидматҳои микросервис дар Кубернетес мепурсанд. Таҳиягарон, бахусус забонҳои тафсиршуда, мехоҳанд кодро дар IDE дӯстдоштаи худ зуд ислоҳ кунанд ва бидуни мунтазири сохтан/ҷойгиршавӣ натиҷаро бубинанд - танҳо бо пахшкунии F5. Ва ҳангоме ки сухан дар бораи як барномаи монолитӣ меравад, ба таври маҳаллӣ насб кардани пойгоҳи додаҳо ва веб-сервер (дар Docker, VirtualBox...) кифоя буд ва сипас фавран аз рушд лаззат баред. Бо буридани монолитҳо ба микросервисҳо ва омадани Кубернетес, бо пайдоиши вобастагӣ аз ҳамдигар, ҳама чиз каме мушкилтар шуд. Чӣ қадаре ки ин хидматрасониҳои хурд зиёд бошанд, ҳамон қадар мушкилот зиёд мешавад. Барои боз ҳам лаззат бурдан аз рушд, шумо бояд зиёда аз як ё ду контейнери Docker ва баъзан ҳатто бештар аз даҳҳо контейнерро баланд кунед ... Умуман, ҳамаи ин метавонад вақти хеле зиёдро талаб кунад, зеро он инчунин бояд навсозӣ карда шавад. .

Дар вақтҳои гуногун мо роҳҳои ҳалли мушкилоти гуногунро кӯшиш кардем. Ва ман бо ҳалли ҷамъшуда ё танҳо "асғола" оғоз мекунам.

1. Асобаҳо

Аксарияти IDEҳо қобилияти таҳрир кардани кодро мустақиман дар сервер бо истифода аз FTP/SFTP доранд. Ин рох хеле равшан аст ва мо фавран карор додем, ки аз он истифода барем. Моҳияти он ба инҳо тааллуқ дорад:

  1. Дар паҳлӯи муҳитҳои рушд (dev/review) як контейнери иловагӣ бо дастрасии SSH ва интиқоли калиди ҷамъиятии SSH-и таҳиякунанда, ки барномаро иҷро мекунад/ҷой мекунад, оғоз мешавад.
  2. Дар марҳилаи ибтидоӣ (дар дохили контейнер prepare-app) кодро ба emptyDirБарои дастрасӣ ба код аз контейнерҳои барнома ва сервери SSH.

Маслиҳатҳо ва ҳилаҳои Kubernetes: дар бораи рушди маҳаллӣ ва Telepresence

Барои беҳтар фаҳмидани татбиқи техникии чунин нақша, ман порчаҳои конфигуратсияҳои YAML-ро дар Кубернетес пешниҳод мекунам.

Конфигуратсияҳо

1.1. арзишхо.ямл

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. махфӣ.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 гиред ва кодро бидуни мунтазири интиқоли он ба кластер таҳрир кунед.

Ин як ҳалли комилан коркунанда аст, аммо аз нуқтаи назари татбиқ он камбудиҳои ошкоро дорад:

  • зарурати такмил додани диаграммаи Ҳелм, ки дар оянда хонданро душвор мегардонад;
  • метавонад танҳо аз ҷониби шахсе истифода шавад, ки хидматро ҷойгир кардааст;
  • шумо бояд фаромӯш накунед, ки онро бо директорияи маҳаллӣ бо код ҳамоҳанг созед ва онро ба Git супоред.

2. Телевизионӣ

Лоиҳа Телефонсупорӣ муддати хеле дуру дароз маълум аст, аммо мо, чунон ки мегуянд, «ба таври чиддй дар амал санчида нашуда будем». Бо вуҷуди ин, талабот кори худро анҷом дод ва ҳоло мо бо хушнудӣ таҷрибаи худро мубодила мекунем, ки ин метавонад барои хонандагони блоги мо муфид бошад - алахусус азбаски то ҳол дар марказ ягон маводи дигар дар бораи Telepresence мавҷуд нест.

Хулоса, ҳама чиз он қадар даҳшатнок набуд. Мо ҳама амалҳоеро, ки иҷроишро аз ҷониби таҳиякунанда талаб мекунанд, дар файли матнии диаграммаи Helm ҷойгир кардем. 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 ва Kubernetes ҳамкорӣ кунад Ҳисоби хидматӣ сохта шудааст, мо бояд сертификатҳо/токенҳоро дар мизи кории худ насб кунем. Барои ин, интихобро истифода баред --mount=true--mount=/dst_path), ки решаро (/) аз контейнери Kubernetes ба мизи кории мо васл мекунад. Пас аз ин, мо метавонем (вобаста ба OS ва чӣ гуна оғоз шудани барнома) "калидҳо" -ро аз кластер истифода барем.

Аввалан, биёед варианти универсалии иҷро кардани барномаро дида бароем - дар контейнери Docker. Барои ин мо калидро истифода мебарем --docker-run ва директорияро бо код ба контейнер насб кунед: -v `pwd`:/app

Лутфан қайд кунед, ки ин кор аз феҳристи лоиҳаро дар назар дорад. Рамзи барнома дар директория насб карда мешавад /app дар як контейнер.

Next: -v /tmp/app/var/run/secrets:/var/run/secrets — барои васл кардани директория бо сертификат/токен ба контейнер.

Пас аз ин хосият дар ниҳоят тасвире пайдо мешавад, ки дар он барнома кор мекунад. NB: Ҳангоми сохтани тасвир, шумо бояд муайян кунед CMD ё ENTRYPOINT!

Дар оянда чӣ воқеа рӯй медиҳад?

  • Дар Кубернетес, барои Ҷойгиркунии мушаххас, шумораи репликаҳо ба 0 тағир дода мешавад. Ба ҷои ин, паҳнкунии нав бо контейнери ивазкунанда оғоз мешавад backend.
  • 2 контейнер дар мизи корӣ оғоз мешавад: якум бо Telepresence (он прокси дархостҳоро аз/ба Kubernetes хоҳад кард), дуюм бо барнома таҳия карда мешавад.
  • Агар мо ба контейнер бо барнома ворид шавем, он гоҳ ҳама тағирёбандаҳои ENV, ки аз ҷониби Helm ҳангоми ҷойгиркунӣ интиқол дода шудаанд, ба мо дастрас хоҳанд буд ва ҳама хидматҳо низ дастрас хоҳанд буд. Танҳо ин аст, ки кодро дар IDE дӯстдоштаи худ таҳрир кунед ва аз натиҷа лаззат баред.
  • Дар охири кор, шумо бояд танҳо терминалеро, ки Telepresence кор мекунад, пӯшед (сеансро бо Ctrl+C қатъ кунед) - Контейнерҳои Docker дар мизи корӣ қатъ мешаванд ва дар Кубернетес ҳама чиз ба ҳолати аввалааш бармегардад. Танҳо иҷрои он, додани MR ва интиқол додани он ба баррасӣ/якҷоя/… (вобаста ба ҷараёни кори шумо) боқӣ мемонад.

Агар мо нахоҳем, ки барномаро дар контейнери Docker иҷро кунем - масалан, мо на дар PHP, балки дар Go таҳия мекунем ва ба ҳар ҳол онро ба таври маҳаллӣ бунёд мекунем - оғози Telepresence боз ҳам соддатар мешавад:

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

Агар барнома ба API Kubernetes дастрасӣ пайдо кунад, шумо бояд директорияи калидҳоро насб кунед (https://www.telepresence.io/howto/volumes). Барои Linux як утилита мавҷуд аст реша:

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

Пас аз оғози Telepresence бидуни интихоб --docker-run ҳама тағирёбандаҳои муҳити зист дар терминали ҷорӣ дастрас хоҳанд буд, бинобар ин барнома бояд дар он оғоз карда шавад.

NB: Ҳангоми истифода, масалан, PHP, шумо бояд фаромӯш накунед, ки op_cache, apc ва дигар суръатбахшҳоро барои таҳия ғайрифаъол кунед - дар акси ҳол таҳрир кардани код ба натиҷаи дилхоҳ оварда намерасонад.

Натиҷаҳо

Рушди маҳаллӣ бо Kubernetes мушкилотест, ки ҳалли он мутаносибан ба паҳншавии ин платформа афзоиш меёбад. Гирифтани дархостҳои дахлдор аз таҳиягарон (аз мизоҷони мо), мо ба ҳалли онҳо бо аввалин воситаҳои мавҷуда шурӯъ кардем, аммо онҳо дар тӯли муддати тӯлонӣ худро исбот накарданд. Хушбахтона, ин на танҳо ҳоло ва на танҳо ба мо маълум шуд, бинобар ин дар ҷаҳон воситаҳои муносибтар пайдо шудаанд ва Telepresence машҳуртарини онҳост (дар омади гап, вуҷуд дорад. скаффолд аз Google). Таҷрибаи мо дар истифодаи он ҳанӯз он қадар бузург нест, аммо он аллакай ба мо асос медиҳад, ки онро ба "ҳамкасбони мағоза"-и худ тавсия диҳем - кӯшиш кунед!

PS

Дигар аз силсилаи маслиҳатҳо ва ҳилаҳои K8s:

Манбаъ: will.com

Илова Эзоҳ