Vidokezo na mbinu za Kubernetes: kuhusu maendeleo ya ndani na Telepresence

Vidokezo na mbinu za Kubernetes: kuhusu maendeleo ya ndani na Telepresence

Tunazidi kuulizwa kuhusu kutengeneza huduma ndogo katika Kubernetes. Wasanidi programu, haswa wa lugha zilizotafsiriwa, wanataka kusahihisha msimbo haraka katika IDE wanayopenda na kuona matokeo bila kungoja kujenga/kupeleka - kwa kubonyeza F5. Na ilipofika kwa maombi ya monolithic, ilikuwa ya kutosha kufunga hifadhidata ndani ya nchi na seva ya wavuti (katika Docker, VirtualBox ...), na kisha kufurahia maendeleo mara moja. Kwa kukatwa kwa monoliths kwenye huduma ndogo na kuwasili kwa Kubernetes, na kuonekana kwa utegemezi kwa kila mmoja, kila kitu. ilikua ngumu kidogo. Zaidi ya microservices hizi, matatizo zaidi. Ili kufurahia maendeleo tena, unahitaji kuongeza vyombo zaidi ya moja au mbili za Docker, na wakati mwingine hata zaidi ya dazeni ... Kwa ujumla, yote haya yanaweza kuchukua muda mwingi, kwani pia inahitaji kusasishwa. .

Kwa nyakati tofauti tulijaribu suluhisho tofauti kwa shida. Na nitaanza na kazi zilizokusanywa au "magongo" tu.

1. Magongo

IDE nyingi zina uwezo wa kuhariri msimbo moja kwa moja kwenye seva kwa kutumia FTP/SFTP. Njia hii ni dhahiri sana na mara moja tuliamua kuitumia. Asili yake ni chini ya yafuatayo:

  1. Katika sehemu ya mazingira ya usanidi (dev/hakiki), kontena la ziada linazinduliwa na ufikiaji wa SSH na kusambaza ufunguo wa umma wa SSH wa msanidi ambaye atatuma/kutuma programu.
  2. Katika hatua ya awali (ndani ya chombo prepare-app) kuhamisha msimbo kwa emptyDirkupata msimbo kutoka kwa vyombo vya programu na seva ya SSH.

Vidokezo na mbinu za Kubernetes: kuhusu maendeleo ya ndani na Telepresence

Ili kuelewa vyema utekelezaji wa kiufundi wa mpango kama huo, nitatoa vipande vya usanidi wa YAML unaohusika katika Kubernetes.

Mipangilio

1.1. maadili.yaml

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

Hapa vasya.pupkin ni thamani ya kutofautiana ${GITLAB_USER_LOGIN}.

1.2. kupelekwa.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. siri.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 }}

mguso wa mwisho

Baada ya hapo kilichobaki ni kuhamisha vigezo vinavyohitajika vya gitlab-ci.yml:

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: msanidi programu aliyezindua uwekaji anaweza kuunganisha kwa jina la huduma (jinsi ya kutoa ufikiaji kwa nguzo kwa usalama, tayari tuliambia) kutoka kwa eneo-kazi lako kupitia SFTP na uhariri msimbo bila kungoja uwasilishwe kwenye nguzo.

Hili ni suluhisho la kufanya kazi kabisa, lakini kutoka kwa mtazamo wa utekelezaji lina shida dhahiri:

  • haja ya kuboresha chati ya Helm, ambayo inafanya kuwa vigumu kusoma katika siku zijazo;
  • inaweza kutumika tu na mtu aliyepeleka huduma;
  • unahitaji kukumbuka kisha kuisawazisha na saraka ya ndani na nambari na kuikabidhi kwa Git.

2. Telepresence

Mradi telepresence imekuwa ikijulikana kwa muda mrefu, lakini sisi, kama wasemavyo, "hatukuweza kujaribu kwa bidii kwa vitendo." Hata hivyo, mahitaji yamefanya kazi yake na sasa tuna furaha kushiriki uzoefu wetu, ambao unaweza kuwa na manufaa kwa wasomaji wa blogu yetu - hasa kwa vile kumekuwa hakuna nyenzo nyingine kuhusu Telepresence kwenye kitovu bado.

Kwa kifupi, kila kitu kiligeuka kuwa sio cha kutisha sana. Tuliweka vitendo vyote vinavyohitaji utekelezaji kutoka kwa msanidi programu katika faili ya maandishi ya chati ya Helm inayoitwa NOTES.txt. Kwa hivyo, baada ya kupeleka huduma kwa Kubernetes, msanidi programu huona maagizo ya kuzindua mazingira ya ndani ya dev kwenye logi ya kazi ya 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
#########################################################################

Hatutakaa kwa undani juu ya hatua zilizoelezewa katika maagizo haya ... isipokuwa ya mwisho. Nini kinatokea wakati wa uzinduzi wa Telepresence?

