Kubernetes зөвлөмж ба заль мэх: орон нутгийн хөгжил ба Телепрезенцийн тухай

Kubernetes зөвлөмж ба заль мэх: орон нутгийн хөгжил ба Телепрезенцийн тухай

Биднээс Кубернетес дэх микро үйлчилгээг хөгжүүлэх талаар илүү их асуудаг. Хөгжүүлэгчид, ялангуяа орчуулагдсан хэлнүүдийн хувьд F5 товчийг дарснаар өөрсдийн дуртай IDE дээрх кодыг хурдан засч, бүтээх/байрлуулахыг хүлээлгүйгээр үр дүнг харахыг хүсдэг. Цул програмын тухай ярихад өгөгдлийн сан болон вэб серверийг (Docker, VirtualBox дээр ...) суулгаж, тэр даруй хөгжүүлэлтийг эдлэх нь хангалттай байсан. Монолитуудыг бичил үйлчилгээ болгон хайчилж, Кубернетес гарч ирснээр бие биенээсээ хамааралтай байдал гарч ирснээр бүх зүйл арай хэцүү болсон. Эдгээр бичил үйлчилгээ хэдий чинээ олон байна төдий чинээ олон асуудал гардаг. Дахин хөгжлөөс таашаал авахын тулд та нэгээс хоёр Docker контейнер, заримдаа бүр арав гаруй контейнер босгох хэрэгтэй ... Ерөнхийдөө энэ бүхэн маш их цаг хугацаа шаардаж болно, учир нь үүнийг байнга шинэчилж байх шаардлагатай. .

Өөр өөр цаг үед бид асуудлыг шийдэх өөр аргыг туршиж үзсэн. Мөн би хуримтлагдсан арга замууд эсвэл зүгээр л "таяг" -аас эхлэх болно.

1. Суга таяг

Ихэнх IDE нь FTP/SFTP ашиглан сервер дээр шууд код засах чадвартай байдаг. Энэ зам нь маш тодорхой бөгөөд бид үүнийг шууд ашиглахаар шийдсэн. Үүний мөн чанар нь дараах байдалтай байна.

  1. Хөгжлийн орчны (dev/review) хэсэгт SSH хандалт бүхий нэмэлт контейнер ажиллуулж, програмыг ажиллуулах/байруулах хөгжүүлэгчийн нийтийн SSH түлхүүрийг дамжуулдаг.
  2. Эхлэх шатанд (сав дотор prepare-app) кодыг шилжүүлнэ үү emptyDirпрограмын контейнер болон SSH серверээс код руу хандах боломжтой.

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 контейнерээс root (/)-г манай ширээний компьютерт холбох болно. Үүний дараа бид (OS болон програмыг хэрхэн ажиллуулж байгаагаас хамаарч) кластераас "түлхүүрүүдийг" ашиглаж болно.

Эхлээд програмыг ажиллуулах хамгийн түгээмэл хувилбарыг 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) холбох шаардлагатай. Линуксд зориулсан хэрэгсэл байдаг үндэс:

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

Сонголтгүйгээр Telepresence-г ажиллуулсны дараа --docker-run Бүх орчны хувьсагч нь одоогийн терминал дээр байх тул програмыг үүн дотор ажиллуулах ёстой.

NB: Жишээлбэл, PHP ашиглах үед та янз бүрийн op_cache, apc болон хөгжүүлэлтийн бусад хурдасгууруудыг идэвхгүй болгохоо санах хэрэгтэй - өөрөөр хэлбэл кодыг засварлах нь хүссэн үр дүнд хүргэхгүй.

Үр дүн

Кубернетестэй орон нутгийн хөгжил нь энэхүү платформын тархалттай харьцуулахад шийдэл нь нэмэгдэж байгаа асуудал юм. Хөгжүүлэгчдээс (үйлчлүүлэгчдээс) холбогдох хүсэлтийг хүлээн авснаар бид тэдгээрийг анхны боломжит хэрэгслээр шийдэж эхэлсэн боловч энэ нь удаан хугацааны туршид өөрсдийгөө баталж чадаагүй юм. Аз болоход энэ нь зөвхөн одоо төдийгүй бидний хувьд ч тодорхой болсон тул дэлхийд илүү тохиромжтой хэрэгсэл аль хэдийн гарч ирсэн бөгөөд Telepresence бол тэдгээрийн хамгийн алдартай нь юм (дашрамд хэлэхэд, бас байдаг. skaffold Google-ээс). Үүнийг ашиглах бидний туршлага хараахан тийм ч сайн биш байгаа ч үүнийг "дэлгүүрийн хамт олон" -д санал болгох үндэслэлийг аль хэдийн өгсөн - туршаад үзээрэй!

PS

K8-ийн бусад зөвлөмж, аргачлалын цувралууд:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх