Kubernetes-ի խորհուրդներ և հնարքներ. տեղական զարգացման և հեռաներկայության մասին

Kubernetes-ի խորհուրդներ և հնարքներ. տեղական զարգացման և հեռաներկայության մասին

Մեզ ավելի ու ավելի են հարցնում Kubernetes-ում միկրոծառայությունների զարգացման մասին: Մշակողները, հատկապես մեկնաբանվող լեզուների, ցանկանում են արագ շտկել կոդը իրենց սիրելի IDE-ում և տեսնել արդյունքը՝ չսպասելով կառուցմանը/տեղակայմանը, պարզապես սեղմելով F5: Իսկ երբ խոսքը գնում էր մոնոլիտ հավելվածի մասին, բավական էր տեղայնորեն տեղադրել տվյալների բազան և վեբ սերվերը (Docker-ում, VirtualBox-ում...), իսկ հետո անմիջապես վայելեք զարգացումը։ Մոնոլիտները միկրոսերվիսների կտրմամբ և Կուբերնետեսի ժամանումով, միմյանցից կախվածությունների ի հայտ գալով, ամեն ինչ մի քիչ ավելի դժվարացավ. Որքան շատ լինեն այս միկրոծառայությունները, այնքան ավելի շատ խնդիրներ: Զարգացումը կրկին վայելելու համար պետք է բարձրացնել մեկ կամ երկու Docker կոնտեյներ, իսկ երբեմն նույնիսկ մեկ տասնյակից ավելի... Ընդհանուր առմամբ, այս ամենը կարող է բավականին շատ ժամանակ խլել, քանի որ այն նույնպես պետք է արդիականացվի: .

Տարբեր ժամանակներում մենք փորձեցինք խնդրի տարբեր լուծումներ։ Եվ ես կսկսեմ կուտակված լուծումներից կամ պարզապես «հենակներից»:

1. Հենակներ

IDE-ների մեծ մասը հնարավորություն ունի խմբագրել կոդը անմիջապես սերվերի վրա՝ օգտագործելով FTP/SFTP: Այս ճանապարհը շատ ակնհայտ է, և մենք անմիջապես որոշեցինք օգտագործել այն։ Դրա էությունը հանգում է հետևյալին.

  1. Զարգացման միջավայրերի բլոկում (dev/review) գործարկվում է լրացուցիչ կոնտեյներ՝ SSH հասանելիությամբ և վերահասցեավորում է մշակողի հանրային SSH բանալին, որը կհանձնի/տեղակայի հավելվածը:
  2. Սկզբնական փուլում (տարայի ներսում prepare-app) փոխանցեք կոդը emptyDirհավելվածի կոնտեյներներից և SSH սերվերից կոդ մուտք ունենալու համար:

Kubernetes-ի խորհուրդներ և հնարքներ. տեղական զարգացման և հեռաներկայության մասին

Նման սխեմայի տեխնիկական իրագործումը ավելի լավ հասկանալու համար ես կտրամադրեմ ներգրավված YAML կոնֆիգուրացիաների հատվածներ Kubernetes-ում:

Կազմաձևերը

1.1. արժեքներ.yaml

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

Այստեղ vasya.pupkin փոփոխականի արժեքն է ${GITLAB_USER_LOGIN}.

1.2. տեղակայում.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. գաղտնիք.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 }}

Վերջնական հպում

Դրանից հետո մնում է միայն տեղափոխել անհրաժեշտ 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. ծրագրավորողը, ով գործարկել է տեղակայումը, կարող է միանալ ծառայության անունով (ինչպես ապահով կերպով մուտք գործել կլաստերի, մենք արդեն պատմել ենք) ձեր աշխատասեղանից SFTP-ի միջոցով և խմբագրեք կոդը՝ չսպասելով, որ այն կառաքվի կլաստերին:

Սա լիովին աշխատանքային լուծում է, բայց իրականացման տեսանկյունից այն ունի ակնհայտ թերություններ.

  • Helm աղյուսակը ճշգրտելու անհրաժեշտությունը, ինչը դժվարացնում է ապագայում կարդալը.
  • կարող է օգտագործվել միայն այն անձի կողմից, ով տեղակայել է ծառայությունը.
  • դուք պետք է հիշեք, որ այնուհետև այն համաժամացնեք տեղական գրացուցակի հետ կոդի հետ և հանձնեք այն Git-ին:

2. Հեռաներկայություն

Ծրագիր Հեռուստատեսություն հայտնի է բավականին երկար ժամանակ, բայց մենք, ինչպես ասում են, «չենք հասցրել լրջորեն փորձել դա գործնականում»։ Այնուամենայնիվ, պահանջարկն արել է իր գործը, և այժմ մենք ուրախ ենք կիսվել մեր փորձով, որը կարող է օգտակար լինել մեր բլոգի ընթերցողներին, հատկապես, որ հանգույցում Telepresence-ի մասին այլ նյութեր դեռ չկան:

Մի խոսքով, ամեն ինչ այնքան էլ սարսափելի չէր։ Մենք տեղադրեցինք բոլոր գործողությունները, որոնք պահանջում են կատարում մշակողի կողմից Helm աղյուսակի տեքստային ֆայլում, որը կոչվում է NOTES.txt. Այսպիսով, ծառայությունը Kubernetes-ում տեղակայելուց հետո ծրագրավորողը 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
#########################################################################

Այս հրահանգում նկարագրված քայլերին մանրամասն չենք անդրադառնա... բացառությամբ վերջինի։ Ի՞նչ է տեղի ունենում Telepresence-ի գործարկման ժամանակ:

Աշխատում է Telepresence-ի հետ