Kufanya kazi na Telepresence

Wakati wa kuanza (kwa kutumia amri ya mwisho iliyoainishwa katika maagizo hapo juu), tunaweka:

  • nafasi ya jina ambayo microservice inafanya kazi;
  • majina ya kupelekwa na kontena tunataka kupenya.

Hoja zilizobaki ni za hiari. Ikiwa huduma yetu itaingiliana na kwa API ya Kubernetes Akaunti ya Huduma imeundwa, tunahitaji kupachika vyeti/tokeni kwenye eneo-kazi letu. Ili kufanya hivyo, tumia chaguo --mount=true (Au --mount=/dst_path), ambayo itaweka mzizi (/) kutoka kwa chombo cha Kubernetes hadi kwenye eneo-kazi letu. Baada ya hayo, tunaweza (kulingana na OS na jinsi programu imezinduliwa) kutumia "funguo" kutoka kwa nguzo.

Kwanza, hebu tuangalie chaguo la ulimwengu wote la kuendesha programu - kwenye chombo cha Docker. Kwa kufanya hivyo tutatumia ufunguo --docker-run na weka saraka na nambari kwenye chombo: -v `pwd`:/app

Tafadhali kumbuka kuwa hii inachukua kutoka kwa saraka ya mradi. Nambari ya maombi itawekwa kwenye saraka /app kwenye chombo.

Next: -v /tmp/app/var/run/secrets:/var/run/secrets β€” kuweka saraka pamoja na cheti/ishara kwenye chombo.

Chaguo hili hatimaye linafuatwa na picha ambayo programu itaendesha. NB: Wakati wa kujenga picha, lazima ueleze CMD au ENTRYPOINT!

Nini hasa kitatokea?

  • Katika Kubernetes, kwa Usambazaji uliobainishwa, idadi ya nakala itabadilishwa hadi 0. Badala yake, Usambazaji mpya utazinduliwa - na kontena mbadala. backend.
  • Vyombo 2 vitazinduliwa kwenye eneo-kazi: la kwanza likiwa na Telepresence (itatuma ombi la seva mbadala kutoka/kwenda Kubernetes), la pili likiwa na programu inayotengenezwa.
  • Ikiwa tutatekeleza kwenye kontena na programu, basi vigeu vyote vya ENV vilivyohamishwa na Helm wakati wa kupeleka vitapatikana kwetu, na huduma zote pia zitapatikana. Kilichosalia ni kuhariri msimbo katika IDE yako uipendayo na ufurahie matokeo.
  • Mwishoni mwa kazi, unahitaji tu kufunga terminal ambayo Telepresence inaendesha (sitisha kikao na Ctrl + C) - Vyombo vya Docker vitaacha kwenye desktop, na katika Kubernetes kila kitu kitarudi kwenye hali yake ya awali. Kilichosalia ni kujitolea, kutoa MR na kuihamisha kukagua/kuunganisha/... (kulingana na mtiririko wako wa kazi).

Ikiwa hatutaki kuendesha programu kwenye kontena la Docker - kwa mfano, hatuendelezi katika PHP, lakini katika Go, na bado tunaijenga ndani - kuzindua Telepresence itakuwa rahisi zaidi:

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

Ikiwa programu itafikia API ya Kubernetes, utahitaji kuweka saraka ya vitufe (https://www.telepresence.io/howto/volumes). Kuna matumizi ya Linux mzizi:

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

Baada ya kuzindua Telepresence bila chaguo --docker-run anuwai zote za mazingira zitapatikana kwenye terminal ya sasa, kwa hivyo programu lazima izinduliwe ndani yake.

NB: Unapotumia, kwa mfano, PHP, lazima ukumbuke kuzima op_cache mbalimbali, apc na vichapuzi vingine kwa ajili ya maendeleo - vinginevyo kuhariri msimbo hautasababisha matokeo unayotaka.

Matokeo ya

Maendeleo ya ndani na Kubernetes ni tatizo ambalo ufumbuzi wake unakua kulingana na kuenea kwa jukwaa hili. Kupokea maombi muhimu kutoka kwa watengenezaji (kutoka kwa wateja wetu), tulianza kutatua kwa njia za kwanza zilizopo, ambazo, hata hivyo, hazikujidhihirisha wenyewe kwa muda mrefu. Kwa bahati nzuri, hii imekuwa dhahiri sio sasa tu na sio kwetu tu, kwa hivyo njia zinazofaa zaidi tayari zimeonekana ulimwenguni, na Telepresence ndio maarufu zaidi kati yao (kwa njia, pia kuna. skafu kutoka Google). Uzoefu wetu wa kuitumia bado sio mzuri sana, lakini tayari inatupa sababu ya kuipendekeza kwa "wenzetu kwenye duka" - ijaribu!

PS

Nyingine kutoka kwa safu za vidokezo na hila za K8s:

Chanzo: mapenzi.com

Kuongeza maoni