Serişte û hîleyên Kubernetes: li ser pêşkeftina herêmî û Telepresence

Serişte û hîleyên Kubernetes: li ser pêşkeftina herêmî û Telepresence

Ji me re di derbarê pêşxistina mîkroxizmetên li Kubernetes de pir zêde tê pirsîn. Pêşdebiran, nemaze zimanên şirovekirî, dixwazin zû kodê di IDE-ya xweya bijare de rast bikin û encamê bibînin bêyî ku li benda çêkirinê/damezrandinê bimînin - bi tenê bi tikandina F5. Û gava ku ew hat ser serîlêdanek yekparêz, bes bû ku bi herêmî databasek û serverek malperê saz bikin (li Docker, VirtualBox ...), û dûv re tavilê ji pêşkeftinê kêfxweş bibin. Bi qutkirina monolîtan nav mîkroservîsan û hatina Kubernetes, bi xuyabûna girêdanên li ser hev, her tişt hinekî dijwartir bû. Zêdetir ji van mîkroxizmetan, bêtir pirsgirêk. Ji bo ku hûn dîsa ji pêşkeftinê kêfxweş bibin, hûn hewce ne ku ji yek an du konteynerên Docker, û carinan jî ji dehan zêdetir jî rakin... Bi gelemperî, ev hemî dikare pir dem bigire, ji ber ku ew jî pêdivî ye ku were nûve kirin. .

Di demên cûda de me ji bo pirsgirêkê çareseriyên cûda ceribandin. Û ez ê bi rêgezên berhevkirî an bi tenê "kûçikan" dest pê bikim.

1. Kûçik

Piraniya IDE-yan xwedan şiyana ku rasterast li ser serverê bi karanîna FTP / SFTP kodê biguherînin. Ev rê pir eşkere ye û me yekser biryar da ku em wê bikar bînin. Esasê wê bi van tiştan ve girêdayî ye:

  1. Di binavê hawîrdorên pêşkeftinê de (dev / vekolîn), konteynirek pêvek bi gihîştina SSH û şandina mifteya giştî ya SSH ya pêşdebirê ku dê serîlêdanê pêk bîne/bicihîne tê destpêkirin.
  2. Di qonaxa destpêkê de (di nav konteynerê de prepare-app) kodê veguherîne emptyDirku ji konteynerên serîlêdanê û servera SSH-ê bigihîjin kodê.

Serişte û hîleyên Kubernetes: li ser pêşkeftina herêmî û Telepresence

Ji bo ku hûn pêkanîna teknîkî ya nexşeyek wusa çêtir fam bikin, ez ê perçeyên veavakirinên YAML-ê yên têkildar li Kubernetes peyda bikim.

Configurations

1.1. nirxan.yaml

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

Ev e vasya.pupkin nirxa guhêrbar e ${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. veşartî.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 }}

destana dawî

Piştî vê yekê ya ku dimîne veguheztin e guherbarên gitlab-ci.yml pêwîst:

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: pêşdebirê ku dest bi danînê kiriye dikare bi navê karûbar ve girêbide (çawa meriv bi ewlehî gihîştina komê bide, me berê jî gotibû) ji sermaseya xwe bi riya SFTP-ê û kodê biguherînin bêyî ku li bendê bin ku ew ji komê re were radest kirin.

Ev çareseriyek bi tevahî xebatkar e, lê ji hêla pêkanînê ve dezawantajên wê yên eşkere hene:

  • hewcedariya paqijkirina nexşeya Helmê, ku xwendina di pêşerojê de dijwar dike;
  • tenê dikare ji hêla kesê ku karûbar vekiriye ve were bikar anîn;
  • Pêdivî ye ku hûn ji bîr mekin ku dûv re wê bi pelrêça herêmî re bi kodê re hevdeng bikin û wê bi Git-ê re bikin.

2. Telepresence

Projeyê telepresence ji demek dirêj ve tê zanîn, lê me, wekî ku ew dibêjin, "dor neket ku bi ciddî wê di pratîkê de biceribîne." Lêbelê, daxwazê ​​karê xwe kir û naha em kêfxweş in ku ezmûna xwe parve bikin, ku dibe ku ji xwendevanên bloga me re bikêr be - nemaze ji ber ku hîn materyalên din di derheqê Telepresence de li ser navendê tune ne.

Bi kurtasî, derket holê ku her tişt ne ew qas tirsnak bû. Me hemî kiryarên ku hewceyê darvekirinê ji hêla pêşdebirker ve di pelek nivîsê ya Helm chart ku jê re tê gotin bicîh kir NOTES.txt. Bi vî rengî, piştî şandina karûbarê li Kubernetes, pêşdebir rêwerzên ji bo destpêkirina hawîrdora dev-ya herêmî di têketina kar a GitLab de dibîne:

!!! Разработка сервиса локально, в составе 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
#########################################################################

Em ê bi hûrgulî li ser gavên ku di vê talîmatê de hatine destnîşan kirin nesekinin... ji bilî ya paşîn. Di dema destpêkirina Telepresence de çi diqewime?

Bi Telepresence re dixebitin

