Биднээс Кубернетес дэх микро үйлчилгээг хөгжүүлэх талаар илүү их асуудаг. Хөгжүүлэгчид, ялангуяа орчуулагдсан хэлнүүдийн хувьд F5 товчийг дарснаар өөрсдийн дуртай IDE дээрх кодыг хурдан засч, бүтээх/байрлуулахыг хүлээлгүйгээр үр дүнг харахыг хүсдэг. Цул програмын тухай ярихад өгөгдлийн сан болон вэб серверийг (Docker, VirtualBox дээр ...) суулгаж, тэр даруй хөгжүүлэлтийг эдлэх нь хангалттай байсан. Монолитуудыг бичил үйлчилгээ болгон хайчилж, Кубернетес гарч ирснээр бие биенээсээ хамааралтай байдал гарч ирснээр бүх зүйл
Өөр өөр цаг үед бид асуудлыг шийдэх өөр аргыг туршиж үзсэн. Мөн би хуримтлагдсан арга замууд эсвэл зүгээр л "таяг" -аас эхлэх болно.
1. Суга таяг
Ихэнх IDE нь FTP/SFTP ашиглан сервер дээр шууд код засах чадвартай байдаг. Энэ зам нь маш тодорхой бөгөөд бид үүнийг шууд ашиглахаар шийдсэн. Үүний мөн чанар нь дараах байдалтай байна.
- Хөгжлийн орчны (dev/review) хэсэгт SSH хандалт бүхий нэмэлт контейнер ажиллуулж, програмыг ажиллуулах/байруулах хөгжүүлэгчийн нийтийн SSH түлхүүрийг дамжуулдаг.
- Эхлэх шатанд (сав дотор
prepare-app
) кодыг шилжүүлнэ үүemptyDir
програмын контейнер болон SSH серверээс код руу хандах боломжтой.
Ийм схемийн техникийн хэрэгжилтийг илүү сайн ойлгохын тулд би Кубернетес дэх холбогдох 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 }}
эцсийн мэдрэгч
Үүний дараа шилжүүлэх л үлдлээ
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: Байршлыг эхлүүлсэн хөгжүүлэгч нь үйлчилгээний нэрээр холбогдож болно (кластерт хэрхэн аюулгүй хандах,
Энэ бол бүрэн үр дүнтэй шийдэл боловч хэрэгжилтийн үүднээс харахад энэ нь тодорхой сул талуудтай:
- Helm графикийг боловсронгуй болгох хэрэгцээ, энэ нь ирээдүйд уншихад хэцүү болгодог;
- зөвхөн үйлчилгээг байршуулсан хүн ашиглах боломжтой;
- Та үүнийг кодтой локал лавлахтай синхрончилж, Git-д оруулахаа санах хэрэгтэй.
2. Телевиз
Төсөл
Товчхондоо бүх зүйл тийм ч аймшигтай биш болсон. Бид хөгжүүлэгчийн зүгээс гүйцэтгэх шаардлагатай бүх үйлдлийг 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 контейнерээс 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 бол тэдгээрийн хамгийн алдартай нь юм (дашрамд хэлэхэд, бас байдаг.
PS
K8-ийн бусад зөвлөмж, аргачлалын цувралууд:
- «
Kubernetes зөвлөмж ба заль мэх: NGINX Ingress дахь тусгай алдааны хуудас "; - «
Кластерт ажиллаж байгаа нөөцүүдийг Helm 2 удирдлага руу шилжүүлэх "; - «
Зангилааны хуваарилалт ба вэб програм дээрх ачааллын тухай "; - «
Хөгжүүлэгчийн сайтуудад хандах "; - «
Том өгөгдлийн сангийн ачааллыг хурдасгах ".
Эх сурвалж: www.habr.com