Tar bort den gamla funktionningsgrenen i Kubernetes-klustret

Tar bort den gamla funktionningsgrenen i Kubernetes-klustret

Hej! Funktionsgren (Ă€ven kallad distributionsförhandsgranskning, granskning av app) — det Ă€r nĂ€r inte bara master-grenen distribueras, utan Ă€ven varje pull request till en unik URL. Du kan kontrollera om koden fungerar i produktionsmiljö, och funktionen kan visas för andra programmerare eller produktchefer. Medan du arbetar i en pull request raderas den aktuella distributionen för den gamla koden med varje ny commit, och en ny distribution för den nya koden rullas ut. FrĂ„gor kan uppstĂ„ efter att du har sammanslagit din pull request till master-grenen. Funktionsgrenen behövs inte lĂ€ngre, men Kubernetes-resurserna finns fortfarande kvar i klustret.

Mer om funktionsgrenar

Ett av sÀtten att skapa funktionsgrenar i Kubernetes Àr att anvÀnda namnrymder. Om vi sammanfattar, ser produktionskonfigurationerna ut sÄ hÀr:

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

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

För funktionsgrenen skapas en namnrymd med dess identifierare (till exempel, numret pÄ pull requesten) och nÄgon form av prefix/suffix (till exempel, -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
...

Sammanfattningsvis, jag skrev Kubernetes Operator (en applikation som har Ätkomst till klustrets resurser), lÀnk till projektet pÄ Github. Den tar bort namnrymder som hör till gamla funktionsgrenar. I Kubernetes, om du tar bort en namnrymd, tas andra resurser i denna namnrymd bort automatiskt.

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

För information om hur man implementerar funktionsgrenar i klustret, kan du lÀsa ). Ett typiskt exempel pÄ anvÀndning: och ). Ett typiskt exempel pÄ anvÀndning:.

Motivation

LÄt oss titta pÄ en typisk livscykel för en pull request med kontinuerlig integration (kontinuerlig integration):

  1. Vi pushar en ny commit till grenen.
  2. Vid bygget körs linters och/eller tester.
  3. Kubernetes-konfigurationerna för pull requesten formuleras dynamiskt (till exempel, dess nummer sÀtts in i en förberedd mall).
  4. Med hjÀlp av kubectl apply kommer konfigurationerna att överföras till klustret (distribuera).
  5. Pull requesten slÄs samman med master-grenen.

Medan du arbetar i en pull request raderas den aktuella distributionen för den gamla koden med varje ny commit, och en ny distribution för den nya koden rullas ut. Men nÀr pull requesten slÄs samman med master-grenen byggs endast master-grenen. Resultatet blir att vi har glömt pull requesten, men dess Kubernetes-resurser finns fortfarande kvar i klustret.

Hur man anvÀnder

Installera projektet med kommandot nedan:

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

Skapa en fil med följande innehÄll och installera genom kubectl apply -f:

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

Parameter namespaceSubstring behövs för att filtrera namespace för pull request frÄn andra namespace. Till exempel, om klustret har följande namespace: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, dÄ kommer kandidaterna för borttagning att vara habr-back-end-pr-17, habr-back-end-pr-33.

Parameter afterDaysWithoutDeploy behövs för att ta bort gamla namespace. Till exempel, om namespace skapades 3 dagar 1 timme sedan, och parametern anges som 3 dagar, kommer detta namespace att tas bort. Det fungerar ocksÄ tvÀrtom; om namespace skapades 2 dagar 23 timmar sedan, och parametern anges som 3 dagar, kommer detta namespace inte att tas bort.

Det finns en annan parameter som ansvarar för hur ofta alla namespace inspekteras och kontrolleras för dagar utan deploy — checkEveryMinutes. Som standard Ă€r den instĂ€lld pĂ„ 30 minuter.

Hur det fungerar

I praktiken kommer det att behövas:

  1. Docker för att arbeta i en isolerad miljö.
  2. Minikube startar Kubernetes-klustret lokalt.
  3. kubectl — kommandoradsgrĂ€nssnitt för att hantera klustret.

Startar Kubernetes-klustret lokalt:

$ minikube start --vm-driver=docker
minikube v1.11.0 pÄ Darwin 10.15.5
AnvÀnder docker-drivrutinen baserat pÄ befintlig profil.
Startar kontrollplanet nod minikube i klustret minikube.

Ange kubectl anvÀnda det lokala klustret som standard:

$ kubectl config use-context minikube
Bytte till kontext "minikube".

