Kubernetes හි ක්ෂුද්ර සේවා සංවර්ධනය කිරීම පිළිබඳව අපගෙන් වැඩි වැඩියෙන් අසනු ලැබේ. සංවර්ධකයින්ට, විශේෂයෙන්ම පරිවර්ථනය කරන ලද භාෂාවලට, ඔවුන්ගේ ප්රියතම IDE හි කේතය ඉක්මනින් නිවැරදි කිරීමට අවශ්ය වන අතර, ගොඩ නැගීම / යෙදවීම බලා නොසිට ප්රතිඵලය බලන්න - හුදෙක් F5 එබීමෙන්. එය මොනොලිතික් යෙදුමකට පැමිණි විට, එය දේශීයව දත්ත සමුදායක් සහ වෙබ් සේවාදායකයක් ස්ථාපනය කිරීමට ප්රමාණවත් විය (Docker, VirtualBox හි ...), ඉන්පසු වහාම සංවර්ධනය භුක්ති විඳින්න. මොනොලිත් ක්ෂුද්ර සේවාවලට කැපීම සහ කුබර්නෙටේස් පැමිණීමත් සමඟ, එකිනෙකා මත යැපීම් පෙනුම සමඟ, සියල්ල
විවිධ අවස්ථාවලදී අපි ගැටලුවට විවිධ විසඳුම් උත්සාහ කළා. තවද මම සමුච්චිත විසඳුම් හෝ සරලව "කිහිලිකරු" සමඟ ආරම්භ කරමි.
1. අත්වාරු
බොහෝ IDEs හට FTP/SFTP භාවිතයෙන් සේවාදායකය මත කෙලින්ම කේතය සංස්කරණය කිරීමේ හැකියාව ඇත. මෙම මාර්ගය ඉතා පැහැදිලිව පෙනෙන අතර අපි වහාම එය භාවිතා කිරීමට තීරණය කළා. එහි සාරය පහත දක්වා පහත වැටේ:
- සංවර්ධන පරිසරයන් (dev/review) තුළ, SSH ප්රවේශය සහිත අතිරේක බහාලුමක් දියත් කර යෙදුම කැප කරන/පවත්වන සංවර්ධකයාගේ පොදු SSH යතුර යොමු කරයි.
- ආරම්භක අදියරේදී (කන්ටේනරය තුළ
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 යෙදවීම.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. Telepresence
ව්යාපෘති
කෙටියෙන් කිවහොත්, සෑම දෙයක්ම එතරම් බියජනක නොවන බව පෙනී ගියේය. අපි ක්රියාත්මක කිරීමට අවශ්ය සියලුම ක්රියා සංවර්ධකයාගේ පැත්තෙන් හෙල්ම් ප්රස්ථාර පෙළ ගොනුවක තැබුවෙමු NOTES.txt
. මේ අනුව, Kubernetes වෙත සේවාව යෙදවීමෙන් පසු, සංවර්ධකයා GitLab රැකියා ලොගය තුළ දේශීය dev පරිසරය දියත් කිරීම සඳහා උපදෙස් දකියි:
!!! Разработка сервиса локально, в составе 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-run
සහ බහලුම තුළට කේතය සමඟ බහලුම සවි කරන්න: -v `pwd`:/app
මෙය ව්යාපෘති නාමාවලියෙන් ක්රියාත්මක වන බව කරුණාවෙන් සලකන්න. යෙදුම් කේතය නාමාවලියෙහි සවිකරනු ඇත /app
කන්ටේනරයක.
ඊළඟට: -v /tmp/app/var/run/secrets:/var/run/secrets
- සහතිකය/ටෝකනය සහිත නාමාවලිය බහාලුමකට සවි කිරීමට.
මෙම විකල්පය අවසානයේ යෙදුම ක්රියාත්මක වන රූපය අනුගමනය කරයි. NB: රූපයක් ගොඩනඟන විට, ඔබ විසින් නියම කළ යුතුය CMD
හෝ ENTRYPOINT
!
ඊළඟට හරියටම කුමක් සිදුවේද?
- Kubernetes හි, නිශ්චිත යෙදවීම සඳහා, අනුරූ ගණන 0 ලෙස වෙනස් කරනු ලැබේ. ඒ වෙනුවට, ආදේශක බහාලුමක් සමඟ - නව යෙදවීමක් දියත් කෙරේ.
backend
. - කන්ටේනර් 2ක් ඩෙස්ක්ටොප් එක මත දියත් කෙරේ: පළමුවැන්න Telepresence සමඟින් (එය Kubernetes වෙතින්/ වෙත ඉල්ලීම් ප්රොක්සි කරයි), දෙවැන්න යෙදුම සංවර්ධනය වෙමින් පවතී.
- අපි යෙදුම සමඟ කන්ටේනරය තුළට ක්රියාත්මක කළහොත්, යෙදවීමේදී හෙල්ම් විසින් මාරු කරන ලද සියලුම ENV විචල්යයන් අපට ලබා ගත හැකි අතර සියලුම සේවාවන් ද ලබා ගත හැකිය. ඉතිරිව ඇත්තේ ඔබගේ ප්රියතම IDE හි කේතය සංස්කරණය කර ප්රතිඵලය භුක්ති විඳීමයි.
- කාර්යය අවසානයේදී, ඔබට Telepresence ක්රියාත්මක වන පර්යන්තය වැසීමට අවශ්ය වේ (Ctrl + C සමඟ සැසිය අවසන් කරන්න) - ඩොකර් බහාලුම් ඩෙස්ක්ටොප් එක මත නතර වන අතර කුබර්නෙටස් හි සෑම දෙයක්ම එහි ආරම්භක තත්වයට පත්වේ. ඉතිරිව ඇත්තේ කැපවීම, MR නිකුත් කිරීම සහ එය සමාලෝචනය/ඒකාබද්ධ කිරීම/... (ඔබේ කාර්ය ප්රවාහයන් අනුව) වෙත මාරු කිරීම පමණි.
අපට යෙදුම ඩොකර් කන්ටේනරයක ධාවනය කිරීමට අවශ්ය නැතිනම් - උදාහරණයක් ලෙස, අපි සංවර්ධනය කරන්නේ 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 සහ අනෙකුත් ත්වරණකාරක අක්රිය කිරීමට ඔබ මතක තබා ගත යුතුය - එසේ නොමැති නම් කේතය සංස්කරණය කිරීමෙන් අපේක්ෂිත ප්රති result ලය නොලැබේ.
ප්රතිඵල
Kubernetes සමඟ දේශීය සංවර්ධනය ගැටලුවක් වන අතර එහි විසඳුම මෙම වේදිකාවේ ව්යාප්තියට සමානුපාතිකව වර්ධනය වේ. සංවර්ධකයින්ගෙන් (අපගේ සේවාදායකයින්ගෙන්) අදාළ ඉල්ලීම් ලැබීමෙන්, අපි ඒවා ලබා ගත හැකි පළමු මාධ්යයන් සමඟ විසඳීමට පටන් ගත්තෙමු, කෙසේ වෙතත්, එය දිගු කාලයක් පුරා ඔප්පු නොවීය. වාසනාවකට මෙන්, මෙය දැන් පමණක් නොව අපට පමණක් නොව පැහැදිලි වී ඇත, එබැවින් වඩාත් සුදුසු ක්රම දැනටමත් ලෝකයේ දර්ශනය වී ඇති අතර ටෙලිප්රෙසන්ස් ඒවායින් වඩාත් ප්රසිද්ධය (මාර්ගය වන විට, ද ඇත.
ප්රාදේශීය සභා
K8s ඉඟි සහ උපක්රම මාලාවෙන් වෙනත්:
- «
Kubernetes ඉඟි සහ උපක්රම: NGINX ඇතුල්වීමේ අභිරුචි දෝෂ පිටු »; - «
පොකුරක් තුළ ක්රියාත්මක වන සම්පත් Helm 2 කළමනාකරණයට මාරු කිරීම »; - «
වෙබ් යෙදුමක නෝඩ් වෙන් කිරීම සහ පැටවීම ගැන »; - «
dev අඩවි වෙත ප්රවේශය »; - «
විශාල දත්ත සමුදායන් සඳහා bootstrap වේගවත් කිරීම ".
මූලාශ්රය: www.habr.com