Tneħħija ta 'fergħa ta' karatteristika skaduta fi cluster Kubernetes

Tneħħija ta 'fergħa ta' karatteristika skaduta fi cluster Kubernetes

Hi! Fergħa tal-karatteristika (magħruf ukoll bħala preview, reviżjoni app) - dan huwa meta mhux biss il-fergħa prinċipali hija skjerata, iżda wkoll kull talba pull għal URL uniku. Tista 'tiċċekkja jekk il-kodiċi jaħdimx f'ambjent ta' produzzjoni; il-karatteristika tista 'tintwera lil programmaturi oħra jew speċjalisti tal-prodott. Waqt li tkun qed taħdem f'talba tal-ġibda, kull skjerament attwali ta' impenn ġdid għall-kodiċi l-antik jitħassar, u l-iskjerament il-ġdid għall-kodiċi l-ġdid jiġi rrolljat. Mistoqsijiet jistgħu jinqalgħu meta inti għaqqad talba pull fil-fergħa prinċipali. M'għadx għandek bżonn il-fergħa tal-karatteristika, iżda r-riżorsi Kubernetes għadhom fil-cluster.

Aktar dwar il-fergħat tal-karatteristiċi

Approċċ wieħed biex isiru fergħat tal-karatteristiċi f'Kubernetes huwa li tuża namespaces. Fil-qosor, il-konfigurazzjoni tal-produzzjoni tidher bħal din:

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

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

Għal fergħa ta’ karatteristika, jinħoloq spazju tal-isem bl-identifikatur tiegħu (pereżempju, in-numru tat-talba tal-ġibda) u xi tip ta’ prefiss/postfiss (pereżempju, -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
...

B'mod ġenerali, ktibt Operatur Kubernetes (applikazzjoni li għandha aċċess għar-riżorsi tal-clusters), link għall-proġett fuq Github. Tneħħi l-ispazji tal-isem li jappartjenu għal fergħat tal-karatteristiċi qodma. F'Kubernetes, jekk tħassar spazju tal-isem, riżorsi oħra f'dak l-ispazju tal-isem jitħassru wkoll awtomatikament.

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

Tista' taqra dwar kif timplimenta fergħat tal-karatteristiċi fi cluster hawn и hawn.

Motivazzjoni

Ejja nħarsu lejn ċiklu tal-ħajja tipiku ta 'pull request b'integrazzjoni kontinwa (continuous integration):

  1. Aħna nimbuttaw impenn ġdid għall-fergħa.
  2. Fuq il-bini, isiru linters u/jew testijiet.
  3. Il-konfigurazzjonijiet tat-talba tal-ġibda ta 'Kubernetes huma ġġenerati fuq il-fly (per eżempju, in-numru tiegħu jiddaħħal fil-mudell lest).
  4. Bl-użu ta 'kubectl apply, il-konfigurazzjonijiet huma miżjuda mal-cluster (skjerament).
  5. It-talba tal-ġibda hija magħquda fil-fergħa prinċipali.

Waqt li tkun qed taħdem f'talba tal-ġibda, kull skjerament attwali ta' impenn ġdid għall-kodiċi l-antik jitħassar, u l-iskjerament il-ġdid għall-kodiċi l-ġdid jiġi mxerred. Iżda meta talba ta 'ġibda tiġi magħquda fil-fergħa prinċipali, il-fergħa prinċipali biss se tinbena. Bħala riżultat, jirriżulta li diġà nsejna t-talba tal-ġibda, u r-riżorsi Kubernetes tagħha għadhom fil-cluster.

Kif tuża

Installa l-proġett bil-kmand hawn taħt:

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

Oħloq fajl bil-kontenut li ġej u installa permezz kubectl apply -f:

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

Parametru namespaceSubstring meħtieġa biex jiġu ffiltrati l-ispazji tal-isem għal talbiet tal-ġibda minn spazji tal-isem oħra. Pereżempju, jekk il-cluster ikollu l-ispazji tal-ismijiet li ġejjin: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, allura l-kandidati għat-tħassir se jkunu habr-back-end-pr-17, habr-back-end-pr-33.

Parametru afterDaysWithoutDeploy meħtieġa biex tħassar namespaces qodma. Pereżempju, jekk jinħoloq namespace 3 дня 1 час lura, u l-parametru jindika 3 дня, dan l-ispazju tal-isem se jitħassar. Taħdem ukoll fid-direzzjoni opposta jekk jinħoloq l-ispazju tal-isem 2 дня 23 часа lura, u l-parametru jindika 3 дня, dan l-ispazju tal-isem mhux se jitħassar.

Hemm parametru ieħor, huwa responsabbli għal kemm-il darba tiskennja l-ispazji tal-isem kollha u tiċċekkja għal jiem mingħajr skjerament - checkEveryMinutes. B'mod awtomatiku huwa ugwali 30 минутам.

Kif taħdem din

Fil-prattika, ser ikollok bżonn:

  1. Docker għax-xogħol f'ambjent iżolat.
  2. Minikube se tqajjem cluster Kubernetes lokalment.
  3. kubectl — interface tal-linja tal-kmand għall-ġestjoni tar-raggruppamenti.

Aħna ngħollu raggruppament Kubernetes lokalment:

$ 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.

Speċifika kubectl uża cluster lokali b'mod awtomatiku:

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

Niżżel il-konfigurazzjonijiet għall-ambjent tal-produzzjoni:

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

Peress li l-konfigurazzjonijiet tal-produzzjoni huma kkonfigurati biex jiċċekkjaw l-ispazji tal-ismijiet qodma, u l-cluster tagħna li għadu kif tqajjem m'għandux minnhom, aħna se nissostitwixxu l-varjabbli ambjentali IS_DEBUG fuq true. B'dan il-valur il-parametru afterDaysWithoutDeploy ma jitqiesx u l-ispazji tal-isem ma jiġux iċċekkjati għal jiem mingħajr skjerament, biss għall-okkorrenza tas-substring (-pr-).

Jekk inti fuq Linux:

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

Jekk inti fuq macOS:

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

Installazzjoni tal-proġett:

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

Iċċekkja li riżorsa dehret fil-cluster StaleFeatureBranch:

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

Aħna niċċekkjaw li operatur deher fil-cluster:

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

Jekk tħares lejn ir-zkuk tagħha, hija lesta biex tipproċessa r-riżorsi 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}

Aħna ninstallaw lesti fixtures (konfigurazzjonijiet lesti għall-immudellar tar-riżorsi tal-cluster) għal riżors StaleFeatureBranch:

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

Il-konfigurazzjonijiet jindikaw li tfittex spazji tal-isem b'substring -pr- darba ġewwa 1 минуту.:

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

L-operatur wieġeb u lest jiċċekkja l-ispazji tal-isem:

$ 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"}

Installa fixtures, li fih żewġ spazji tal-isem (project-pr-1, project-pr-2) u minnhom deployments, services, ingress, u l-bqija:

$ 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

Aħna niċċekkjaw li r-riżorsi kollha t'hawn fuq inħolqu b'suċċess:

$ 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
...

Peress li aħna inklużi debug, spazji tal-ismijiet project-pr-1 и project-pr-2, għalhekk ir-riżorsi l-oħra kollha se jkollhom jitħassru immedjatament mingħajr ma jittieħed kont tal-parametru afterDaysWithoutDeploy. Dan jista' jidher fir-reġistru tal-operatur:

$ 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"}

Jekk tiċċekkja d-disponibbiltà tar-riżorsi, dawn ikunu fl-istatus Terminating (proċess ta 'tħassir) jew diġà mħassra (output tal-kmand huwa vojt).

$ 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
...

Tista 'tirrepeti l-proċess tal-ħolqien fixtures diversi drabi u kun żgur li jitneħħew fi żmien minuta.

Alternattivi

X'jista' jsir minflok operatur li jaħdem fi cluster? Hemm diversi approċċi, kollha kemm huma imperfetti (u n-nuqqasijiet tagħhom huma suġġettivi), u kulħadd jiddeċiedi għalih innifsu x'inhu l-aħjar għal proġett partikolari:

  1. Ħassar fergħa tal-karatteristika waqt il-bini ta 'integrazzjoni kontinwa tal-fergħa prinċipali.

    • Biex tagħmel dan, trid tkun taf liema pull request tirrelata mal-commit li qed jinbena. Peress li l-ispazju tal-isem tal-fergħa tal-karatteristika fih l-identifikatur tal-pull request - in-numru tiegħu, jew l-isem tal-fergħa, l-identifikatur dejjem ikollu jiġi speċifikat fil-commit.
    • Il-bini tal-fergħa Master qed ifallu. Pereżempju, għandek l-istadji li ġejjin: niżżel il-proġett, tmexxi testijiet, tibni l-proġett, tagħmel rilaxx, tibgħat notifiki, neħħi l-fergħa tal-karatteristika tal-aħħar talba tal-ġibda. Jekk il-bini jfalli meta tibgħat notifika, ikollok tħassar ir-riżorsi kollha fil-cluster manwalment.
    • Mingħajr kuntest xieraq, it-tħassir tal-fergħat tal-karatteristiċi fil-master build mhuwiex ovvju.

  2. Tuża webhooks (eżempju).

    • Dan jista 'ma jkunx l-approċċ tiegħek. Per eżempju, fi Jenkins, tip wieħed biss ta 'pipeline jappoġġja l-abbiltà li tissejvja l-konfigurazzjonijiet tagħha fil-kodiċi tas-sors. Meta tuża webhooks, trid tikteb l-iskript tiegħek stess biex tipproċessahom. Din l-iskrittura se jkollha titqiegħed fl-interface Jenkins, li huwa diffiċli biex tinżamm.

  3. Ikteb Cronjob u żid cluster Kubernetes.

    • Tqatta’ ħin fuq il-kitba u l-appoġġ.
    • L-operatur diġà jaħdem fi stil simili, huwa dokumentat u appoġġjat.

Grazzi għall-attenzjoni tiegħek għall-artiklu. Link għall-proġett fuq Github.

Sors: www.habr.com

Żid kumment