
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 . 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:
- 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.
- SÄkuma stadijÄ (konteinerÄ
prepare-app) pÄrsÅ«tiet kodu uzemptyDirlai piekļūtu kodam no lietojumprogrammu konteineriem un SSH servera.

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 :
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, ) 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 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 , 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=trueJa 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 :
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Ä« 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
