కుబెర్నెటెస్ చిట్కాలు & ఉపాయాలు: స్థానిక అభివృద్ధి మరియు టెలిప్రెసెన్స్ గురించి

కుబెర్నెటెస్ చిట్కాలు & ఉపాయాలు: స్థానిక అభివృద్ధి మరియు టెలిప్రెసెన్స్ గురించి

కుబెర్నెట్స్‌లో మైక్రోసర్వీస్‌లను అభివృద్ధి చేయడం గురించి మమ్మల్ని ఎక్కువగా అడుగుతున్నారు. డెవలపర్‌లు, ముఖ్యంగా అన్వయించబడిన భాషలకు చెందినవారు, తమకు ఇష్టమైన IDEలో కోడ్‌ని త్వరగా సరిచేయాలని మరియు బిల్డ్/డిప్లాయ్‌మెంట్ కోసం వేచి ఉండకుండా ఫలితాన్ని చూడాలని కోరుకుంటారు - కేవలం F5ని నొక్కడం ద్వారా. మరియు ఇది ఏకశిలా అప్లికేషన్ విషయానికి వస్తే, స్థానికంగా డేటాబేస్ మరియు వెబ్ సర్వర్‌ను ఇన్‌స్టాల్ చేయడం సరిపోతుంది (డాకర్, వర్చువల్‌బాక్స్‌లో...), ఆపై వెంటనే అభివృద్ధిని ఆస్వాదించండి. మోనోలిత్‌లను మైక్రోసర్వీస్‌లుగా కత్తిరించడం మరియు కుబెర్నెట్స్ రాకతో, ఒకదానికొకటి డిపెండెన్సీలు కనిపించడంతో, ప్రతిదీ అది కొంచెం కష్టమైంది. ఈ మైక్రోసర్వీస్‌లు ఎంత ఎక్కువగా ఉంటే అంత సమస్యలు. అభివృద్ధిని మళ్లీ ఆస్వాదించడానికి, మీరు ఒకటి లేదా రెండు కంటే ఎక్కువ డాకర్ కంటైనర్‌లను పెంచాలి మరియు కొన్నిసార్లు డజను కంటే ఎక్కువ... సాధారణంగా, ఇవన్నీ కూడా తాజాగా ఉంచాల్సిన అవసరం ఉన్నందున చాలా సమయం పట్టవచ్చు. .

వేర్వేరు సమయాల్లో మేము సమస్యకు వేర్వేరు పరిష్కారాలను ప్రయత్నించాము. మరియు నేను సేకరించిన పరిష్కారాలు లేదా కేవలం "క్రచెస్" తో ప్రారంభిస్తాను.

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 విస్తరణ.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 రహస్యం.యమల్

