Аз мо бештар дар бораи таҳияи хидматҳои микросервис дар Кубернетес мепурсанд. Таҳиягарон, бахусус забонҳои тафсиршуда, мехоҳанд кодро дар IDE дӯстдоштаи худ зуд ислоҳ кунанд ва бидуни мунтазири сохтан/ҷойгиршавӣ натиҷаро бубинанд - танҳо бо пахшкунии F5. Ва ҳангоме ки сухан дар бораи як барномаи монолитӣ меравад, ба таври маҳаллӣ насб кардани пойгоҳи додаҳо ва веб-сервер (дар Docker, VirtualBox...) кифоя буд ва сипас фавран аз рушд лаззат баред. Бо буридани монолитҳо ба микросервисҳо ва омадани Кубернетес, бо пайдоиши вобастагӣ аз ҳамдигар, ҳама чиз
Дар вақтҳои гуногун мо роҳҳои ҳалли мушкилоти гуногунро кӯшиш кардем. Ва ман бо ҳалли ҷамъшуда ё танҳо "асғола" оғоз мекунам.
1. Асобаҳо
Аксарияти IDEҳо қобилияти таҳрир кардани кодро мустақиман дар сервер бо истифода аз FTP/SFTP доранд. Ин рох хеле равшан аст ва мо фавран карор додем, ки аз он истифода барем. Моҳияти он ба инҳо тааллуқ дорад:
- Дар паҳлӯи муҳитҳои рушд (dev/review) як контейнери иловагӣ бо дастрасии SSH ва интиқоли калиди ҷамъиятии SSH-и таҳиякунанда, ки барномаро иҷро мекунад/ҷой мекунад, оғоз мешавад.
- Дар марҳилаи ибтидоӣ (дар дохили контейнер
prepare-app
) кодро баemptyDir
Барои дастрасӣ ба код аз контейнерҳои барнома ва сервери SSH.
Барои беҳтар фаҳмидани татбиқи техникии чунин нақша, ман порчаҳои конфигуратсияҳои YAML-ро дар Кубернетес пешниҳод мекунам.
Конфигуратсияҳо
1.1. арзишхо.ямл
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: таҳиякунандае, ки паҳнкуниро оғоз кардааст, метавонад бо номи хидмат пайваст шавад (чӣ гуна бояд ба кластер ба таври бехатар дастрасӣ пайдо кард,
Ин як ҳалли комилан коркунанда аст, аммо аз нуқтаи назари татбиқ он камбудиҳои ошкоро дорад:
- зарурати такмил додани диаграммаи Ҳелм, ки дар оянда хонданро душвор мегардонад;
- метавонад танҳо аз ҷониби шахсе истифода шавад, ки хидматро ҷойгир кардааст;
- шумо бояд фаромӯш накунед, ки онро бо директорияи маҳаллӣ бо код ҳамоҳанг созед ва онро ба 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
Ҳангоми оғозёбӣ (бо истифода аз фармони охирини дар дастурҳои дар боло зикршуда), мо муқаррар мекунем:
- фазои ном, ки дар он микросервис кор мекунад;
- номҳои ҷойгиркунӣ ва контейнер, ки мо мехоҳем ворид шавем.
Далелҳои боқимонда ихтиёрӣ мебошанд. Агар хидмати мо бо API ва Kubernetes ҳамкорӣ кунад --mount=true
(ё --mount=/dst_path
), ки решаро (/) аз контейнери Kubernetes ба мизи кории мо васл мекунад. Пас аз ин, мо метавонем (вобаста ба OS ва чӣ гуна оғоз шудани барнома) "калидҳо" -ро аз кластер истифода барем.
Аввалан, биёед варианти универсалии иҷро кардани барномаро дида бароем - дар контейнери Docker. Барои ин мо калидро истифода мебарем --docker-run
ва директорияро бо код ба контейнер насб кунед: -v `pwd`:/app
Лутфан қайд кунед, ки ин кор аз феҳристи лоиҳаро дар назар дорад. Рамзи барнома дар директория насб карда мешавад /app
дар як контейнер.
Next: -v /tmp/app/var/run/secrets:/var/run/secrets
— барои васл кардани директория бо сертификат/токен ба контейнер.
Пас аз ин хосият дар ниҳоят тасвире пайдо мешавад, ки дар он барнома кор мекунад. NB: Ҳангоми сохтани тасвир, шумо бояд муайян кунед CMD
ё ENTRYPOINT
!
Дар оянда чӣ воқеа рӯй медиҳад?
- Дар Кубернетес, барои Ҷойгиркунии мушаххас, шумораи репликаҳо ба 0 тағир дода мешавад. Ба ҷои ин, паҳнкунии нав бо контейнери ивазкунанда оғоз мешавад
backend
. - 2 контейнер дар мизи корӣ оғоз мешавад: якум бо Telepresence (он прокси дархостҳоро аз/ба Kubernetes хоҳад кард), дуюм бо барнома таҳия карда мешавад.
- Агар мо ба контейнер бо барнома ворид шавем, он гоҳ ҳама тағирёбандаҳои ENV, ки аз ҷониби Helm ҳангоми ҷойгиркунӣ интиқол дода шудаанд, ба мо дастрас хоҳанд буд ва ҳама хидматҳо низ дастрас хоҳанд буд. Танҳо ин аст, ки кодро дар IDE дӯстдоштаи худ таҳрир кунед ва аз натиҷа лаззат баред.
- Дар охири кор, шумо бояд танҳо терминалеро, ки Telepresence кор мекунад, пӯшед (сеансро бо Ctrl+C қатъ кунед) - Контейнерҳои Docker дар мизи корӣ қатъ мешаванд ва дар Кубернетес ҳама чиз ба ҳолати аввалааш бармегардад. Танҳо иҷрои он, додани MR ва интиқол додани он ба баррасӣ/якҷоя/… (вобаста ба ҷараёни кори шумо) боқӣ мемонад.
Агар мо нахоҳем, ки барномаро дар контейнери Docker иҷро кунем - масалан, мо на дар PHP, балки дар Go таҳия мекунем ва ба ҳар ҳол онро ба таври маҳаллӣ бунёд мекунем - оғози Telepresence боз ҳам соддатар мешавад:
telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name }}:backend --mount=true
Агар барнома ба API Kubernetes дастрасӣ пайдо кунад, шумо бояд директорияи калидҳоро насб кунед (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 машҳуртарини онҳост (дар омади гап, вуҷуд дорад.
PS
Дигар аз силсилаи маслиҳатҳо ва ҳилаҳои K8s:
- «
Маслиҳатҳо ва ҳилаҳои Kubernetes: саҳифаҳои хатогиҳои фармоишӣ дар NGINX Ingress »; - «
Интиқоли захираҳое, ки дар кластер кор мекунанд, ба идоракунии Helm 2 »; - «
Дар бораи тақсимоти гиреҳ ва боркунӣ дар барномаи веб »; - «
Дастрасӣ ба сайтҳои таҳиякунанда »; - «
Суръати пурборкунӣ барои пойгоҳи додаҳои калон ".
Манбаъ: will.com