Laddar ner konfigurationerna för produktionsmiljön:

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

Eftersom produktionskonfigurationerna Àr instÀllda pÄ att kontrollera gamla namespace, och det inte finns nÄgra i vÄrt nyuppsatta kluster, kommer vi att byta ut miljövariabeln IS_DEBUG till true. NÀr detta vÀrde Àr instÀllt beaktas inte parametern och namespace kontrolleras inte för dagar utan deploy, endast för förekomsten av delstrÀngen ( afterDaysWithoutDeploy Om du Àr pÄ-pr-).

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

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

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

Installerar projektet:

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

Kontrollerar att resursen har dykt upp i klustret

StaleFeatureBranch $ kubectl api-resources | grep stalefeaturebranches NAMN ... APIGROUP ... TYP stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch:

Kontrollerar att operatören har dykt upp i klustret:

$ kubectl get pods --namespace stale-feature-branch-operator NAMN ... STATUS ... ÅLDER stale-feature-branch-operator-6bfbfd4df8-m7sch ... Kör ... 38s

Om man kollar loggarna för det, Àr det redo att hantera resurser

$ 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} $ kubectl api-resources | grep stalefeaturebranches NAMN ... APIGROUP ... TYP stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch:

Installerar fÀrdiga

fixtures armaturer (fÀrdiga konfigurationer för resurskluster) för resursen $ kubectl api-resources | grep stalefeaturebranches NAMN ... APIGROUP ... TYP stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch:

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

I konfigurationerna anges att söka efter namespaces med delstrÀng -pr- varje 1 minut.:

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

Operatören reagerade och Àr redo att kontrollera namespaces:

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

Installera armaturer, som innehÄller tvÄ namespaces (project-pr-1, project-pr-2) och deras deployment, tjÀnster, ingress, och sÄ vidare:

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

Vi kontrollerar att alla resurser ovan har skapats framgÄngsrikt:

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

Eftersom vi har aktiverat debug, namespaces project-pr-1 och project-pr-2, mÄste dÀrför alla andra resurser avlÀgsnas omedelbart oavsett parametern afterDaysWithoutDeploy. Detta kan ses i operatörens loggar:

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

Om du kontrollerar tillgÄngen till resurser kommer de att vara i status Terminating (borttagningsprocess) eller redan borttagna (kommandoutdata Àr tomt).

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

Du kan upprepa skapelseprocessen armaturer flera gÄnger och se till att de tas bort inom en minut.

Alternativ

Vad kan man göra istÀllet för en operator som arbetar i en kluster? Det finns flera tillvÀgagÄngssÀtt, alla Àr inte perfekta (och deras nackdelar Àr subjektiva), och varje person mÄste avgöra vad som passar bÀst för just sitt projekt:

  1. Att ta bort feature branch under bygget av master-grenen för kontinuerlig integration.

    • För detta mĂ„ste man veta vilken pull request som hör till commit'en som byggs. Eftersom feature branch-namnet innehĂ„ller identifieraren för pull request'en — dess nummer eller namnet pĂ„ grenen, mĂ„ste identifieraren alltid anges i commit'en.
    • Byggen av master-grenar misslyckas. Till exempel, har ni följande steg: ladda ner projektet, köra tester, bygga projektet, göra en release, skicka meddelanden, rensa feature branch av den senaste pull request'en. Om bygget misslyckas vid avsĂ€ndandet av meddelandet, mĂ„ste ni ta bort alla resurser i klustret manuellt.
    • Utan rĂ€tt sammanhang Ă€r det inte uppenbart att ta bort feature branch i master-bygget.

  2. AnvÀnda webhookar (exempel).

    • Kanske Ă€r det inte din metod. Till exempel, i Jenkins, stöder endast en typ av pipeline möjligheten att spara dess konfigurationer i kĂ€llkoden. Vid anvĂ€ndning av webhookar mĂ„ste man skriva ett eget skript för deras hantering. Detta skript mĂ„ste placeras i Jenkins-grĂ€nssnittet, vilket Ă€r svĂ„rt att underhĂ„lla.

  3. Skriva Cronjob och lÀgga till Kubernetes-klustret.

    • Tid som lĂ€ggs pĂ„ att skriva och underhĂ„lla.
    • Operatören fungerar redan i en liknande stil, Ă€r dokumenterad och underhĂ„lls.

Tack för ert intresse för artikeln. LÀnk till projektet pÄ Github.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster