Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: e pili ana i ka hoʻomohala kūloko a me Telepresence

Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: e pili ana i ka hoʻomohala kūloko a me Telepresence

Ua nīnau nui ʻia mākou e pili ana i ka hoʻomohala ʻana i nā microservices ma Kubernetes. Makemake nā mea hoʻomohala, ʻoi aku hoʻi o nā ʻōlelo unuhi, e hoʻoponopono koke i ke code i kā lākou IDE punahele a ʻike i ka hopena me ke kali ʻole no ke kūkulu ʻana/ka hoʻolālā ʻana - ma ke kaomi wale ʻana iā F5. A i ka hiki ʻana mai i kahi noi monolithic, ua lawa ia e hoʻokomo i kahi waihona a me kahi kikowaena pūnaewele (ma Docker, VirtualBox ...), a laila hauʻoli koke i ka hoʻomohala ʻana. Me ka ʻoki ʻana o nā monoliths i nā microservices a me ka hōʻea ʻana mai o Kubernetes, me ke ʻano o nā hilinaʻi i kekahi i kekahi, nā mea āpau. ua ʻoi aku ka paʻakikī. ʻO ka nui o kēia mau microservices, ʻoi aku ka nui o nā pilikia. No ka leʻaleʻa hou i ka hoʻomohala ʻana, pono ʻoe e hoʻāla i ʻoi aku ma mua o hoʻokahi a ʻelua mau pahu Docker, a i kekahi manawa ʻoi aku paha ma mua o hoʻokahi kakini ... Ma ka laulā, hiki i kēia mau mea ke lawe i ka manawa nui, no ka mea pono e mālama ʻia i kēia lā. .

I nā manawa like ʻole, ua hoʻāʻo mākou i nā hoʻonā ʻokoʻa i ka pilikia. A e hoʻomaka wau me nā workarounds i hōʻiliʻili ʻia a i ʻole "kākau".

1. Nā koʻi

Hiki i ka hapa nui o nā IDE ke hoʻoponopono pololei i ke code ma ke kikowaena me FTP/SFTP. Ua maopopo loa kēia ala a ua hoʻoholo koke mākou e hoʻohana. Hoʻopili ʻia kona ʻano i kēia mau mea:

  1. I loko o ka pod o nā kaiapuni hoʻomohala (dev/review), hoʻokuʻu ʻia kahi pahu hou me ka loaʻa SSH a hoʻouna i ke kī SSH lehulehu o ka mea hoʻomohala nāna e hoʻokō / hoʻoili i ka noi.
  2. Ma ke kahua init (i loko o ka ipu prepare-app) hoʻoili i ke code i emptyDire loaʻa i ke code mai nā pahu noi a me ka server SSH.

Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: e pili ana i ka hoʻomohala kūloko a me Telepresence

No ka hoʻomaopopo maikaʻi ʻana i ka hoʻokō ʻenehana o ia ʻano papahana, e hāʻawi wau i nā ʻāpana o nā hoʻonohonoho YAML pili i Kubernetes.

Nā hoʻonohonoho

1.1. waiwai.yaml

ssh_pub_key:
  vasya.pupkin: <ssh public key in base64> 

he mea vasya.pupkin ka waiwai o ka hoololi ${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. huna.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 }}

Paʻi hope

Ma hope o nā mea a pau i koe e hoʻoili pono gitlab-ci.yml mau mea hoʻololi:

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: hiki i ka mea hoʻomohala nāna i hoʻokumu i ka hoʻolālā ke hoʻopili ma ka inoa lawelawe (pehea e hāʻawi paʻa ai i ke komo i ka hui, ua haʻi mua mākou) mai kāu pākaukau ma o SFTP a hoʻoponopono i ke code me ke kali ʻole e hāʻawi ʻia i ka hui.

He hopena hana holoʻokoʻa kēia, akā mai kahi manaʻo hoʻokō he mau hemahema ʻike ʻole ia:

  • ka pono e hoʻomaʻemaʻe i ka pakuhi Helm, kahi e paʻakikī ai ka heluhelu ʻana i ka wā e hiki mai ana;
  • hiki ke hoʻohana wale ʻia e ka mea nāna i kau i ka lawelawe;
  • Pono ʻoe e hoʻomanaʻo e hoʻohui pū me ka papa kuhikuhi kūloko me ke code a hāʻawi iā Git.

2. Telepresence

ʻO ka papahana telepresence ua ʻike ʻia no ka manawa lōʻihi, akā ʻo mākou, e like me kā lākou e ʻōlelo nei, "ʻaʻole i hele a puni i ka hoʻāʻo koʻikoʻi i ka hana." Eia naʻe, ua hana ka noi i kāna hana a ke hauʻoli nei mākou e kaʻana like i kā mākou ʻike, he mea pono paha i ka poʻe heluhelu o kā mākou blog - ʻoiai ʻaʻohe mea ʻē aʻe e pili ana i Telepresence ma ka hub.

I ka pōkole, ua lilo nā mea a pau i mea weliweli. Ua kau mākou i nā hana a pau e pono ai ka hoʻokō ʻana ma ka ʻaoʻao o ka mea hoʻomohala ma kahi faila kikokikona Helm i kapa ʻia NOTES.txt. No laila, ma hope o ka lawe ʻana i ka lawelawe iā Kubernetes, ʻike ka mea hoʻomohala i nā ʻōlelo aʻoaʻo no ka hoʻokuʻu ʻana i ke kaiapuni dev kūloko ma ka log hana 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
#########################################################################

ʻAʻole mākou e noʻonoʻo kikoʻī i nā ʻanuʻu i wehewehe ʻia ma kēia ʻōlelo aʻo ... koe wale nō ka mea hope. He aha ka mea i ka wā o ka hoʻomaka ʻana o Telepresence?

Ke hana nei me Telepresence

I ka hoʻomaka ʻana (me ka hoʻohana ʻana i ke kauoha hope i kuhikuhi ʻia i nā ʻōlelo aʻoaʻo ma luna), hoʻonoho mākou:

  • inoa inoa kahi e holo ai ka microservice;
  • nā inoa o ka hoʻolaha a me ka pahu a mākou e makemake ai e komo.

ʻO nā manaʻo i koe he koho. Inā pili kā mākou lawelawe me ka API Kubernetes Hana ʻia ka ServiceAccount, pono mākou e kau i nā palapala hōʻoia / hōʻailona ma kā mākou papapihi. No ka hana ʻana i kēia, e hoʻohana i ke koho --mount=true (ai ole --mount=/dst_path), ka mea e kau ai i ke kumu (/) mai ka pahu Kubernetes i kā mākou papapihi. Ma hope o kēia, hiki iā mākou (e pili ana i ka OS a me ke ʻano o ka hoʻomaka ʻana o ka noi) e hoʻohana i nā "kī" mai ka hui.

ʻO ka mea mua, e nānā i ka koho ākea loa no ka holo ʻana i kahi noi - i loko o kahi pahu Docker. No ka hana ʻana i kēia, e hoʻohana mākou i ke kī --docker-run a kau i ka papa kuhikuhi me ke code i loko o ka ipu: -v `pwd`:/app

E ʻoluʻolu, e manaʻo ʻoe e holo ana kēia mai ka papa kuhikuhi papahana. E kau ʻia ke code noi ma ka papa kuhikuhi /app i loko o kahi pahu.

Eia kekahi: -v /tmp/app/var/run/secrets:/var/run/secrets - e kau i ka papa kuhikuhi me ka palapala hōʻoia i loko o kahi pahu.

Hoʻopili hope ʻia kēia koho e ke kiʻi kahi e holo ai ka noi. NB: I ke kūkulu ʻana i kiʻi, pono ʻoe e kuhikuhi CMD ai ole ia, ENTRYPOINT!

He aha ka mea e hiki mai ana?

  • Ma Kubernetes, no ka Deployment i kuhikuhi ʻia, e hoʻololi ʻia ka helu o nā replicas i 0. Akā, e hoʻomaka ʻia kahi Deployment hou - me kahi pahu pani. backend.
  • E hoʻokuʻu ʻia nā pahu 2 ma ka pākaukau: ʻo ka mua me Telepresence (ʻo ia nā noi koho mai / i Kubernetes), ʻo ka lua me ka hoʻomohala ʻana o ka noi.
  • Inā mākou e hoʻokō i loko o ka pahu me ka noi, a laila e loaʻa iā mākou nā mea hoʻololi ENV a pau i hoʻoili ʻia e Helm i ka wā o ka hoʻolālā ʻana, a e loaʻa pū nā lawelawe āpau. ʻO nā mea a pau i koe e hoʻoponopono i ke code i kāu IDE punahele a hauʻoli i ka hopena.
  • I ka pau ʻana o ka hana, pono ʻoe e pani i ka pahu kahi e holo ai ʻo Telepresence (hoʻopau i ke kau me Ctrl + C) - E kū nā pahu Docker ma ka pākaukau, a ma Kubernetes e hoʻi nā mea āpau i kona kūlana mua. ʻO nā mea a pau i koe, ʻo ka hoʻokō, hoʻopuka i ka MR a hoʻololi iā ia e nānā / hui /… (e pili ana i kāu kahe hana).

Inā ʻaʻole mākou makemake e holo i ka noi i loko o kahi pahu Docker - no ka laʻana, ʻaʻole mākou e hoʻomohala ma PHP, akā ma Go, a kūkulu mau i ka ʻāina - ʻoi aku ka maʻalahi o ka hoʻokuʻu ʻana i Telepresence:

telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name  }}:backend --mount=true

Inā komo ka palapala noi i ka Kubernetes API, pono ʻoe e kau i ka papa kuhikuhi kī (https://www.telepresence.io/howto/volumes). Aia kahi pono no Linux moʻa:

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

Ma hope o ka hoʻokuʻu ʻana i Telepresence me ke koho ʻole --docker-run e loaʻa nā ʻano hoʻololi kaiapuni a pau i ka pahu o kēia manawa, no laila pono e hoʻokuʻu ʻia ka noi ma laila.

NB: I ka hoʻohana ʻana, no ka laʻana, PHP, pono ʻoe e hoʻomanaʻo e hoʻopau i nā ʻano op_cache, apc a me nā mea wikiwiki ʻē aʻe no ka hoʻomohala ʻana - inā ʻaʻole e alakaʻi ka hoʻoponopono i ke code i ka hopena i makemake ʻia.

Nā hopena

ʻO ka hoʻomohala kūloko me Kubernetes kahi pilikia e ulu nei ka hoʻonā e like me ka hoʻokomo ʻana i kēia kahua. I ka loaʻa ʻana o nā noi kūpono mai nā mea hoʻomohala (mai kā mākou mea kūʻai aku), ua hoʻomaka mākou e hoʻoponopono iā lākou me nā ala mua i loaʻa, akā naʻe, ʻaʻole i hōʻoia iā lākou iho i ka wā lōʻihi. ʻO ka mea pōmaikaʻi, ua ʻike ʻia kēia ʻaʻole wale i kēia manawa a ʻaʻole wale iā mākou, no laila ua ʻike mua ʻia nā ala kūpono i ka honua, a ʻo Telepresence ka mea kaulana loa o lākou (ma ke ala, aia pū kekahi. skaffold mai Google). ʻAʻole maikaʻi loa kā mākou ʻike o ka hoʻohana ʻana iā ia, akā ua hāʻawi mua iā mākou i ke kumu e ʻōlelo aku ai i kā mākou "hoa hana ma ka hale kūʻai" - e hoʻāʻo!

PS

Nā mea ʻē aʻe mai nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni K8s:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka