Konsèy ak ke trik nouvèl Kubernetes: sou devlopman lokal ak Teleprezans

Konsèy ak ke trik nouvèl Kubernetes: sou devlopman lokal ak Teleprezans

Yo mande nou de pli zan pli sou devlopman mikwosèvis nan Kubernetes. Devlopè, espesyalman nan lang entèprete, vle byen vit korije kòd nan IDE pi renmen yo epi wè rezilta a san yo pa tann pou bati / deplwaman - pa senpleman peze F5. Ak lè li te rive nan yon aplikasyon monolitik, li te ase lokalman enstale yon baz done ak yon sèvè entènèt (nan Docker, VirtualBox ...), ak Lè sa a, imedyatman jwi devlopman. Avèk koupe monolit nan mikwosèvis ak arive Kubernetes, ak aparans nan depandans youn sou lòt, tout bagay. li te vin yon ti kras pi difisil. Plis nan mikwosèvis sa yo, se plis pwoblèm. Pou jwi devlopman ankò, ou bezwen ogmante plis pase youn oubyen de kontenè Docker, e pafwa menm plis pase yon douzèn... An jeneral, tout bagay sa yo ka pran anpil tan, paske li tou bezwen kenbe ajou. .

Nan diferan moman nou te eseye diferan solisyon pou pwoblèm nan. Apre sa, mwen pral kòmanse ak solisyon yo akimile oswa tou senpleman "beki".

1. Beki

Pifò IDE yo gen kapasite pou modifye kòd dirèkteman sou sèvè a lè l sèvi avèk FTP/SFTP. Chemen sa a trè evidan e nou imedyatman deside sèvi ak li. Sans li yo desann nan bagay sa yo:

  1. Nan gous anviwònman devlopman (dev/revizyon), yo lanse yon veso adisyonèl ak aksè SSH ak voye kle piblik SSH pwomotè a ki pral komèt/deplwaye aplikasyon an.
  2. Nan etap init la (nan veso a prepare-app) transfere kòd la nan emptyDirpou gen aksè a kòd la nan resipyan aplikasyon yo ak sèvè SSH la.

Konsèy ak ke trik nouvèl Kubernetes: sou devlopman lokal ak Teleprezans

Pou pi byen konprann aplikasyon teknik yon konplo konsa, mwen pral bay fragman konfigirasyon YAML ki enplike nan Kubernetes.

Konfigirasyon

1.1. valè.yaml

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

Isit la vasya.pupkin se valè varyab la ${GITLAB_USER_LOGIN}.

1.2. deplwaman.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. sekrè.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 }}

manyen final la

Apre sa, tout sa ki rete se transfere varyab obligatwa 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: pwomotè ki te lanse deplwaman an ka konekte pa non sèvis (ki jan yo bay aksè nan gwoup la an sekirite, nou te deja di) soti nan Desktop ou atravè SFTP epi modifye kòd la san yo pa tann pou li dwe delivre nan gwoup la.

Sa a se yon solisyon konplètman k ap travay, men nan yon pwen de vi aplikasyon li gen dezavantaj evidan:

  • bezwen pou rafine tablo Helm la, ki fè li difisil pou li alavni;
  • kapab itilize sèlman pa moun ki deplwaye sèvis la;
  • ou bezwen sonje lè sa a senkronize li ak anyè lokal la ak kòd la epi komèt li nan Git.

2. Teleprezans

Pwojè Telepresans li te konnen depi byen lontan, men nou, jan yo di, "pa t 'jwenn alantou seryezman eseye li nan pratik." Sepandan, demann fè travay li e kounye a nou kontan pataje eksperyans nou an, ki ka itil pou lektè blog nou an - sitou paske pa gen okenn lòt materyèl sou Teleprezans ankò sou sant la.

Nan ti bout tan, tout bagay te tounen soti yo dwe pa tèlman pè. Nou mete tout aksyon ki mande ekzekisyon sou pati nan pwomotè a nan yon dosye tèks Helm tablo yo rele NOTES.txt. Kidonk, apre yo fin deplwaye sèvis la nan Kubernetes, pwomotè a wè enstriksyon pou lanse anviwònman dev lokal la nan jounal travay GitLab la:

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

Nou p ap rete an detay sou etap ki dekri nan enstriksyon sa a... eksepte dènye a. Kisa k ap pase pandan lansman Teleprezans?

Travay ak Teleprezans

Nan demaraj (sèvi ak dènye kòmandman ki espesifye nan enstriksyon ki anwo yo), nou mete:

  • espas non kote mikwosèvis la ap kouri;
  • non deplwaman ak veso nou vle antre.

Agiman ki rete yo opsyonèl. Si sèvis nou an reyaji ak ak pou API Kubernetes la ServiceAccount kreye, nou bezwen monte sètifika / marqueur sou Desktop nou an. Pou fè sa, sèvi ak opsyon an --mount=true (Oswa --mount=/dst_path), ki pral monte rasin (/) soti nan veso Kubernetes sou Desktop nou an. Apre sa, nou ka (depann sou eksplwatasyon an ak ki jan aplikasyon an te lanse) sèvi ak "kle" ki soti nan gwoup la.

Premyèman, ann gade nan opsyon ki pi inivèsèl pou kouri yon aplikasyon - nan yon veso Docker. Pou fè sa nou pral sèvi ak kle a --docker-run epi monte anyè a ak kòd la nan veso a: -v `pwd`:/app

Tanpri sonje ke sa a sipoze kouri soti nan anyè pwojè a. Kòd aplikasyon an pral monte nan anyè a /app nan yon veso.

Next: -v /tmp/app/var/run/secrets:/var/run/secrets — pou monte anyè a ak sètifika/jeton an nan yon veso.

Opsyon sa a finalman swiv pa imaj ki aplikasyon an pral kouri. NB: Lè w ap bati yon imaj, ou dwe presize CMD oswa ENTRYPOINT!

Kisa ki pral rive egzakteman apre?

  • Nan Kubernetes, pou Deplwaman espesifye a, kantite kopi yo pral chanje a 0. Olye de sa, yo pral lanse yon nouvo Deplwaman - ak yon veso ranplasan. backend.
  • 2 kontenè pral lanse sou Desktop la: premye a ak Teleprezans (li pral proxy demann soti nan / pou Kubernetes), dezyèm lan ak aplikasyon an ap devlope.
  • Si nou egzekite nan veso a ak aplikasyon an, Lè sa a, tout varyab yo ENV transfere pa Helm pandan deplwaman yo ap disponib pou nou, epi tout sèvis yo ap disponib tou. Tout sa ki rete se modifye kòd la nan IDE pi renmen ou epi jwi rezilta a.
  • Nan fen travay la, ou jis bezwen fèmen tèminal la nan ki Teleprezans ap kouri (fen sesyon an ak Ctrl + C) - kontenè Docker yo ap sispann sou Desktop la, ak nan Kubernetes tout bagay ap retounen nan eta inisyal li yo. Tout sa ki rete se komèt, bay MR a epi transfere li nan revize / fizyone / ... (depann sou workflows ou).

Si nou pa vle kouri aplikasyon an nan yon veso Docker - pou egzanp, nou devlope pa nan PHP, men nan Go, epi toujou bati li lokalman - lanse Teleprezans pral menm pi senp:

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

Si aplikasyon an jwenn aksè nan API Kubernetes, w ap bezwen monte anyè kle a (https://www.telepresence.io/howto/volumes). Gen yon sèvis piblik pou Linux rasin:

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

Apre lanse Teleprezans san opsyon a --docker-run tout varyab anviwònman yo ap disponib nan tèminal aktyèl la, kidonk aplikasyon an dwe lanse nan li.

NB: Lè w ap itilize, pou egzanp, PHP, ou dwe sonje enfim divès op_cache, apc ak lòt akseleratè pou devlopman - otreman koreksyon kòd la pa pral mennen nan rezilta a vle.

Rezilta

Devlopman lokal ak Kubernetes se yon pwoblèm ki gen solisyon ap grandi nan pwopòsyon ak gaye platfòm sa a. Resevwa demann enpòtan nan men devlopè (ki soti nan kliyan nou yo), nou te kòmanse rezoud yo ak premye mwayen ki disponib, ki, sepandan, pa t 'pwouve tèt yo sou bwote la long. Erezman, sa a te vin evidan pa sèlman kounye a epi li pa sèlman pou nou, kidonk plis mwayen apwopriye te deja parèt nan mond lan, ak Teleprezans se pi popilè nan yo (pa chemen an, gen tou echafodaj soti nan Google). Eksperyans nou nan sèvi ak li se poko tèlman gwo, men li deja ban nou rezon ki fè nou rekòmande li nan "kòlèg nou yo nan boutik la" - eseye li!

PS

Lòt nan seri konsèy ak ke trik nouvèl K8s yo:

Sous: www.habr.com

Add nouvo kòmantè