Kubernetes məsləhətləri və fəndləri: yerli inkişaf və Telepresence haqqında

Kubernetes məsləhətləri və fəndləri: yerli inkişaf və Telepresence haqqında

Bizdən Kubernetes-də mikroxidmətlərin inkişafı ilə bağlı daha çox sual verilir. Tərtibatçılar, xüsusən də tərcümə edilmiş dillər, sadəcə F5 düyməsini sıxmaqla öz sevimli IDE-də kodu tez düzəltmək və nəticəni qurmaq/yerləşdirməni gözləmədən görmək istəyirlər. Monolit tətbiqə gəldikdə isə, yerli olaraq verilənlər bazası və veb serveri (Docker, VirtualBox-da...) quraşdırmaq və sonra dərhal inkişafdan həzz almaq kifayət idi. Monolitlərin mikroservislərə kəsilməsi və Kubernetes-in gəlməsi, bir-birindən asılılıqların görünməsi ilə hər şey bir az çətinləşdi. Bu mikroxidmətlər nə qədər çox olarsa, problemlər də bir o qədər çox olar. Yenidən inkişafdan həzz almaq üçün bir və ya iki Docker konteynerini, bəzən isə ondan çoxunu qaldırmaq lazımdır... Ümumiyyətlə, bütün bunlar kifayət qədər çox vaxt apara bilər, çünki onu da yeniləmək lazımdır. .

Müxtəlif vaxtlarda problemin müxtəlif həll yollarını sınadıq. Mən yığılmış həll yolları və ya sadəcə "dəyənəklər" ilə başlayacağam.

1. Dəstəklər

Əksər IDE-lər FTP/SFTP istifadə edərək birbaşa serverdə kodu redaktə etmək imkanına malikdir. Bu yol çox açıqdır və biz dərhal ondan istifadə etmək qərarına gəldik. Onun mahiyyəti aşağıdakılardan qaynaqlanır:

  1. İnkişaf mühitləri bölməsində (dev/nəzərdən) əlavə konteyner SSH girişi ilə işə salınır və tətbiqi həyata keçirəcək/yerləşdirəcək tərtibatçının ictimai SSH açarını yönləndirir.
  2. Başlanğıc mərhələdə (qabın içərisində prepare-app) kodu köçürün emptyDirproqram konteynerlərindən və SSH serverindən koda giriş əldə etmək.

Kubernetes məsləhətləri və fəndləri: yerli inkişaf və Telepresence haqqında

Belə bir sxemin texniki həyata keçirilməsini daha yaxşı başa düşmək üçün mən Kubernetes-də cəlb edilmiş YAML konfiqurasiyalarının fraqmentlərini təqdim edəcəyəm.

Konfiqurasiyalar

1.1. dəyərlər.yaml

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

Burada vasya.pupkin dəyişənin qiymətidir ${GITLAB_USER_LOGIN}.

1.2. yerləşdirmə.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. gizli.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 }}

Final toxunuşu

Bundan sonra yalnız transfer etmək qalır tələb olunan gitlab-ci.yml dəyişənləri:

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: yerləşdirməni işə salan tərtibatçı xidmət adı ilə qoşula bilər (klasterə təhlükəsiz girişi necə vermək olar, artıq dedik) SFTP vasitəsilə masaüstünüzdən çıxarın və kodun klasterə çatdırılmasını gözləmədən redaktə edin.

Bu, tamamilə işləyən bir həlldir, lakin həyata keçirilməsi baxımından onun aşkar mənfi cəhətləri var:

  • gələcəkdə oxumağı çətinləşdirən Helm cədvəlini dəqiqləşdirmək ehtiyacı;
  • yalnız xidmətdən istifadə edən şəxs tərəfindən istifadə edilə bilər;
  • sonra onu kodla yerli qovluqla sinxronizasiya etməyi və Git-ə təhvil verməyi yadda saxlamalısınız.

2. Telepresensiya

Layihə Telepresensiya kifayət qədər uzun müddətdir tanınır, lakin biz, necə deyərlər, "təcrübədə ciddi şəkildə sınaqdan keçirə bilmədik". Bununla belə, tələb öz işini gördü və indi biz öz təcrübəmizi bölüşməkdən məmnunuq, bu, blogumuzun oxucuları üçün faydalı ola bilər - xüsusən də mərkəzdə Telepresence haqqında başqa materiallar hələ olmadığı üçün.

Bir sözlə, hər şey o qədər də qorxulu olmadığı ortaya çıxdı. Biz tərtibatçı tərəfindən icrasını tələb edən bütün hərəkətləri Helm diaqramı adlı mətn faylına yerləşdirdik. NOTES.txt. Beləliklə, xidməti Kubernetes-də yerləşdirdikdən sonra tərtibatçı GitLab iş jurnalında yerli inkişaf mühitinin işə salınması üçün təlimatları görür:

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

Bu təlimatda təsvir olunan addımlar üzərində ətraflı dayanmayacağıq... sonuncu istisna olmaqla. Telepresence-in işə salınması zamanı nə baş verir?

Telepresence ilə işləmək

Başlanğıcda (yuxarıdakı təlimatlarda göstərilən son əmrdən istifadə edərək) biz təyin edirik:

  • mikroservisin işlədiyi ad sahəsi;
  • Nüfuz etmək istədiyimiz yerləşdirmə və konteyner adları.

Qalan arqumentlər isteğe bağlıdır. Xidmətimiz Kubernetes API ilə və onunla qarşılıqlı əlaqədə olarsa ServiceAcount yaradıldı, iş masamıza sertifikatlar/tokenlər quraşdırmalıyıq. Bunu etmək üçün seçimdən istifadə edin --mount=true (Və ya --mount=/dst_path), kökü (/) Kubernetes konteynerindən iş masamıza quraşdıracaq. Bundan sonra biz (ƏS-dən və tətbiqin necə işə salınmasından asılı olaraq) klasterdəki “açarlardan” istifadə edə bilərik.

Birincisi, tətbiqi işə salmaq üçün ən universal varianta - Docker konteynerində baxaq. Bunu etmək üçün açardan istifadə edəcəyik --docker-run və kodu olan kataloqu konteynerə quraşdırın: -v `pwd`:/app

Nəzərə alın ki, bu, layihə kataloqundan işləməyi nəzərdə tutur. Tətbiq kodu kataloqa quraşdırılacaq /app bir konteynerdə.

Növbəti: -v /tmp/app/var/run/secrets:/var/run/secrets — kataloqu sertifikat/token ilə konteynerə quraşdırmaq üçün.

Bu seçimdən sonra nəhayət tətbiqin işləyəcəyi şəkil gəlir. NB: Şəkil qurarkən, müəyyən etməlisiniz CMD və ya ENTRYPOINT!

Bundan sonra dəqiq nə olacaq?

  • Kubernetes-də, göstərilən Yerləşdirmə üçün replikaların sayı 0-a dəyişdiriləcək. Əvəzində, əvəzedici konteynerlə yeni Yerləşdirmə işə salınacaq. backend.
  • İş masasında 2 konteyner işə salınacaq: birincisi Telepresence ilə (o, Kubernetes-dən və ya Kubernetes-ə proksi sorğular göndərəcək), ikincisi isə proqram hazırlanır.
  • Tətbiqlə konteynerə daxil etsək, yerləşdirmə zamanı Helm tərəfindən ötürülən bütün ENV dəyişənləri bizim üçün əlçatan olacaq və bütün xidmətlər də mövcud olacaq. Yalnız sevimli IDE-də kodu redaktə etmək və nəticədən zövq almaq qalır.
  • İşin sonunda sadəcə Telepresence-in işlədiyi terminalı bağlamaq lazımdır (Ctrl+C ilə sessiyanı dayandırın) - Docker konteynerləri iş masasında dayanacaq və Kubernetesdə hər şey ilkin vəziyyətinə qayıdacaq. Qalır ki, MR-i təhvil vermək, buraxmaq və onu nəzərdən keçirməyə/birləşdirməyə/… (iş axınınızdan asılı olaraq) köçürməkdir.

Tətbiqi Docker konteynerində işə salmaq istəmiriksə - məsələn, biz PHP-də deyil, Go-da inkişaf etdiririk və yenə də onu yerli olaraq qururuq - Telepresence-i işə salmaq daha da asan olacaq:

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

Tətbiq Kubernetes API-yə daxil olarsa, açarlar kataloqunu quraşdırmalı olacaqsınız (https://www.telepresence.io/howto/volumes). Linux üçün bir yardım proqramı var kök:

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

Seçim olmadan Telepresence-i işə saldıqdan sonra --docker-run bütün mühit dəyişənləri cari terminalda mövcud olacaq, ona görə də proqram orada işə salınmalıdır.

NB: Məsələn, PHP-dən istifadə edərkən, inkişaf üçün müxtəlif op_cache, apc və digər sürətləndiriciləri söndürməyi unutmayın - əks halda kodu redaktə etmək istədiyiniz nəticəyə gətirib çıxarmayacaq.

Nəticələri

Kubernetes ilə yerli inkişaf, həlli bu platformanın yayılmasına mütənasib olaraq artan bir problemdir. Tərtibatçılardan (müştərilərimizdən) müvafiq sorğular alaraq, biz onları ilk mövcud vasitələrlə həll etməyə başladıq, lakin bu, uzun müddət ərzində özünü doğrultmadı. Xoşbəxtlikdən, bu, nəinki indi, nəinki bizim üçün aydın oldu, buna görə də dünyada daha uyğun vasitələr artıq peyda olub və Telepresence onlardan ən məşhurudur (yeri gəlmişkən, burada da var. skaffold Google-dan). Ondan istifadə təcrübəmiz hələ o qədər də böyük deyil, lakin bu, artıq bizə onu "mağazadakı həmkarlarımıza" tövsiyə etmək üçün əsas verir - cəhd edin!

PS

K8s məsləhətlər və fəndlər seriyasından digərləri:

Mənbə: www.habr.com

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