Di destpêkê de (bi karanîna fermana paşîn a ku di rêwerzên li jor de hatî destnîşan kirin), me destnîşan kir:

  • cîhê navan ku mîkroxizmet tê de dixebite;
  • navên şandin û konteynerê ku em dixwazin têkevin nav.

Argumanên mayî vebijarkî ne. Ger karûbarê me bi û ji bo Kubernetes API re têkilî daynin Hesabê Xizmetê hate afirandin, divê em sertîfîkayan/nîşanan li ser sermaseya xwe siwar bikin. Ji bo vê yekê, vebijarkê bikar bînin --mount=true (an jî --mount=/dst_path), ku dê root (/) ji konteynera Kubernetes li ser sermaseya me siwar bike. Piştî vê yekê, em dikarin (li gorî OS-ê û çawa serîlêdanê hatî destpêkirin) "bişkojkên" ji komê bikar bînin.

Pêşîn, em li vebijarka herî gerdûnî ya ji bo xebitandina serîlêdanê - di konteynerek Docker de binihêrin. Ji bo vê yekê em ê mifteyê bikar bînin --docker-run û pelrêça bi kodê li konteynerê siwar bikin: -v `pwd`:/app

Ji kerema xwe not bikin ku ev tê texmîn kirin ku ji pelrêça projeyê dimeşe. Koda serîlêdanê dê di pelrêçê de were danîn /app di konteynir de.

Next: -v /tmp/app/var/run/secrets:/var/run/secrets - ji bo ku pelrêça bi sertîfîkayê/tokenê li konteynirekê bixin.

Vê vebijarkê di dawiyê de bi wêneya ku dê serîlêdan tê de bixebite tê şopandin. NB: Dema ku wêneyek çêbikin, divê hûn diyar bikin CMD an ENTRYPOINT!

Bi rastî dê paşê çi bibe?

  • Di Kubernetes de, ji bo Dabeşandina diyarkirî, dê hejmara kopiyan bibe 0. Di şûna wê de, Dabeşkirinek nû dê were destpêkirin - bi konteynirek cîgir. backend.
  • 2 konteynir dê li ser sermaseyê dest pê bikin: ya yekem bi Telepresence re (ew ê ji Kubernetes-ê daxwazê ​​​​bike), ya duyemîn bi serîlêdana ku hatî pêşve xistin.
  • Ger em bi serîlêdanê re di konteynerê de derxînin, wê hingê hemî guhêrbarên ENV yên ku ji hêla Helm ve di dema bicîhkirinê de hatine veguheztin dê ji me re peyda bibin, û hemî karûbar jî dê hebin. Tiştê ku dimîne ev e ku hûn kodê di IDE-ya xweya bijare de biguherînin û ji encamê kêfxweş bibin.
  • Di dawiya xebatê de, hûn tenê hewce ne ku termînala ku Telepresence tê de dimeşe bigire (danişîn bi Ctrl + C biqedîne) - Dê konteynerên Docker li ser sermaseyê rawestin, û di Kubernetes de her tişt dê vegere rewşa xweya destpêkê. Tiştê ku dimîne ev e ku meriv bipejirîne, MR-ê derxîne û wê veguhezîne vekolînê/hevkirinê/… (li gorî rêyên xebata we ve girêdayî ye).

Ger em nexwazin serîlêdanê di konteynirek Docker de bimeşînin - mînakî, em ne di PHP-ê de, lê li Go-yê pêşve diçin, û hîn jî wê li herêmî ava dikin - destpêkirina Telepresence dê hê hêsantir be:

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

Ger serîlêdan xwe bigihîne Kubernetes API-ê, hûn ê hewce bikin ku pelrêça bişkojkan (https://www.telepresence.io/howto/volumes) lê bikin. Ji bo Linux-ê amûrek heye reh:

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

Piştî destpêkirina Telepresence bêyî vebijarkê --docker-run hemî guhêrbarên hawîrdorê dê di termînala heyî de peyda bibin, ji ber vê yekê divê serîlêdan tê de were destpêkirin.

NB: Dema ku, mînakî, PHP-ê bikar tînin, divê hûn ji bîr mekin ku ji bo pêşkeftinê op_cache, apc û bilezkerên din neçalak bikin - wekî din guherandina kodê dê negihîje encama xwestî.

Encam

Pêşkeftina herêmî ya bi Kubernetes re pirsgirêkek e ku çareseriya wê li gorî belavbûna vê platformê mezin dibe. Bi wergirtina daxwazên têkildar ji pêşdebiran (ji xerîdarên me), me dest bi çareserkirina wan bi rêgezên pêşîn ên berdest kir, ku, lêbelê, di demek dirêj de xwe îsbat nekir. Xwezî, ev ne tenê nuha û ne tenê ji me re eşkere bûye, ji ber vê yekê rêgezên maqûltir berê li cîhanê xuya bûne, û Telepresence ji wan herî navdar e (bi awayê, di heman demê de jî heye skaffold ji Google). Tecrûbeya me ya karanîna wê hîn ne ew qas mezin e, lê ew jixwe sedemê dide me ku em wê ji "hevalên xwe yên di firotgehê" re pêşniyar bikin - wê biceribînin!

PS

Din ji rêzikên serişte û hîleyên K8s:

Source: www.habr.com

Add a comment