
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), . 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 ... 5d7hFör information om hur man implementerar funktionsgrenar i klustret, kan du lÀsa och .
Motivation
LÄt oss titta pÄ en typisk livscykel för en pull request med kontinuerlig integration (kontinuerlig integration):
- Vi pushar en ny commit till grenen.
- Vid bygget körs linters och/eller tester.
- Kubernetes-konfigurationerna för pull requesten formuleras dynamiskt (till exempel, dess nummer sÀtts in i en förberedd mall).
- Med hjÀlp av kubectl apply kommer konfigurationerna att överföras till klustret (distribuera).
- 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.ymlSkapa 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: 3Parameter 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:
- för att arbeta i en isolerad miljö.
- startar Kubernetes-klustret lokalt.
- â 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.ymlEftersom 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 klustretStaleFeatureBranch $ 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Àrdigafixtures 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.ymlI 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: 1Operatö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 createdVi 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:
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.
AnvÀnda webhookar ().
- Kanske Àr det inte din metod. Till exempel, i , 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.
Skriva 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. .
KĂ€lla: habr.com
