Awgrymiadau a thriciau Kubernetes: am ddatblygiad lleol a Thelepresence

Awgrymiadau a thriciau Kubernetes: am ddatblygiad lleol a Thelepresence

Gofynnir inni fwyfwy am ddatblygu microwasanaethau yn Kubernetes. Mae datblygwyr, yn enwedig ieithoedd sydd wedi'u dehongli, eisiau cywiro cod yn gyflym yn eu hoff DRhA a gweld y canlyniad heb aros am adeiladu / defnyddio - trwy wasgu F5 yn unig. Ac o ran cymhwysiad monolithig, roedd yn ddigon i osod cronfa ddata a gweinydd gwe yn lleol (yn Docker, VirtualBox ...), ac yna mwynhau datblygiad ar unwaith. Gyda thorri monolithau yn ficrowasanaethau a dyfodiad Kubernetes, gydag ymddangosiad dibyniaeth ar ei gilydd, mae popeth aeth ychydig yn anoddach. Po fwyaf o'r microwasanaethau hyn, y mwyaf o broblemau. Er mwyn mwynhau datblygiad eto, mae angen i chi godi mwy nag un neu ddau o gynwysyddion Docker, ac weithiau hyd yn oed mwy na dwsin... Yn gyffredinol, gall hyn i gyd gymryd cryn dipyn o amser, gan fod angen ei ddiweddaru hefyd. .

Ar wahanol adegau fe wnaethom roi cynnig ar wahanol atebion i'r broblem. A byddaf yn dechrau gyda'r atebion cronedig neu'n syml “baglau”.

1. baglau

Mae gan y rhan fwyaf o DRhA y gallu i olygu cod yn uniongyrchol ar y gweinydd gan ddefnyddio FTP/SFTP. Mae'r llwybr hwn yn amlwg iawn a gwnaethom benderfynu ei ddefnyddio ar unwaith. Mae ei hanfod yn deillio o'r canlynol:

  1. Yn y pod o amgylcheddau datblygu (dev/adolygu), mae cynhwysydd ychwanegol yn cael ei lansio gyda mynediad SSH ac yn anfon allwedd SSH cyhoeddus y datblygwr a fydd yn ymrwymo / lleoli'r cais ymlaen.
  2. Ar y cam cychwyn (o fewn y cynhwysydd prepare-app) trosglwyddo'r cod i emptyDiri gael mynediad at y cod o'r cynwysyddion cais a'r gweinydd SSH.

Awgrymiadau a thriciau Kubernetes: am ddatblygiad lleol a Thelepresence

Er mwyn deall gweithrediad technegol cynllun o'r fath yn well, byddaf yn darparu darnau o'r cyfluniadau YAML dan sylw yn Kubernetes.

Cyfluniadau

1.1. gwerthoedd.yaml

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

Yma vasya.pupkin yw gwerth y newidyn ${GITLAB_USER_LOGIN}.

1.2. lleoli.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. cyfrinach.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 }}

cyffwrdd terfynol

Wedi hynny y cyfan sydd ar ôl yw trosglwyddo newidynnau gitlab-ci.yml gofynnol:

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: gall y datblygwr a lansiodd y defnydd gysylltu yn ôl enw'r gwasanaeth (sut i ganiatáu mynediad i'r clwstwr yn ddiogel, dywedasom eisoes) o'ch bwrdd gwaith trwy SFTP a golygu'r cod heb aros iddo gael ei ddosbarthu i'r clwstwr.

Mae hwn yn ateb cwbl weithredol, ond o safbwynt gweithredu mae ganddo anfanteision amlwg:

  • yr angen i fireinio'r siart Helm, sy'n ei gwneud yn anodd ei ddarllen yn y dyfodol;
  • dim ond y person a ddefnyddiodd y gwasanaeth all ei ddefnyddio;
  • mae angen ichi gofio wedyn ei gysoni â'r cyfeiriadur lleol gyda'r cod a'i ymrwymo i Git.

2. Telepresenoldeb

Prosiect Telepresenoldeb wedi bod yn hysbys ers amser maith, ond ni, fel y dywedant, “ddaethom ni o gwmpas i roi cynnig arni o ddifrif yn ymarferol.” Fodd bynnag, mae'r galw wedi gwneud ei waith a nawr rydym yn hapus i rannu ein profiad, a allai fod yn ddefnyddiol i ddarllenwyr ein blog - yn enwedig gan nad oes unrhyw ddeunyddiau eraill am Delepresence wedi bod ar y canolbwynt eto.

Yn fyr, trodd popeth ddim mor frawychus. Fe wnaethom osod yr holl gamau gweithredu y mae angen eu cyflawni ar ran y datblygwr mewn ffeil testun siart Helm o'r enw NOTES.txt. Felly, ar ôl defnyddio'r gwasanaeth i Kubernetes, mae'r datblygwr yn gweld cyfarwyddiadau ar gyfer lansio'r amgylchedd datblygu lleol yn log swyddi 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
#########################################################################

Ni fyddwn yn canolbwyntio'n fanwl ar y camau a ddisgrifir yn y cyfarwyddyd hwn ... ac eithrio'r un olaf. Beth sy'n digwydd yn ystod lansiad Telepresence?

Gweithio gyda Telepresenoldeb

Wrth gychwyn (gan ddefnyddio'r gorchymyn olaf a nodir yn y cyfarwyddiadau uchod), rydym yn gosod:

  • gofod enwau y mae'r microwasanaeth yn rhedeg ynddo;
  • enwau'r gosodiad a'r cynhwysydd yr ydym am ei dreiddio.

Mae'r dadleuon sy'n weddill yn ddewisol. Os yw ein gwasanaeth yn rhyngweithio ag API Kubernetes ac ar ei gyfer ServiceAccount wedi'i greu, mae angen i ni osod tystysgrifau / tocynnau ar ein bwrdd gwaith. I wneud hyn, defnyddiwch yr opsiwn --mount=true (Neu --mount=/dst_path), a fydd yn gosod y gwraidd (/) o'r cynhwysydd Kubernetes i'n bwrdd gwaith. Ar ôl hyn, gallwn (yn dibynnu ar yr OS a sut mae'r cais yn cael ei lansio) ddefnyddio'r “allweddi” o'r clwstwr.

Yn gyntaf, gadewch i ni edrych ar yr opsiwn mwyaf cyffredinol ar gyfer rhedeg cais - mewn cynhwysydd Docker. I wneud hyn byddwn yn defnyddio'r allwedd --docker-run a gosodwch y cyfeiriadur gyda'r cod yn y cynhwysydd: -v `pwd`:/app

Sylwch fod hyn yn rhagdybio ei fod yn rhedeg o gyfeiriadur y prosiect. Bydd y cod cais yn cael ei osod yn y cyfeiriadur /app mewn cynhwysydd.

Nesaf: -v /tmp/app/var/run/secrets:/var/run/secrets — i osod y cyfeiriadur gyda'r dystysgrif/tocyn mewn cynhwysydd.

Dilynir yr opsiwn hwn yn olaf gan y ddelwedd y bydd y rhaglen yn rhedeg ynddi. NB: Wrth adeiladu delwedd, rhaid i chi nodi CMD neu ENTRYPOINT!

Beth yn union fydd yn digwydd nesaf?

  • Yn Kubernetes, ar gyfer y Defnydd penodedig, bydd nifer y replicas yn cael eu newid i 0. Yn lle hynny, bydd Defnydd newydd yn cael ei lansio - gyda chynhwysydd arall backend.
  • Bydd 2 gynhwysydd yn lansio ar y bwrdd gwaith: y cyntaf gyda Telepresence (bydd yn geisiadau dirprwy gan / i Kubernetes), yr ail gyda'r cais yn cael ei ddatblygu.
  • Os byddwn yn gweithredu yn y cynhwysydd gyda'r cais, yna bydd yr holl newidynnau ENV a drosglwyddir gan Helm yn ystod y defnydd ar gael i ni, a bydd yr holl wasanaethau ar gael hefyd. Y cyfan sydd ar ôl yw golygu'r cod yn eich hoff IDE a mwynhau'r canlyniad.
  • Ar ddiwedd y gwaith, does ond angen i chi gau'r derfynell y mae Telepresence yn rhedeg ynddi (terfynu'r sesiwn gyda Ctrl + C) - bydd cynwysyddion docwyr yn stopio ar y bwrdd gwaith, ac yn Kubernetes bydd popeth yn dychwelyd i'w gyflwr cychwynnol. Y cyfan sydd ar ôl yw ymrwymo, cyhoeddi’r MR a’i drosglwyddo i adolygu/uno/… (yn dibynnu ar eich llifoedd gwaith).

Os nad ydym am redeg y cymhwysiad mewn cynhwysydd Docker - er enghraifft, rydym yn datblygu nid yn PHP, ond yn Go, ac yn dal i'w adeiladu'n lleol - bydd lansio Telepresence hyd yn oed yn symlach:

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

Os yw'r rhaglen yn cyrchu API Kubernetes, bydd angen i chi osod y cyfeiriadur allweddi (https://www.telepresence.io/howto/volumes). Mae cyfleustodau ar gyfer Linux gwraidd:

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

Ar ôl lansio Telepresence heb yr opsiwn --docker-run bydd yr holl newidynnau amgylchedd ar gael yn y derfynell gyfredol, felly rhaid lansio'r cais ynddo.

NB: Wrth ddefnyddio, er enghraifft, PHP, rhaid i chi gofio analluogi amrywiol op_cache, apc a chyflymwyr eraill i'w datblygu - fel arall ni fydd golygu'r cod yn arwain at y canlyniad a ddymunir.

Canlyniadau

Mae datblygiad lleol gyda Kubernetes yn broblem y mae ei datrysiad yn tyfu yn gymesur â lledaeniad y platfform hwn. Gan dderbyn ceisiadau perthnasol gan ddatblygwyr (gan ein cleientiaid), fe ddechreuon ni eu datrys gyda'r dulliau cyntaf sydd ar gael, nad oedd, fodd bynnag, wedi profi eu hunain dros y tymor hir. Yn ffodus, mae hyn wedi dod yn amlwg nid yn unig nawr ac nid yn unig i ni, felly mae dulliau mwy addas eisoes wedi ymddangos yn y byd, a Telepresence yw'r enwocaf ohonynt (gyda llaw, mae yna hefyd sgaffald oddi wrth Google). Nid yw ein profiad o'i ddefnyddio mor wych eto, ond mae eisoes yn rhoi rheswm i ni ei argymell i'n “cydweithwyr yn y siop” - rhowch gynnig arni!

PS

Arall o gyfres awgrymiadau a thriciau K8s:

Ffynhonnell: hab.com

Ychwanegu sylw