{{ 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 ద్వారా మరియు క్లస్టర్‌కి డెలివరీ అయ్యే వరకు వేచి ఉండకుండా కోడ్‌ను సవరించండి.

ఇది పూర్తిగా పని చేసే పరిష్కారం, కానీ అమలు కోణం నుండి దీనికి స్పష్టమైన ప్రతికూలతలు ఉన్నాయి:

  • భవిష్యత్తులో చదవడం కష్టతరం చేసే హెల్మ్ చార్ట్‌ను మెరుగుపరచాల్సిన అవసరం;
  • సేవను అమలు చేసిన వ్యక్తి మాత్రమే ఉపయోగించగలరు;
  • మీరు దానిని స్థానిక డైరెక్టరీతో కోడ్‌తో సమకాలీకరించాలని గుర్తుంచుకోవాలి మరియు దానిని Gitకి కట్టుబడి ఉండాలి.

2. టెలిప్రెసెన్స్

ప్రాజెక్ట్ టెలీప్రెజెన్స్ చాలా కాలంగా తెలుసు, కానీ మేము, వారు చెప్పినట్లు, "దీనిని ఆచరణలో తీవ్రంగా ప్రయత్నించలేదు." అయినప్పటికీ, డిమాండ్ దాని పనిని పూర్తి చేసింది మరియు ఇప్పుడు మా అనుభవాన్ని పంచుకోవడానికి మేము సంతోషిస్తున్నాము, ఇది మా బ్లాగ్ యొక్క పాఠకులకు ఉపయోగకరంగా ఉండవచ్చు - ప్రత్యేకించి టెలిప్రెసెన్స్ గురించి హబ్‌లో ఇంకా ఇతర అంశాలు లేవు కాబట్టి.

సంక్షిప్తంగా, ప్రతిదీ అంత భయానకంగా లేదని తేలింది. డెవలపర్ నుండి అమలు చేయాల్సిన అన్ని చర్యలను మేము హెల్మ్ చార్ట్ టెక్స్ట్ ఫైల్‌లో ఉంచాము NOTES.txt. అందువల్ల, కుబెర్నెట్స్‌కు సేవను అమలు చేసిన తర్వాత, డెవలపర్ 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
#########################################################################

ఈ సూచనలో వివరించిన దశల గురించి మేము వివరంగా చెప్పము ... చివరిది మినహా. టెలిప్రెసెన్స్ లాంచ్ సమయంలో ఏమి జరుగుతుంది?

టెలిప్రెసెన్స్‌తో పని చేస్తున్నారు

ప్రారంభంలో (పై సూచనలలో పేర్కొన్న చివరి ఆదేశాన్ని ఉపయోగించి), మేము సెట్ చేస్తాము:

  • మైక్రోసర్వీస్ నడుస్తున్న నేమ్‌స్పేస్;
  • మేము వ్యాప్తి చేయాలనుకుంటున్న విస్తరణ మరియు కంటైనర్ పేర్లు.

మిగిలిన వాదనలు ఐచ్ఛికం. మా సేవ Kubernetes APIతో మరియు దాని కోసం పరస్పర చర్య చేస్తే సేవా ఖాతా సృష్టించబడింది, మన డెస్క్‌టాప్‌లో సర్టిఫికెట్‌లు/టోకెన్‌లను మౌంట్ చేయాలి. దీన్ని చేయడానికి, ఎంపికను ఉపయోగించండి --mount=true (లేదా --mount=/dst_path), ఇది కుబెర్నెట్స్ కంటైనర్ నుండి మా డెస్క్‌టాప్‌కు రూట్ (/)ని మౌంట్ చేస్తుంది. దీని తరువాత, మేము (OS మరియు అప్లికేషన్ ఎలా ప్రారంభించబడుతుందో బట్టి) క్లస్టర్ నుండి "కీలను" ఉపయోగించవచ్చు.

ముందుగా, అప్లికేషన్‌ను అమలు చేయడానికి అత్యంత సార్వత్రిక ఎంపికను చూద్దాం - డాకర్ కంటైనర్‌లో. దీన్ని చేయడానికి మేము కీని ఉపయోగిస్తాము --docker-run మరియు కోడ్‌తో డైరెక్టరీని కంటైనర్‌లోకి మౌంట్ చేయండి: -v `pwd`:/app

ఇది ప్రాజెక్ట్ డైరెక్టరీ నుండి అమలు చేయబడుతుందని దయచేసి గమనించండి. అప్లికేషన్ కోడ్ డైరెక్టరీలో మౌంట్ చేయబడుతుంది /app ఒక కంటైనర్లో.

తదుపరి: -v /tmp/app/var/run/secrets:/var/run/secrets - సర్టిఫికేట్/టోకెన్‌తో కూడిన డైరెక్టరీని కంటైనర్‌లోకి మౌంట్ చేయడానికి.

ఈ ఐచ్చికము చివరకు అప్లికేషన్ రన్ అయ్యే ఇమేజ్‌తో అనుసరించబడుతుంది. NB: చిత్రాన్ని నిర్మించేటప్పుడు, మీరు తప్పనిసరిగా పేర్కొనాలి CMD లేదా ENTRYPOINT!

తరువాత ఖచ్చితంగా ఏమి జరుగుతుంది?

  • కుబెర్నెటెస్‌లో, పేర్కొన్న డిప్లాయ్‌మెంట్ కోసం, ప్రతిరూపాల సంఖ్య 0కి మార్చబడుతుంది. బదులుగా, కొత్త డిప్లాయ్‌మెంట్ ప్రారంభించబడుతుంది - ప్రత్యామ్నాయ కంటైనర్‌తో backend.
  • డెస్క్‌టాప్‌లో 2 కంటైనర్‌లు ప్రారంభించబడతాయి: మొదటిది టెలిప్రెసెన్స్‌తో (ఇది కుబెర్నెటెస్ నుండి/కు అభ్యర్థనలను ప్రాక్సీ చేస్తుంది), రెండవది అప్లికేషన్‌ను అభివృద్ధి చేయడంతో.
  • మేము అప్లికేషన్‌తో కంటైనర్‌లోకి ఎగ్జిక్యూట్ చేస్తే, డిప్లాయ్‌మెంట్ సమయంలో హెల్మ్ ద్వారా బదిలీ చేయబడిన అన్ని ENV వేరియబుల్స్ మాకు అందుబాటులో ఉంటాయి మరియు అన్ని సేవలు కూడా అందుబాటులో ఉంటాయి. మీకు ఇష్టమైన IDEలో కోడ్‌ని సవరించడం మరియు ఫలితాన్ని ఆస్వాదించడం మాత్రమే మిగిలి ఉంది.
  • పని ముగింపులో, మీరు టెలిప్రెసెన్స్ నడుస్తున్న టెర్మినల్‌ను మూసివేయాలి (Ctrl+Cతో సెషన్‌ను ముగించండి) - డాకర్ కంటైనర్‌లు డెస్క్‌టాప్‌లో ఆగిపోతాయి మరియు కుబెర్నెట్స్‌లో ప్రతిదీ దాని ప్రారంభ స్థితికి తిరిగి వస్తుంది. మిగిలి ఉన్నది కట్టుబడి, MRని జారీ చేయడం మరియు దానిని సమీక్ష/విలీనం/...కి బదిలీ చేయడం (మీ వర్క్‌ఫ్లోలను బట్టి).

మేము అనువర్తనాన్ని డాకర్ కంటైనర్‌లో అమలు చేయకూడదనుకుంటే - ఉదాహరణకు, మేము PHPలో కాకుండా గోలో అభివృద్ధి చేస్తాము మరియు ఇప్పటికీ స్థానికంగా దీన్ని నిర్మిస్తాము - టెలిప్రెసెన్స్‌ని ప్రారంభించడం మరింత సరళంగా ఉంటుంది:

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

ఎంపిక లేకుండా టెలిప్రెసెన్స్‌ని ప్రారంభించిన తర్వాత --docker-run అన్ని ఎన్విరాన్మెంట్ వేరియబుల్స్ ప్రస్తుత టెర్మినల్‌లో అందుబాటులో ఉంటాయి, కాబట్టి అప్లికేషన్ తప్పనిసరిగా దానిలో ప్రారంభించబడాలి.

NB: ఉదాహరణకు, PHPని ఉపయోగిస్తున్నప్పుడు, మీరు డెవలప్‌మెంట్ కోసం వివిధ op_cache, apc మరియు ఇతర యాక్సిలరేటర్‌లను నిలిపివేయాలని గుర్తుంచుకోవాలి - లేకపోతే కోడ్‌ను సవరించడం వలన ఆశించిన ఫలితం ఉండదు.

ఫలితాలు

కుబెర్నెట్స్‌తో స్థానిక అభివృద్ధి అనేది ఈ ప్లాట్‌ఫారమ్ యొక్క వ్యాప్తికి అనులోమానుపాతంలో పెరుగుతున్న సమస్య. డెవలపర్‌ల నుండి (మా క్లయింట్ల నుండి) సంబంధిత అభ్యర్థనలను స్వీకరించడం ద్వారా, మేము అందుబాటులో ఉన్న మొదటి మార్గాలతో వాటిని పరిష్కరించడం ప్రారంభించాము, అయినప్పటికీ, దీర్ఘకాలంలో తమను తాము నిరూపించుకోలేదు. అదృష్టవశాత్తూ, ఇది ఇప్పుడు మాత్రమే కాదు మరియు మనకు మాత్రమే కాకుండా స్పష్టంగా మారింది, కాబట్టి ప్రపంచంలో మరింత సరిఅయిన మార్గాలు ఇప్పటికే కనిపించాయి మరియు టెలిప్రెసెన్స్ వాటిలో అత్యంత ప్రసిద్ధమైనది (మార్గం ద్వారా, కూడా ఉంది స్కాఫోల్డ్ Google నుండి). దీన్ని ఉపయోగించడంలో మా అనుభవం ఇంకా గొప్పగా లేదు, కానీ ఇది ఇప్పటికే మా “షాప్‌లోని సహోద్యోగులకు” సిఫార్సు చేయడానికి మాకు కారణాన్ని ఇస్తుంది - దీన్ని ప్రయత్నించండి!

PS

K8s చిట్కాలు & ఉపాయాలు సిరీస్ నుండి ఇతర:

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి