Kubernetes Tipps & Tricks: iwwer lokal Entwécklung an Telepresence

Kubernetes Tipps & Tricks: iwwer lokal Entwécklung an Telepresence

Mir ginn ëmmer méi gefrot iwwer d'Entwécklung vu Mikroservicer a Kubernetes. Entwéckler, besonnesch vun interpretéierte Sproochen, wëlle séier Code an hirer Liiblings-IDE korrigéieren an d'Resultat gesinn ouni op Build / Deployment ze waarden - andeems Dir einfach F5 dréckt. A wann et ëm eng monolithesch Applikatioun koum, war et genuch fir lokal eng Datebank an e Webserver z'installéieren (am Docker, VirtualBox ...), an dann direkt d'Entwécklung genéissen. Mat der Ausschneiden vu Monolithen a Mikroservicer an der Arrivée vu Kubernetes, mat der Erscheinung vun Ofhängegkeete vuneneen, alles et gouf e bësse méi schwéier. Wat méi vun dëse Mikroservicer, wat méi Probleemer. Fir d'Entwécklung erëm ze genéissen, musst Dir méi wéi een oder zwee Docker-Container erhéijen, an heiansdo souguer méi wéi eng Dosen ... Am Allgemengen kann dat alles zimlech vill Zäit daueren, well et muss och um neiste Stand bleiwen .

Zu verschiddenen Zäiten hu mir verschidde Léisunge fir de Problem probéiert. An ech fänken un mat den akkumuléierten Léisungen oder einfach "Krütchen".

1. Crutches

Déi meescht IDEen hunn d'Fäegkeet fir Code direkt um Server mat FTP / SFTP z'änneren. Dëse Wee ass ganz offensichtlech a mir hunn direkt decidéiert et ze benotzen. Seng Essenz kacht op déi folgend:

  1. Am Pod vun Entwécklungsëmfeld (Dev / Iwwerpréiwung) gëtt en zousätzleche Container mat SSH Zougang gestart an den ëffentlechen SSH Schlëssel vum Entwéckler weiderginn, deen d'Applikatioun engagéiert / ofsetzt.
  2. An der éischter Etapp (am Container prepare-app) Transfert de Code un emptyDirZougang zum Code vun den Uwendungsbehälter an dem SSH Server ze hunn.

Kubernetes Tipps & Tricks: iwwer lokal Entwécklung an Telepresence

Fir d'technesch Ëmsetzung vun esou engem Schema besser ze verstoen, wäert ech Fragmenter vun den involvéierten YAML Konfiguratiounen an Kubernetes ubidden.

Konfiguratiounen

1.1. Wäerter.yaml

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

et ass vasya.pupkin ass de Wäert vun der Variabel ${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. geheim.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 }}

Finale Touch

Duerno bleift et nëmmen ze transferéieren néideg gitlab-ci.yml Verännerlechen:

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: den Entwéckler deen d'Deployment lancéiert huet ka mam Servicenumm konnektéieren (wéi sécher Zougang zum Cluster ginn, hu mir scho gesot) vun Ärem Desktop iwwer SFTP an änneren de Code ouni ze waarden bis en an de Cluster geliwwert gëtt.

Dëst ass eng komplett funktionéierend Léisung, awer aus enger Ëmsetzungssiicht huet et offensichtlech Nodeeler:

  • de Besoin fir d'Helm Chart ze verfeineren, wat et schwéier mécht an Zukunft ze liesen;
  • kann nëmme vun der Persoun benotzt ginn, déi de Service agesat huet;
  • Dir musst drun erënneren et dann mat dem lokalen Verzeechnes mam Code ze synchroniséieren an et op Git ze verpflichte.

2. Telepresence

De Projet Telepresenz ass scho laang bekannt, awer mir, wéi se soen, "huet et net an der Praxis eescht probéiert." Wéi och ëmmer, d'Demande huet seng Aarbecht gemaach an elo si mir frou eis Erfahrung ze deelen, wat fir d'Lieser vun eisem Blog nëtzlech ka sinn - besonnesch well et nach keng aner Materialien iwwer Telepresence um Hub gouf.

Kuerz gesot, alles huet sech net sou grujeleg gewisen. Mir hunn all Aktiounen déi Ausféierung vum Entwéckler erfuerderen an enger Helm Chart Textdatei genannt NOTES.txt. Also, nodeems de Service op Kubernetes ofgebaut gouf, gesäit den Entwéckler Instruktioune fir de lokalen Dev Ëmfeld am GitLab Job Log ze starten:

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

Mir wäerten net am Detail op d'Schrëtt an dëser Instruktioun beschriwwen ... mat Ausnam vun der leschter. Wat geschitt beim Start vun Telepresence?

Schafft mat Telepresence

Beim Startup (mat dem leschte Kommando, deen an den Instruktiounen hei uewen uginn ass), setzen mir:

  • Nummraum an deem de Mikroservice leeft;
  • d'Nimm vun der Détachement an de Container dee mir wëllen duerchdréien.

Déi reschtlech Argumenter sinn fakultativ. Wann eise Service interagéiert mat a fir d'Kubernetes API ServiceAccount erstallt, Mir mussen Certificaten / Tokens op eisem Desktop montéieren. Fir dëst ze maachen, benotzt d'Optioun --mount=true (oder --mount=/dst_path), déi de Root (/) vum Kubernetes Container op eisem Desktop montéiert. Duerno kënne mir (ofhängeg vum OS a wéi d'Applikatioun lancéiert gëtt) d'"Schlësselen" aus dem Cluster benotzen.

Als éischt kucke mer déi universellst Optioun fir eng Applikatioun ze lafen - an engem Docker Container. Fir dëst ze maachen wäerte mir de Schlëssel benotzen --docker-run a montéiert de Verzeichnis mam Code an de Container: -v `pwd`:/app

Notéiert w.e.g. datt dëst ugeholl gëtt aus dem Projetsverzeechnes ze lafen. Den Applikatiounscode gëtt am Verzeechnes montéiert /app an engem Container.

Nächst: -v /tmp/app/var/run/secrets:/var/run/secrets - fir de Verzeechnes mam Zertifikat / Token an e Container ze montéieren.

Dës Optioun gëtt endlech vum Bild gefollegt an deem d'Applikatioun leeft. NB: Wann Dir e Bild baut, musst Dir uginn CMD oder ENTRYPOINT!

Wat genee wäert dann geschéien?

  • Am Kubernetes, fir déi spezifizéiert Deployment, gëtt d'Zuel vun de Repliken op 0 geännert. Amplaz gëtt en neien Deployment gestart - mat engem Ersatzbehälter backend.
  • 2 Container ginn um Desktop gestart: déi éischt mat Telepresence (et wäert Proxy Ufroe vun / op Kubernetes), déi zweet mat der Applikatioun déi entwéckelt gëtt.
  • Wa mir an de Container mat der Applikatioun ausféieren, da sinn all ENV Variablen, déi vum Helm während der Deployment transferéiert ginn, fir eis verfügbar sinn, an all Servicer sinn och verfügbar. Alles wat bleift ass de Code an Ärem Liiblings-IDE z'änneren an d'Resultat ze genéissen.
  • Um Enn vun der Aarbecht musst Dir just den Terminal zoumaachen, an deem Telepresence leeft (d'Sessioun mat Ctrl + C ofschléissen) - Docker Container stoppen um Desktop, an a Kubernetes gëtt alles zréck an säin initialen Zoustand. Alles wat bleift ass engagéieren, de MR erausginn an en iwwerpréiwen / fusionéieren / ... (ofhängeg vun Äre Workflows).

Wa mir d'Applikatioun net an engem Docker Container wëllen ausféieren - zum Beispill, mir entwéckelen net a PHP, mee a Go, a bauen se ëmmer nach lokal - d'Start vun Telepresence wäert nach méi einfach sinn:

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

Wann d'Applikatioun op d'Kubernetes API zougitt, musst Dir de Schlësselverzeichnis montéieren (https://www.telepresence.io/howto/volumes). Et gëtt en Utility fir Linux root:

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

Nodeems Dir Telepresence lancéiert huet ouni d'Optioun --docker-run all Ëmfeldvariablen wäerten am aktuellen Terminal verfügbar sinn, sou datt d'Applikatioun dran lancéiert muss ginn.

NB: Wann Dir zum Beispill PHP benotzt, musst Dir drun erënneren datt Dir verschidde op_cache, apc an aner Beschleuniger fir d'Entwécklung auszeschalten - soss féiert d'Ännerung vum Code net zum gewënschten Resultat.

Resultater

Lokal Entwécklung mat Kubernetes ass e Problem deem seng Léisung am Verhältnis zu der Adoptioun vun dëser Plattform wiisst. Relevant Ufroe vun Entwéckler (vun eise Clienten) kréien, hu mir ugefaang se mat den éischte verfügbare Mëttelen ze léisen, déi sech awer net iwwer laang Strecken bewisen hunn. Glécklecherweis ass dëst net nëmmen elo offensichtlech ginn an net nëmme fir eis, sou datt méi gëeegent Mëttelen op der Welt scho sinn, an Telepresence ass déi bekanntst vun hinnen (iwwregens gëtt et och skaffold vu Google). Eis Erfahrung mat der Benotzung ass nach net sou grouss, awer et gëtt eis scho Grond fir eis "Kollegen am Buttek" ze recommandéieren - probéiert et!

PS

Aner aus der K8s Tipps & Tricks Serie:

Source: will.com

Setzt e Commentaire