Գործարկման ժամանակ (օգտագործելով վերը նշված հրահանգներում նշված վերջին հրամանը), մենք սահմանեցինք.

  • անունների տարածություն, որտեղ աշխատում է միկրոսերվիսը.
  • տեղակայման և կոնտեյների անունները, որոնք մենք ցանկանում ենք թափանցել:

Մնացած փաստարկները կամընտիր են: Եթե ​​մեր ծառայությունը փոխազդում է Kubernetes API-ի հետ և դրա համար Ստեղծվել է ծառայության հաշիվ, մենք պետք է սերտիֆիկատներ/նշաններ տեղադրենք մեր աշխատասեղանին: Դա անելու համար օգտագործեք տարբերակը --mount=true (Կամ --mount=/dst_path), որը կտեղադրի արմատը (/) Kubernetes կոնտեյներից մեր աշխատասեղանին: Դրանից հետո մենք կարող ենք (կախված ՕՀ-ից և հավելվածի գործարկման եղանակից) օգտագործել կլաստերի «ստեղները»:

Նախ, եկեք տեսնենք հավելվածի գործարկման ամենաունիվերսալ տարբերակը՝ Docker կոնտեյներով: Դա անելու համար մենք կօգտագործենք բանալին --docker-run և տեղադրեք կոդով գրացուցակը կոնտեյների մեջ. -v `pwd`:/app

Խնդրում ենք նկատի ունենալ, որ սա ենթադրում է առաջադրվել ծրագրի գրացուցակից: Դիմումի կոդը կտեղադրվի գրացուցակում /app տարայի մեջ։

Հաջորդը -v /tmp/app/var/run/secrets:/var/run/secrets — վկայագրի/նշանով գրացուցակը կոնտեյների մեջ տեղադրելու համար:

Այս տարբերակին վերջապես հաջորդում է պատկերը, որում կաշխատի հավելվածը։ NBՊատկեր կառուցելիս պետք է նշեք CMD կամ ENTRYPOINT!

Կոնկրետ ի՞նչ է լինելու հետո։

  • Kubernetes-ում, նշված տեղակայման համար, կրկնօրինակների թիվը կփոխվի 0-ի: Փոխարենը կգործարկվի նոր տեղակայում` փոխարինող կոնտեյներով: backend.
  • 2 կոնտեյներ կգործարկվի աշխատասեղանին. առաջինը Telepresence-ով (այն կուղարկի վստահված անձի հարցումներ Kubernetes-ից/դեպի), երկրորդը՝ մշակվող հավելվածով:
  • Եթե ​​մենք գործարկենք հավելվածի կոնտեյների մեջ, ապա տեղակայման ընթացքում Helm-ի կողմից փոխանցված բոլոր ENV փոփոխականները հասանելի կլինեն մեզ, և բոլոր ծառայությունները նույնպես հասանելի կլինեն: Մնում է միայն խմբագրել կոդը ձեր սիրելի IDE-ում և վայելել արդյունքը:
  • Աշխատանքի վերջում պարզապես անհրաժեշտ է փակել տերմինալը, որում աշխատում է Telepresence-ը (դադարեցնել նիստը Ctrl+C-ով) - Docker կոնտեյներները կկանգնեն աշխատասեղանի վրա, իսկ Kubernetes-ում ամեն ինչ կվերադառնա իր սկզբնական վիճակին: Մնում է միայն հանձնել, թողարկել MR և փոխանցել այն վերանայման/միաձուլման/… (կախված ձեր աշխատանքային հոսքերից):

Եթե ​​մենք չենք ցանկանում գործարկել հավելվածը Docker կոնտեյներով, օրինակ, մենք զարգացնում ենք ոչ թե PHP-ում, այլ Go-ում, և դեռ այն կառուցում ենք տեղում, Telepresence-ի գործարկումն էլ ավելի պարզ կլինի.

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

Եթե ​​հավելվածը մուտք է գործում Kubernetes API, դուք պետք է տեղադրեք բանալիների գրացուցակը (https://www.telepresence.io/howto/volumes): Linux-ի համար օգտակար ծրագիր կա արմատ:

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

Telepresence-ն առանց տարբերակի գործարկելուց հետո --docker-run շրջակա միջավայրի բոլոր փոփոխականները հասանելի կլինեն ընթացիկ տերմինալում, ուստի հավելվածը պետք է գործարկվի դրանում:

NBՕրինակ՝ PHP-ն օգտագործելիս պետք է հիշել, որ անջատեք տարբեր op_cache, apc և այլ արագացուցիչներ մշակման համար, այլապես կոդը խմբագրելը չի ​​հանգեցնի ցանկալի արդյունքի:

Արդյունքները

Kubernetes-ի հետ տեղական զարգացումը խնդիր է, որի լուծումն աճում է այս հարթակի տարածմանը համաչափ: Ստանալով համապատասխան հարցումներ ծրագրավորողներից (մեր հաճախորդներից), մենք սկսեցինք լուծել դրանք առաջին հասանելի միջոցներով, որոնք, սակայն, երկար ժամանակ իրենց չապացուցեցին: Բարեբախտաբար, սա ակնհայտ է դարձել ոչ միայն հիմա և ոչ միայն մեզ համար, ուստի աշխարհում արդեն հայտնվել են ավելի հարմար միջոցներ, որոնցից ամենահայտնին Telepresence-ն է (ի դեպ, կա նաև. փայտամած Google-ից): Այն օգտագործելու մեր փորձը դեռ այնքան էլ մեծ չէ, բայց դա արդեն հիմք է տալիս խորհուրդ տալ այն մեր «խանութի գործընկերներին». փորձեք այն:

PS

Այլ K8s խորհուրդներ և հնարքներ շարքից.

Source: www.habr.com

Добавить комментарий