Vee 'n verouderde kenmerktak in 'n Kubernetes-kluster uit
Привет! kenmerk tak (ook bekend as ontplooi voorskou, hersien app) is wanneer nie net die meestertak ontplooi word nie, maar ook elke trekversoek na 'n unieke URL. U kan kyk of die kode in die produksie-omgewing werk, u kan die kenmerk aan ander programmeerders of produkbestuurders wys. Terwyl jy aan 'n trekversoek werk, word elke nuwe commit die huidige ontplooiing vir die ou kode verwyder, en 'n nuwe ontplooiing vir die nuwe kode word ontplooi. Vrae kan ontstaan wanneer jy 'n trekversoek in die meestertak saamgevoeg het. Jy het nie meer die kenmerktak nodig nie, maar die Kubernetes-hulpbronne is steeds in die groepie.
Meer oor kenmerktakke
Een benadering om kenmerktakke in Kubernetes te maak, is om naamruimtes te gebruik. Kortom, die produksiekonfigurasie lyk soos volg:
Vir 'n kenmerktak word 'n naamruimte geskep met sy identifiseerder (byvoorbeeld die trekversoeknommer) en een of ander voorvoegsel / postfix (byvoorbeeld, -pr-):
Oor die algemeen het ek geskryf Kubernetes-operateur (toepassing wat toegang tot groephulpbronne het), projekskakel op Github. Dit verwyder naamruimtes wat aan ou kenmerktakke behoort. In Kubernetes, as jy 'n naamspasie uitvee, word ander hulpbronne in daardie naamspasie ook outomaties uitgevee.
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h
Jy kan lees oor hoe om kenmerktakke in 'n groepie te implementeer hier и hier.
Motivering
Kom ons kyk na 'n tipiese deurlopende integrasie trek versoek lewensiklus (continuous integration):
Ons druk 'n nuwe verbintenis tot die tak.
Op die bouvorm word linters en/of toetse uitgevoer.
Kubernetes-trekversoekkonfigurasies word dadelik gevorm (byvoorbeeld, die nommer daarvan word in die voltooide sjabloon vervang).
Deur kubectl application te gebruik, kom die konfigurasies in die groep in (ontplooi).
Die trekversoek word saamgevoeg in die meestertak.
Terwyl jy aan 'n trekversoek werk, word elke nuwe commit die huidige ontplooiing vir die ou kode verwyder, en 'n nuwe ontplooiing vir die nuwe kode word ontplooi. Maar wanneer 'n trekversoek in die meestertak saamgevoeg word, sal slegs die meestertak gebou word. As gevolg hiervan blyk dit dat ons reeds van die trekversoek vergeet het, en sy Kubernetes-hulpbronne is steeds in die groep.
Parameter naamruimteSubstring nodig om trekversoek-naamruimtes van ander naamruimtes te filter. Byvoorbeeld, as die groep die volgende naamruimtes het: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, dan sal die kandidate vir skrapping wees habr-back-end-pr-17, habr-back-end-pr-33.
Parameter afterDaysWithoutDeploy nodig om ou naamruimtes te verwyder. Byvoorbeeld, as naamruimte geskep word 3 дня 1 час terug, en die parameter spesifiseer 3 дня, sal hierdie naamspasie verwyder word. Werk andersom as naamruimte geskep word 2 дня 23 часа terug, en die parameter spesifiseer 3 дня, sal hierdie naamspasie nie verwyder word nie.
Daar is nog een parameter, dit is verantwoordelik vir hoe gereeld om alle naamruimtes te skandeer en vir dae na te gaan sonder om te ontplooi - checkEveryMinutes. By verstek is dit gelyk aan 30 минутам.
$ 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.
Ons dui aan kubectl gebruik standaard plaaslike cluster:
$ kubectl config use-context minikube
Switched to context "minikube".
Laai die konfigurasie vir die produksie-omgewing af:
Aangesien die produksiekonfigurasies gekonfigureer is om na ou naamruimtes te kyk, en daar is geen in ons nuwe groepering nie, sal ons die omgewingsveranderlike vervang IS_DEBUG op true. Met hierdie waarde, die parameter afterDaysWithoutDeploy word nie in ag geneem nie en naamruimtes word nie vir dae sonder ontplooiing nagegaan nie, slegs vir die voorkoms van 'n substring (-pr-).
As jy aan is Linux:
$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml
As jy aan is macOS:
$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml
$ kubectl get pods --namespace stale-feature-branch-operator
NAME ... STATUS ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s
As jy na sy logs kyk, is hy gereed om hulpbronne te verwerk StaleFeatureBranch:
Die operateur het gereageer en is gereed om naamruimtes na te gaan:
$ 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"}
Stel fixtures, wat twee naamruimtes bevat (project-pr-1, project-pr-2) en hulle deployments, services, ingress, en so aan:
$ 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
Kontroleer dat alle hulpbronne hierbo suksesvol geskep is:
$ 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
...
Aangesien ons ingesluit het debug, naamruimtes project-pr-1 и project-pr-2, dus sal alle ander hulpbronne onmiddellik uitgevee moet word sonder om die parameter in ag te neem afterDaysWithoutDeploy. Dit kan gesien word in die logs van die operateur:
$ 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"}
As jy die beskikbaarheid van hulpbronne nagaan, sal hulle in die status wees Terminating (uitveeproses) of reeds uitgevee (beveluitvoer is leeg).
$ 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
...
U kan die skeppingsproses herhaal fixtures verskeie kere en maak seker dat hulle binne 'n minuut verwyder word.
alternatiewe
Wat kan gedoen word in plaas van 'n operateur wat in 'n groep werk? Daar is verskeie benaderings, almal is nie ideaal nie (en hul tekortkominge is subjektief), en elkeen besluit self wat die beste is vir 'n spesifieke projek:
Verwyder kenmerktak tydens meestertak deurlopende integrasiebou.
Om dit te doen, moet jy weet watter trekversoek behoort aan die commit wat gebou word. Aangesien die kenmerktaknaamruimte die trekversoekidentifiseerder bevat - sy nommer, of die naam van die tak, sal die identifiseerder altyd in die commit gespesifiseer moet word.
Bouwerk van meestertakke misluk. Byvoorbeeld, jy het die volgende stadiums: laai die projek af, voer toetse uit, bou die projek, maak 'n vrystelling, stuur kennisgewings, maak die kenmerktak van die laaste trekversoek skoon. As die bou misluk met die stuur van 'n kennisgewing, sal jy alle hulpbronne in die groep met die hand moet uitvee.
Sonder behoorlike konteks is dit nie voor die hand liggend om 'n kenmerktak in 'n meesterbou uit te vee nie.
Miskien is dit nie jou benadering nie. Byvoorbeeld, in Jenkins, ondersteun slegs een tipe pyplyn die vermoë om sy konfigurasies in die bronkode te stoor. Wanneer jy webhooks gebruik, moet jy jou eie skrif skryf om dit te verwerk. Hierdie skrif sal in die Jenkins-koppelvlak geplaas moet word, wat moeilik is om te onderhou.