Ave'esea se lala fa'apitoa ua tuai i totonu o se fa'aputuga Kubernetes

Ave'esea se lala fa'apitoa ua tuai i totonu o se fa'aputuga Kubernetes

Привет! Fa'aaliga lala (aka deploy preview, toe iloilo app) - o le taimi lea e le gata o le paranesi matai o loʻo faʻapipiʻiina, ae faʻapea foʻi taʻitasi toso talosaga i se URL tulaga ese. E mafai ona e siaki pe galue le code i se siosiomaga gaosiga; o le ata e mafai ona faʻaalia i isi polokalame poʻo tagata tomai faapitoa oloa. A'o e galue i se talosaga toso, o lo'o fa'apipi'iina fou ta'itasi o lo'o iai nei mo le code tuai e tapeina, ma o lo'o fa'asolo atu i fafo le fa'aoga fou mo le code fou. E ono tula'i mai ni fesili pe a e tu'ufa'atasia se talosaga toso i totonu o le lala matua. E te le toe manaʻomia le lala faʻapitoa, ae o loʻo i ai pea punaoa Kubernetes i le fuifui.

Fa'amatalaga atili e uiga i lala fa'apitoa

O le tasi auala e fai ai lala fa'apitoa i Kubernetes o le fa'aogaina lea o igoa avanoa. I se faapuupuuga, o le faatulagaga o le gaosiga e pei o lenei:

kind: Namespace
apiVersion: v1
metadata:
  name: habr-back-end
...

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: habr-back-end
spec:
  replicas: 3
...

Mo se lala faʻapitoa, e faia se igoa avanoa ma lona faʻamatalaga (mo se faʻataʻitaʻiga, numera talosaga toso) ma nisi ituaiga prefix/postfix (mo se faʻataʻitaʻiga, -pr-):

kind: Namespace
apiVersion: v1
metadata:
  name: habr-back-end-pr-17
...

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: habr-back-end-pr-17
spec:
  replicas: 1
...

I se tulaga lautele, sa ou tusia Kubernetes Operator (se talosaga e mafai ona maua ai punaoa faʻapipiʻi), feso'ota'iga ile poloketi ile Github. Na te aveesea igoa avanoa e patino i lala vaega tuai. I totonu o Kubernetes, afai e te tapeina se igoa, o isi punaoa i lena igoa avanoa e tapeina foi.

$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE            ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h

E mafai ona e faitau e uiga i le faʻaogaina o lala faʻapitoa i totonu o se fuifui iinei и iinei.

Motugaafa

Se'i o tatou va'ava'ai i se fa'ata'ita'iga fa'atoso fa'asologa o le olaga fa'atasi ma fa'aauau fa'atasi (continuous integration):

  1. Matou te tuleia se tautinoga fou i le paranesi.
  2. I luga o le fausiaina, o loʻo faʻataʻitaʻiina liters ma/poʻo suʻega.
  3. Kubernetes toso fa'atonuga talosaga e fa'atupu i luga o le lele (mo se fa'ata'ita'iga, o lona numera o lo'o fa'aofi i totonu o le mamanu mae'a).
  4. I le faʻaaogaina o le kubectl faʻaoga, faʻapipiʻi faʻaopoopo i le fuifui (faʻapipiʻi).
  5. Toso talosaga o lo'o tu'ufa'atasia i totonu o le lala matua.

A'o e galue i se talosaga toso, o lo'o fa'apipi'iina nei ta'itasi fou mo le code tuai e tape, ma o lo'o fa'asolo i fafo le fa'aoga fou mo le code fou. Ae a tu'ufa'atasia se talosaga toso i totonu o le paranesi matai, e na'o le paranesi matai o le a fausia. O se taunuuga, e foliga mai ua galo ia i matou le talosaga toso, ma o loʻo i ai pea ana punaoa Kubernetes i totonu o le fuifui.

Auala e faʻaoga ai

Faʻapipiʻi le poloketi ma le faʻatonuga o loʻo i lalo:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml

Fausia se faila ma mea o loʻo i lalo ma faʻapipiʻi e ala i kubectl apply -f:

apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
  name: stale-feature-branch
spec:
  namespaceSubstring: -pr-
  afterDaysWithoutDeploy: 3

