Kubernetes tips & tricks: mahitungod sa lokal nga kalamboan ug Telepresence

Kubernetes tips & tricks: mahitungod sa lokal nga kalamboan ug Telepresence

Nagdugang kami nga gipangutana bahin sa pagpalambo sa mga microservice sa Kubernetes. Ang mga developers, ilabina sa gihubad nga mga pinulongan, gusto nga dali nga matul-id ang code sa ilang paborito nga IDE ug makita ang resulta nga dili maghulat sa pagtukod / pag-deploy - pinaagi lamang sa pagpindot sa F5. Ug sa diha nga kini moabut ngadto sa usa ka monolithic nga aplikasyon, kini igo na sa lokal nga pag-instalar sa usa ka database ug sa usa ka web server (sa Docker, VirtualBox...), ug dayon nalingaw sa kalamboan. Sa pagputol sa mga monolith ngadto sa mga microservice ug pag-abot sa Kubernetes, uban ang dagway sa mga dependency sa usag usa, ang tanan kini nahimong mas lisud. Ang daghan niining mga microservice, mas daghang problema. Aron matagamtam pag-usab ang pag-uswag, kinahanglan nimo nga ipataas ang labaw sa usa o duha nga mga sudlanan sa Docker, ug usahay labaw pa sa usa ka dosena ... Sa kinatibuk-an, kining tanan mahimo’g daghang oras, tungod kay kinahanglan usab kini nga ipadayon hangtod karon. .

Sa lain-laing mga panahon kami misulay sa lain-laing mga solusyon sa problema. Ug magsugod ko sa natipon nga mga workaround o yano nga "mga crutches".

1. Mga crutches

Kadaghanan sa mga IDE adunay katakus sa pag-edit sa code direkta sa server gamit ang FTP/SFTP. Kini nga dalan klaro kaayo ug kami nakahukom dayon nga gamiton kini. Ang essence niini gibahin ngadto sa mosunod:

  1. Sa pod sa development environment (dev/review), usa ka dugang nga sudlanan ang gilusad uban sa SSH access ug forwarding sa public SSH key sa developer nga mo-commit/deploy sa aplikasyon.
  2. Sa init nga yugto (sa sulod sa sudlanan prepare-app) ibalhin ang code sa emptyDiraron adunay access sa code gikan sa mga sudlanan sa aplikasyon ug sa SSH server.

Kubernetes tips & tricks: mahitungod sa lokal nga kalamboan ug Telepresence

Aron mas masabtan ang teknikal nga pagpatuman sa maong laraw, maghatag kog mga tipik sa nalambigit nga YAML configurations sa Kubernetes.

Mga pag-configure

1.1. values.yaml

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

kini mao ang vasya.pupkin mao ang bili sa variable ${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. sekreto.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 }}

katapusan nga paghikap

Pagkahuman ang nahabilin mao ang pagbalhin gikinahanglan gitlab-ci.yml variables:

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: ang developer nga naglansad sa deployment mahimong magkonektar pinaagi sa ngalan sa serbisyo (kung giunsa ang luwas nga paghatag access sa cluster, gisulti na namo) gikan sa imong desktop pinaagi sa SFTP ug i-edit ang code nga wala maghulat nga ipadala kini sa cluster.

Kini usa ka bug-os nga nagtrabaho nga solusyon, apan gikan sa usa ka punto sa pagpatuman kini adunay klaro nga mga disbentaha:

  • ang panginahanglan sa pagpino sa Helm chart, nga nagpalisud sa pagbasa sa umaabot;
  • magamit lamang sa tawo nga nag-deploy sa serbisyo;
  • kinahanglan nimong hinumdoman nga i-synchronize kini sa lokal nga direktoryo nga adunay code ug itugyan kini sa Git.

2. Telepresence

Ang proyekto Pagkalain sa kaugalingon nahibal-an na sa dugay na nga panahon, apan kami, ingon sa ilang giingon, "wala makalibut sa seryoso nga pagsulay niini sa praktis." Bisan pa, ang panginahanglan nakahimo sa iyang trabaho ug karon nalipay kami nga ipaambit ang among kasinatian, nga mahimong mapuslanon sa mga magbabasa sa among blog - labi na kay wala pa’y ubang mga materyal bahin sa Telepresence sa hub.

Sa laktud, ang tanan nahimo nga dili kaayo makahadlok. Among gibutang ang tanang mga aksyon nga nagkinahanglan sa pagpatuman sa bahin sa developer sa usa ka Helm chart text file nga gitawag NOTES.txt. Busa, pagkahuman sa pag-deploy sa serbisyo sa Kubernetes, ang developer nakakita sa mga panudlo alang sa paglansad sa lokal nga dev environment sa GitLab job log:

!!! Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСрвиса локально, Π² составС 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
#########################################################################

Dili kami maghisgot sa detalye sa mga lakang nga gihulagway niini nga panudlo ... gawas sa naulahi. Unsa ang mahitabo sa panahon sa paglansad sa Telepresence?

Nagtrabaho sa Telepresence

Sa pagsugod (gamit ang katapusang sugo nga gitakda sa mga instruksyon sa ibabaw), among gibutang:

  • namespace diin ang microservice nagdagan;
  • mga ngalan sa deployment ug sudlanan nga gusto namong sudlan.

Ang nahabilin nga mga argumento kay opsyonal. Kung ang among serbisyo makig-uban ug para sa Kubernetes API Gihimo ang ServiceAccount, kinahanglan namong i-mount ang mga certificate/token sa among desktop. Aron mahimo kini, gamita ang kapilian --mount=true (o --mount=/dst_path), nga mag-mount sa gamut (/) gikan sa sudlanan sa Kubernetes ngadto sa among desktop. Pagkahuman niini, mahimo naton (depende sa OS ug kung giunsa ang paglansad sa aplikasyon) magamit ang "mga yawe" gikan sa cluster.

Una, atong tan-awon ang labing unibersal nga kapilian sa pagpadagan sa usa ka aplikasyon - sa usa ka sudlanan sa Docker. Sa pagbuhat niini atong gamiton ang yawe --docker-run ug i-mount ang direktoryo nga adunay code sa sulud: -v `pwd`:/app

Palihug timan-i nga kini nagtuo nga nagdagan gikan sa direktoryo sa proyekto. Ang code sa aplikasyon i-mount sa direktoryo /app sa usa ka sudlanan.

Sunod: -v /tmp/app/var/run/secrets:/var/run/secrets β€” aron i-mount ang direktoryo nga adunay sertipiko / token sa usa ka sudlanan.

Kini nga kapilian sa katapusan gisundan sa imahe diin ang aplikasyon modagan. NB: Sa paghimo og usa ka imahe, kinahanglan nimong ipiho CMD o ENTRYPOINT!

Unsa man gyud ang sunod nga mahitabo?

  • Sa Kubernetes, alang sa gipiho nga Deployment, ang gidaghanon sa mga replika mausab ngadto sa 0. Hinuon, usa ka bag-ong Deployment ang ilunsad - nga adunay kapuli nga sudlanan backend.
  • 2 nga mga sudlanan ang ilunsad sa desktop: ang una nga adunay Telepresence (kini mag-proxy sa mga hangyo gikan sa/ngadto sa Kubernetes), ang ikaduha uban ang aplikasyon nga gihimo.
  • Kung mag-exec kami sa sudlanan nga adunay aplikasyon, nan ang tanan nga mga variable sa ENV nga gibalhin sa Helm sa panahon sa pag-deploy magamit kanamo, ug ang tanan nga mga serbisyo magamit usab. Ang nahabilin mao ang pag-edit sa code sa imong paborito nga IDE ug pahimusli ang resulta.
  • Sa pagtapos sa trabaho, kinahanglan nimo nga isira ang terminal kung diin nagdagan ang Telepresence (tapuson ang sesyon gamit ang Ctrl + C) - Ang mga sudlanan sa Docker mohunong sa desktop, ug sa Kubernetes ang tanan mobalik sa una nga kahimtang niini. Ang nahabilin mao ang pag-commit, pag-isyu sa MR ug pagbalhin niini aron marepaso/mag-merge/… (depende sa imong mga workflows).

Kung dili namo gusto nga ipadagan ang aplikasyon sa usa ka sudlanan sa Docker - pananglitan, wala kami nag-develop sa PHP, apan sa Go, ug nagtukod gihapon niini sa lokal - ang paglansad sa Telepresence mahimong labi ka simple:

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

Kung ang aplikasyon maka-access sa Kubernetes API, kinahanglan nimo nga i-mount ang direktoryo sa mga yawe (https://www.telepresence.io/howto/volumes). Adunay usa ka utility alang sa Linux gamut:

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

Pagkahuman sa paglansad sa Telepresence nga wala’y kapilian --docker-run ang tanan nga mga variable sa palibot mahimong magamit sa karon nga terminal, busa ang aplikasyon kinahanglan nga ilunsad niini.

NB: Kung gamiton, pananglitan, ang PHP, kinahanglan nimong hinumdoman nga dili nimo ma-disable ang lainlaing op_cache, apc ug uban pang mga accelerator alang sa pag-uswag - kung dili ang pag-edit sa code dili magdala sa gitinguha nga sangputanan.

Mga resulta

Ang lokal nga pag-uswag uban sa Kubernetes usa ka problema kansang solusyon nagkadako nga katimbang sa pagkaylap sa kini nga plataporma. Pagdawat sa may kalabutan nga mga hangyo gikan sa mga developers (gikan sa among mga kliyente), kami nagsugod sa pagsulbad kanila uban sa unang anaa nga paagi, nga, bisan pa niana, wala nagpamatuod sa ilang mga kaugalingon sa taas nga paghakot. Maayo na lang, kini nahimong dayag dili lamang karon ug dili lamang kanato, mao nga ang mas angay nga mga paagi nagpakita na sa kalibutan, ug ang Telepresence mao ang labing inila kanila (sa laing bahin, adunay usab skaffold gikan sa Google). Ang among kasinatian sa paggamit niini dili pa kaayo maayo, apan kini naghatag na kanamo og rason nga irekomendar kini sa among "mga kauban sa tindahan" - sulayi kini!

PS

Ang uban gikan sa K8s tips & tricks series:

Source: www.habr.com

Idugang sa usa ka comment