Kubernetes padomi un triki: par vietējo attīstību un telepresence

Kubernetes padomi un triki: par vietējo attīstību un telepresence

Mums arvien biežāk tiek jautāts par mikropakalpojumu attÄ«stÄ«bu Kubernetes. Izstrādātāji, Ä«paÅ”i tulkoto valodu, vēlas ātri izlabot kodu savā iecienÄ«tākajā IDE un redzēt rezultātu, negaidot izveidi/izvietoÅ”anu — vienkārÅ”i nospiežot taustiņu F5. Un, runājot par monolÄ«tu lietojumprogrammu, pietika ar datu bāzes un tÄ«mekļa servera lokālu instalēŔanu (Docker, VirtualBox ...), un pēc tam nekavējoties izbaudiet attÄ«stÄ«bu. Ar monolÄ«tu sagrieÅ”anu mikropakalpojumos un Kubernetes ienākÅ”anu, parādoties atkarÄ«bām vienam no otra, viss kļuva nedaudz grÅ«tāk. Jo vairāk Å”o mikropakalpojumu, jo vairāk problēmu. Lai atkal izbaudÄ«tu attÄ«stÄ«bu, ir jāpaceļ vairāk nekā viens vai divi Docker konteineri, un dažreiz pat vairāk nekā ducis... Kopumā tas viss var aizņemt diezgan daudz laika, jo arÄ« tas ir jāatjaunina. .

Dažādos laikos mēs izmēģinājām dažādus problēmas risinājumus. Un sākÅ”u ar uzkrātajiem risinājumiem jeb vienkārÅ”iem ā€œkruÄ·iemā€.

1. KruÄ·i

Lielākajai daļai IDE ir iespēja rediģēt kodu tieÅ”i serverÄ«, izmantojot FTP/SFTP. Å is ceļŔ ir ļoti acÄ«mredzams, un mēs nekavējoties nolēmām to izmantot. Tās bÅ«tÄ«ba ir Ŕāda:

  1. Izstrādes vidi (izstrādātājs/pārskatīŔana) tiek palaists papildu konteiners ar SSH piekļuvi un tā izstrādātāja publiskās SSH atslēgas pārsÅ«tīŔanu, kurÅ” veiks/izvietos lietojumprogrammu.
  2. Sākuma stadijā (konteinerā prepare-app) pārsūtiet kodu uz emptyDirlai piekļūtu kodam no lietojumprogrammu konteineriem un SSH servera.

Kubernetes padomi un triki: par vietējo attīstību un telepresence

Lai labāk izprastu Ŕādas shēmas tehnisko realizāciju, sniegÅ”u Kubernetes iesaistÄ«to YAML konfigurāciju fragmentus.

Konfigurācijas

1.1. vērtības.yaml

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

Šeit vasya.pupkin ir mainīgā vērtība ${GITLAB_USER_LOGIN}.

1.2. izvietoŔana.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. noslēpums.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 }}

Galīgais pieskāriens

Pēc tam atliek tikai pārsÅ«tÄ«t nepiecieÅ”amie gitlab-ci.yml mainÄ«gie:

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: izstrādātājs, kurÅ” uzsāka izvietoÅ”anu, var izveidot savienojumu, izmantojot pakalpojuma nosaukumu (kā droÅ”i pieŔķirt piekļuvi klasterim, mēs jau teicām) no darbvirsmas, izmantojot SFTP, un rediģējiet kodu, negaidot, lÄ«dz tas tiks piegādāts klasterim.

Å is ir pilnÄ«bā funkcionējoÅ”s risinājums, taču no ievieÅ”anas viedokļa tam ir acÄ«mredzami trÅ«kumi:

  • nepiecieÅ”amÄ«ba precizēt Helm diagrammu, kas apgrÅ«tina lasīŔanu nākotnē;
  • var izmantot tikai persona, kas izvietojusi pakalpojumu;
  • jums jāatceras, ka pēc tam tas jāsinhronizē ar vietējo direktoriju ar kodu un jāiekļauj Git.

2. Telepresence

Projekts Tele klātbÅ«tne ir zināms jau diezgan ilgu laiku, bet mēs, kā saka, ā€œnespējām to nopietni izmēģināt praksÄ“ā€. Tomēr pieprasÄ«jums ir darÄ«jis savu, un tagad mēs ar prieku dalāmies pieredzē, kas var noderēt mÅ«su emuāra lasÄ«tājiem - jo Ä«paÅ”i tāpēc, ka centrmezglā vēl nav bijuÅ”i citi materiāli par Telepresence.

ÄŖsāk sakot, viss izrādÄ«jās ne tik biedējoÅ”i. Visas darbÄ«bas, kuras izstrādātājam ir jāizpilda, mēs ievietojām Helm diagrammas teksta failā, ko sauc NOTES.txt. Tādējādi pēc pakalpojuma izvietoÅ”anas Kubernetes izstrādātājs GitLab darbu žurnālā redz instrukcijas vietējās izstrādātāja vides palaiÅ”anai:

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

Mēs sÄ«kāk neapspriedÄ«sim Å”ajā instrukcijā aprakstÄ«tās darbÄ«bas... izņemot pēdējo. Kas notiek Telepresence palaiÅ”anas laikā?

Darbs ar Telepresence

Startējot (izmantojot pēdējo komandu, kas norādÄ«ta iepriekÅ” sniegtajos norādÄ«jumos), mēs iestatÄ«jām:

  • nosaukumu telpa, kurā darbojas mikropakalpojums;
  • izvietoÅ”anas un konteinera nosaukumi, kuros vēlamies iekļūt.

Pārējie argumenti nav obligāti. Ja mÅ«su pakalpojums mijiedarbojas ar Kubernetes API un par to Pakalpojuma konts ir izveidots, mums ir jāmontē sertifikāti/marÄ·ieri uz mÅ«su darbvirsmas. Lai to izdarÄ«tu, izmantojiet opciju --mount=true (Vai --mount=/dst_path), kas pievienos sakni (/) no Kubernetes konteinera mÅ«su darbvirsmā. Pēc tam mēs varam (atkarÄ«bā no OS un lietojumprogrammas palaiÅ”anas veida) izmantot klastera ā€œtaustiņusā€.

Vispirms apskatÄ«sim universālāko lietojumprogrammas palaiÅ”anas iespēju - Docker konteinerā. Lai to izdarÄ«tu, mēs izmantosim atslēgu --docker-run un pievienojiet direktoriju ar kodu konteinerā: -v `pwd`:/app

Lūdzu, ņemiet vērā, ka tas tiek veikts no projekta direktorijas. Lietojumprogrammas kods tiks uzstādīts direktorijā /app konteinerā.

Nākamais: -v /tmp/app/var/run/secrets:/var/run/secrets — uzstādÄ«t direktoriju ar sertifikātu/marÄ·ieri konteinerā.

Pēc Ŕīs opcijas beidzot tiek parādÄ«ts attēls, kurā lietojumprogramma darbosies. NB: veidojot attēlu, jums ir jānorāda CMD vai ENTRYPOINT!

Kas tieŔi notiks tālāk?

  • Programmā Kubernetes norādÄ«tajai izvietoÅ”anai reprodukciju skaits tiks mainÄ«ts uz 0. Tā vietā tiks palaists jauns izvietojums ā€” ar aizstājēju konteineru. backend.
  • Uz darbvirsmas tiks palaisti 2 konteineri: pirmais ar Telepresence (tā starpniekservera pieprasÄ«jumus no/uz Kubernetes), otrais ar lietojumprogrammu, kas tiek izstrādāta.
  • Ja mēs izpildÄ«sim konteinerā ar lietojumprogrammu, mums bÅ«s pieejami visi Helm izvietoÅ”anas laikā pārsÅ«tÄ«tie ENV mainÄ«gie, kā arÄ« visi pakalpojumi. Atliek tikai rediģēt kodu savā iecienÄ«tākajā IDE un baudÄ«t rezultātu.
  • Darba beigās jums vienkārÅ”i jāaizver terminālis, kurā darbojas Telepresence (pārtrauciet sesiju ar Ctrl+C) - Docker konteineri apstāsies uz darbvirsmas, un Kubernetes viss atgriezÄ«sies sākotnējā stāvoklÄ«. Atliek tikai apņemties, izsniegt MR un pārsÅ«tÄ«t to pārskatīŔanai/apvienoÅ”anai/… (atkarÄ«bā no jÅ«su darbplÅ«smām).

Ja mēs nevēlamies palaist lietojumprogrammu Docker konteinerā ā€” piemēram, mēs izstrādājam nevis PHP, bet gan Go un joprojām veidojam to lokāli, Telepresence palaiÅ”ana bÅ«s vēl vienkārŔāka:

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

Ja jūsu lietojumprogramma piekļūst Kubernetes API, jums būs jāpievieno direktorijs ar atslēgām (https://www.telepresence.io/howto/volumes). Linux tur ir lietderība sakne:

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

Pēc Telepresence palaiÅ”anas bez opcijas --docker-run visi vides mainÄ«gie bÅ«s pieejami paÅ”reizējā terminālÄ«, tāpēc lietojumprogramma ir jāpalaiž tajā.

NB: Lietojot, piemēram, PHP, jāatceras izstrādei atslēgt dažādus op_cache, apc un citus paātrinātājus - pretējā gadÄ«jumā koda rediģēŔana nenovedÄ«s pie vēlamā rezultāta.

Rezultāti

Vietējā attÄ«stÄ«ba ar Kubernetes ir problēma, kuras risinājums pieaug proporcionāli Ŕīs platformas izplatÄ«bai. Saņemot attiecÄ«gus pieprasÄ«jumus no izstrādātājiem (no mÅ«su klientiem), mēs sākām tos risināt ar pirmajiem pieejamajiem lÄ«dzekļiem, kas tomēr nav pierādÄ«juÅ”i sevi ilgtermiņā. Par laimi, tas ir kļuvis acÄ«mredzams ne tikai tagad un ne tikai mums, tāpēc pasaulē jau ir parādÄ«juÅ”ies piemērotāki lÄ«dzekļi, un Telepresence ir slavenākais no tiem (starp citu, ir arÄ« sastatnes no Google). MÅ«su lietoÅ”anas pieredze vēl nav tik liela, taču tā jau dod pamatu to ieteikt mÅ«su ā€œkolēģiem veikalÄā€ – izmēģiniet!

PS

Citi no K8s padomu un triku sērijas:

Avots: www.habr.com

Iegādājieties uzticamu mitināŔanu vietnēm ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa vietņu mitināŔanu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster