Kubernetes кеңестері мен амалдары: жергілікті даму және телепрезенсенция туралы

Kubernetes кеңестері мен амалдары: жергілікті даму және телепрезенсенция туралы

Бізден Kubernetes-те микросервистерді дамыту туралы көбірек сұралады. Әзірлеушілер, әсіресе түсіндірілетін тілдер, F5 пернесін басу арқылы өздерінің сүйікті IDE-дегі кодты жылдам түзеткісі келеді және нәтижені құрастыруды/орналастыруды күтпей-ақ көргісі келеді. Ал монолитті қосымшаға келгенде, жергілікті түрде дерекқор мен веб-серверді орнату (Docker, VirtualBox...), содан кейін бірден дамудан ләззат алу жеткілікті болды. Монолиттердің микросервистерге кесілуімен және Кубернетестің келуімен, бір-біріне тәуелділіктердің пайда болуымен бәрі сәл қиындап кетті. Бұл микросервистердің саны неғұрлым көп болса, соғұрлым проблемалар көп болады. Қайтадан ләззат алу үшін бір немесе екі Docker контейнерін, кейде тіпті оннан астамын көтеру керек... Жалпы, мұның бәрі көп уақытты алуы мүмкін, өйткені оны да жаңартып отыру қажет. .

Әр түрлі уақытта біз мәселенің әртүрлі шешімдерін қолдандық. Мен жинақталған шешімдерден немесе жай «балдақтардан» бастаймын.

1. Балдақтар

Көптеген IDE FTP/SFTP көмегімен серверде кодты тікелей өңдеу мүмкіндігіне ие. Бұл жол өте айқын және біз оны бірден қолдануды шештік. Оның мәні мыналарға байланысты:

  1. Әзірлеу орталарының (дев/шолу) қосымша контейнерінде SSH қатынасы бар және қолданбаны орындайтын/орналастырушы әзірлеушінің жалпы SSH кілтін қайта жіберетін қосымша контейнер іске қосылады.
  2. Бастапқы кезеңде (контейнер ішінде prepare-app) кодты келесіге жіберіңіз emptyDirқолданба контейнерлерінен және SSH серверінен кодқа қол жеткізу.

Kubernetes кеңестері мен амалдары: жергілікті даму және телепрезенсенция туралы

Мұндай схеманың техникалық орындалуын жақсырақ түсіну үшін мен Kubernetes-те тартылған YAML конфигурацияларының фрагменттерін беремін.

Конфигурациялар

1.1. мәндер.yaml

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

Бұл vasya.pupkin айнымалының мәні болып табылады ${GITLAB_USER_LOGIN}.

1.2. deployment.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 интерфейсімен және үшін әрекеттессе ServiceAccount жасалды, біз жұмыс үстелінде сертификаттарды/таңбалауыштарды орнатуымыз керек. Мұны істеу үшін опцияны пайдаланыңыз --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 контейнерлері жұмыс үстелінде тоқтайды, ал Кубернетесте бәрі бастапқы күйіне оралады. Қалғанының бәрі 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 және басқа үдеткіштерді өшіруді есте сақтау керек - әйтпесе кодты өңдеу қажетті нәтижеге әкелмейді.

Нәтижелері

Кубернетеспен жергілікті даму - бұл платформаның таралуына пропорционалды түрде өсіп келе жатқан мәселе. Әзірлеушілерден (клиенттерімізден) тиісті сұраныстарды ала отырып, біз оларды алғашқы қолжетімді құралдармен шеше бастадық, бірақ бұл ұзақ уақыт бойы өзін көрсете алмады. Бақытымызға орай, бұл қазір ғана емес, бізге ғана емес, айқын болды, сондықтан әлемде неғұрлым қолайлы құралдар пайда болды, және Telepresence олардың ең танымалы (айтпақшы, бар. скафольд Google-дан). Біздің оны пайдалану тәжірибеміз әлі онша жақсы емес, бірақ бұл оны «дүкендегі әріптестерімізге» ұсынуға негіз береді - көріңіз!

PS

K8s кеңестер мен трюктар сериясының басқалары:

Ақпарат көзі: www.habr.com

пікір қалдыру