Parakalafa igoaspaceSubstring mana'omia e fa'amama igoa avanoa mo talosaga toso mai isi igoa avanoa. Mo se faʻataʻitaʻiga, afai o le fuifui o loʻo i ai igoa nei: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, o sui tauva mo le tapeina o le a habr-back-end-pr-17, habr-back-end-pr-33.

Parakalafa afterDaysWithoutDeploy mana'omia e tape ai igoa tuai. Mo se faʻataʻitaʻiga, pe a fai igoa avanoa 3 дня 1 час tua, ma o le parakalafa e faailoa mai 3 дня, o le a tape le igoa lea. E galue foi i le itu faafeagai pe a fai le igoa avanoa 2 дня 23 часа tua, ma o le parakalafa e faailoa mai 3 дня, o le a le tapeina lenei igoa avanoa.

E tasi le isi fa'amaufa'ailoga, e nafa ma le fa'afia ona va'ai va'aiga igoa uma ma siaki mo aso e aunoa ma le fa'atinoina - siakiEveryMinutes. I le faaletonu e tutusa 30 минутам.

E faapefea e lenei galuega

I le faʻatinoga, e te manaʻomia:

  1. Docker mo le galue i se siosiomaga tuufua.
  2. Minikube o le a fa'atupuina se fuifui Kubernetes i le lotoifale.
  3. kubectl - fa'atonuga laina fa'aoga mo le fa'atonutonuina o fuifui.

Matou te fa'atupuina se vaega Kubernetes i le lotoifale:

$ minikube start --vm-driver=docker
minikube v1.11.0 on Darwin 10.15.5
Using the docker driver based on existing profile.
Starting control plane node minikube in cluster minikube.

Fa'ailoa mai kubectl fa'aoga le fuifui fa'apitonu'u e ala i le fa'aletonu:

$ kubectl config use-context minikube
Switched to context "minikube".

La'u mai fa'atonuga mo le siosiomaga gaosiga:

$ curl https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml > stale-feature-branch-production-configs.yml

Talu ai ona o faʻatulagaga o gaosiga e faʻapipiʻiina e siaki ai igoa tuai, ma e le o iai i la matou fuifui fou, matou te suia le fesuiaiga o le siosiomaga. IS_DEBUG i true. Faatasi ai ma lenei tau o le parakalafa afterDaysWithoutDeploy e le o amanaia ma e le siakiina igoa avanoa mo aso e aunoa ma le faʻaogaina, naʻo le tupu mai o le substring (-pr-).

Afai o e i luga Linux:

$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml

Afai o e i luga macOS:

$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml

Fa'apipi'i le poloketi:

$ kubectl apply -f stale-feature-branch-production-configs.yml

Siaki pe ua aliali mai se punaoa i le fuifui StaleFeatureBranch:

$ kubectl api-resources | grep stalefeaturebranches
NAME                 ... APIGROUP                             ... KIND
stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch

Matou te siaki ua aliali mai se tagata fa'afoe i le fuifui:

$ kubectl get pods --namespace stale-feature-branch-operator
NAME                                           ... STATUS  ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s

Afai e te vaʻai i ana ogalaau, ua sauni e faʻatautaia punaoa StaleFeatureBranch:

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Operator Version: 0.0.1"}
...
... "msg":"Starting EventSource", ... , "source":"kind source: /, Kind="}
... "msg":"Starting Controller", ...}
... "msg":"Starting workers", ..., "worker count":1}

Matou te faʻapipiʻiina ua saunia fixtures (fa'atonuga ua saunia mo le fa'ata'ita'iina o puna'oa fa'aopoopo) mo se puna'oa StaleFeatureBranch:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/stale-feature-branch.yml

O fa'atonuga e fa'ailoa mai ai le su'eina o igoa va'aiga ma se so'o -pr- tasi i taimi uma 1 минуту.:

apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
  name: stale-feature-branch
spec:
  namespaceSubstring: -pr-
  afterDaysWithoutDeploy: 1 
  checkEveryMinutes: 1

Ua tali mai le fa'afoe ma ua sauni e siaki igoa avanoa:

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Stale feature branch is being processing.","namespaceSubstring":"-pr-","afterDaysWithoutDeploy":1,"checkEveryMinutes":1,"isDebug":"true"}

Faʻapipiʻi fixtures, e iai igoa avanoa e lua (project-pr-1, project-pr-2) ma i latou deployments, services, ingress, ma faapena atu ai lava:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/first-feature-branch.yml -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/second-feature-branch.yml
...
namespace/project-pr-1 created
deployment.apps/project-pr-1 created
service/project-pr-1 created
horizontalpodautoscaler.autoscaling/project-pr-1 created
secret/project-pr-1 created
configmap/project-pr-1 created
ingress.extensions/project-pr-1 created
namespace/project-pr-2 created
deployment.apps/project-pr-2 created
service/project-pr-2 created
horizontalpodautoscaler.autoscaling/project-pr-2 created
secret/project-pr-2 created
configmap/project-pr-2 created
ingress.extensions/project-pr-2 created

Matou te siakiina o punaoa uma o loʻo i luga ua maeʻa ona fatuina:

$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...
NAME                              ... READY ... STATUS  ... AGE
pod/project-pr-1-848d5fdff6-rpmzw ... 1/1   ... Running ... 67s

NAME                         ... READY ... AVAILABLE ... AGE
deployment.apps/project-pr-1 ... 1/1   ... 1         ... 67s
...

Talu ai na matou aofia ai debug, igoa avanoa project-pr-1 и project-pr-2, o le mea lea o isi punaoa uma e tatau ona tape vave e aunoa ma le amanaia o le parakalafa afterDaysWithoutDeploy. E mafai ona vaʻaia lenei mea i faʻamaumauga a le operator:

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-1"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-1","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-1"}
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-2"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-2","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-2"}

Afai e te siakiina le maua o punaoa, o le a latou i le tulaga Terminating (fa'asologa o le tapeina) po'o ua uma ona tape (o le fa'atonuga o galuega e gaogao).

$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...

E mafai ona e toe faia le faagasologa o le fausiaina fixtures ni nai taimi ma ia mautinoa e aveese i totonu o le minute.

Suiga

O le a se mea e mafai ona fai nai lo se fa'alapotopotoga e galue i se fuifui? E tele auala, oi latou uma e le atoatoa (ma o latou vaivaiga e faʻatatau), ma e filifili tagata uma mo ia lava le mea e sili ona lelei mo se galuega faʻapitoa:

  1. Ave'ese le lala fa'apitoa i le fa'aauauina o le fa'apipi'iina o le lala matua.

    • Ina ia faia lenei mea, e tatau ona e iloa po'o fea talosaga toso e fa'atatau i le ta'utinoga o lo'o fausia. Talu ai ona o le vaega o igoa ole lala o lo'o i ai le fa'ailoaina o talosaga - lona numera, po'o le igoa o le lala, e tatau lava ona fa'ailoa mai le fa'ailoga i le commit.
    • O faufale matai o lala ua faaletonu. Mo se faʻataʻitaʻiga, o loʻo ia te oe laʻasaga nei: download le poloketi, faʻataʻitaʻiga suʻega, fausia le poloketi, faia se faʻamalolo, auina atu faʻamatalaga, faʻamama le lala vaega o le talosaga toso mulimuli. Afai e le manuia le fausiaina pe a tuʻuina atu se faʻamatalaga, e tatau ona e tape uma punaoa i totonu o le fuifui ma le lima.
    • A aunoa ma se fa'amatalaga talafeagai, o le tapeina o vaega fa'apitoa i le master build e le manino.

  2. Fa'aaogā mata'itusi (faataitaiga).

    • Atonu e le o lau auala lea. Mo se faataitaiga, i Jenkins, na'o le tasi le ituaiga o paipa e lagolagoina le mafai ona fa'asaoina ona fa'atonuga i le fa'ailoga puna. A fa'aoga webhooks, e tatau ona e tusia lau lava tusitusiga e fa'agasolo ai. O lenei tusitusiga e tatau ona tuʻuina i le Jenkins interface, lea e faigata ona tausia.

  3. Ia tusia Cronjob ma fa'aopoopo se fuifui Kubernetes.

    • Faʻaalu taimi i le tusitusi ma le lagolago.
    • Ua uma ona galue le tagata fa'afoe i se faiga fa'apena, ua fa'amaumauina ma lagolagoina.

Faafetai mo lou gauai atu i le tusiga. So'oga ile poloketi ile Github.

puna: www.habr.com

Faaopoopo i ai se faamatalaga