Cael gwared ar gangen nodwedd hen ffasiwn mewn clwstwr Kubernetes

Cael gwared ar gangen nodwedd hen ffasiwn mewn clwstwr Kubernetes

Hi! Cangen nodwedd (aka rhagolwg deploy, app adolygu) - dyma pryd nid yn unig y brif gangen yn cael ei defnyddio, ond hefyd pob cais tynnu i URL unigryw. Gallwch wirio a yw'r cod yn gweithio mewn amgylchedd cynhyrchu; gellir dangos y nodwedd i raglenwyr eraill neu arbenigwyr cynnyrch. Tra'ch bod yn gweithio mewn cais tynnu, mae pob gosodiad cyfredol ymrwymo newydd ar gyfer yr hen god yn cael ei ddileu, a bydd y defnydd newydd ar gyfer y cod newydd yn cael ei gyflwyno. Gall cwestiynau godi pan fyddwch chi'n uno cais tynnu â'r brif gangen. Nid oes angen y gangen nodwedd arnoch mwyach, ond mae adnoddau Kubernetes yn dal i fod yn y clwstwr.

Mwy am ganghennau nodwedd

Un dull o wneud canghennau nodwedd yn Kubernetes yw defnyddio gofodau enwau. Yn fyr, mae'r cyfluniad cynhyrchu yn edrych fel hyn:

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

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

Ar gyfer cangen nodwedd, crëir gofod enw gyda'i ddynodwr (er enghraifft, y rhif cais tynnu) a rhyw fath o rhagddodiad / gosodiad post (er enghraifft, -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
...

Yn gyffredinol, ysgrifennais Gweithredwr Kubernetes (cymhwysiad sydd â mynediad at adnoddau clwstwr), dolen i'r prosiect ar Github. Mae'n dileu bylchau enwau sy'n perthyn i hen ganghennau nodwedd. Yn Kubernetes, os byddwch yn dileu gofod enw, mae adnoddau eraill yn y gofod enw hwnnw hefyd yn cael eu dileu'n awtomatig.

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

Gallwch ddarllen am sut i weithredu canghennau nodwedd yn glwstwr yma и yma.

Cymhelliant

Gadewch i ni edrych ar gylch bywyd cais tynnu nodweddiadol gydag integreiddio parhaus (continuous integration):

  1. Rydym yn gwthio ymrwymiad newydd i'r gangen.
  2. Ar yr adeilad, cynhelir linters a/neu brofion.
  3. Cynhyrchir ffurfweddiadau cais tynnu Kubernetes ar y hedfan (er enghraifft, mae ei rif yn cael ei fewnosod yn y templed gorffenedig).
  4. Gan ddefnyddio kubectl, ychwanegir ffurfweddiadau at y clwstwr (defnyddio).
  5. Cais tynnu yn cael ei uno i mewn i'r brif gangen.

Tra'ch bod yn gweithio mewn cais tynnu, mae pob gosodiad cyfredol ymrwymo newydd ar gyfer yr hen god yn cael ei ddileu, a bydd y defnydd newydd ar gyfer y cod newydd yn cael ei gyflwyno. Ond pan fydd cais tynnu yn cael ei uno â'r brif gangen, dim ond y brif gangen fydd yn cael ei hadeiladu. O ganlyniad, mae'n ymddangos ein bod eisoes wedi anghofio am y cais tynnu, ac mae ei adnoddau Kubernetes yn dal i fod yn y clwstwr.

Sut i ddefnyddio

Gosodwch y prosiect gyda'r gorchymyn isod:

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

Creu ffeil gyda'r cynnwys canlynol a gosod trwy kubectl apply -f:

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

Paramedr namespaceSubstring angen hidlo bylchau enwau ar gyfer ceisiadau tynnu o ofodau enwau eraill. Er enghraifft, os oes gan y clwstwr y gofodau enwau canlynol: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, yna bydd ymgeiswyr ar gyfer dileu yn habr-back-end-pr-17, habr-back-end-pr-33.

Paramedr afterDaysWithoutDeploy angen dileu hen ofodau enwau. Er enghraifft, os crëir gofod enwau 3 дня 1 час yn ôl, ac mae'r paramedr yn nodi 3 дня, bydd y gofod enw hwn yn cael ei ddileu. Mae hefyd yn gweithio i'r cyfeiriad arall os yw'r gofod enw yn cael ei greu 2 дня 23 часа yn ôl, ac mae'r paramedr yn nodi 3 дня, ni fydd y gofod enw hwn yn cael ei ddileu.

Mae un paramedr arall, mae'n gyfrifol am ba mor aml i sganio pob gofod enw a gwirio am ddyddiau heb eu defnyddio - gwirioPob Munud. Yn ddiofyn, mae'n gyfartal 30 минутам.

Sut mae hwn

Yn ymarferol, bydd angen:

  1. Docker ar gyfer gweithio mewn amgylchedd anghysbell.
  2. Miniciwb yn codi clwstwr Kubernetes yn lleol.
  3. ciwctl - rhyngwyneb llinell orchymyn ar gyfer rheoli clwstwr.

Rydym yn codi clwstwr Kubernetes yn lleol:

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

Nodwch kubectl defnyddio clwstwr lleol yn ddiofyn:

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

Lawrlwythwch ffurfweddiadau ar gyfer yr amgylchedd cynhyrchu:

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

Gan fod cyfluniadau cynhyrchu wedi'u ffurfweddu i wirio hen ofodau enwau, ac nad oes gan ein clwstwr newydd eu codi, byddwn yn disodli'r newidyn amgylchedd IS_DEBUG ar true. Gyda'r gwerth hwn y paramedr afterDaysWithoutDeploy nid yw'n cael ei gymryd i ystyriaeth ac ni chaiff bylchau enwau eu gwirio am ddyddiau heb eu defnyddio, dim ond os yw'r is-linyn yn digwydd (-pr-).

Os ydych ar Linux:

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

Os ydych ar macOS:

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

Gosod y prosiect:

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

Gwirio bod adnodd wedi ymddangos yn y clwstwr StaleFeatureBranch:

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

Rydym yn gwirio bod gweithredwr wedi ymddangos yn y clwstwr:

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

Os edrychwch ar ei logiau, mae'n barod i brosesu adnoddau 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}

Rydym yn gosod parod fixtures (ffurfweddiadau parod ar gyfer modelu adnoddau clwstwr) ar gyfer adnodd StaleFeatureBranch:

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

Mae'r ffurfweddiadau'n dynodi chwilio am ofodau enwau gydag is-linyn -pr- unwaith i mewn 1 минуту.:

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

Mae'r gweithredwr wedi ymateb ac mae'n barod i wirio bylchau enwau:

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

Gosod fixtures, yn cynnwys dau fwlch enw (project-pr-1, project-pr-2) a nhw deployments, services, ingress, ac yn y blaen:

$ 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

Rydym yn gwirio bod yr holl adnoddau uchod wedi’u creu’n llwyddiannus:

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

Ers i ni gynnwys debug, gofodau enwau project-pr-1 и project-pr-2, felly bydd yn rhaid dileu'r holl adnoddau eraill ar unwaith heb ystyried y paramedr afterDaysWithoutDeploy. Mae hyn i'w weld yn y logiau gweithredwr:

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

Os byddwch yn gwirio argaeledd adnoddau, byddant yn y statws Terminating (proses dileu) neu eisoes wedi'i ddileu (allbwn gorchymyn yn wag).

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

Gallwch ailadrodd y broses greu fixtures sawl gwaith a gwnewch yn siŵr eu bod yn cael eu tynnu o fewn munud.

Dewisiadau amgen

Beth ellir ei wneud yn lle gweithredwr sy'n gweithio mewn clwstwr? Mae yna sawl dull, pob un ohonynt yn amherffaith (ac mae eu diffygion yn oddrychol), ac mae pawb yn penderfynu drostynt eu hunain beth sydd orau ar gyfer prosiect penodol:

  1. Dileu cangen nodwedd yn ystod integreiddio parhaus y brif gangen.

    • I wneud hyn, mae angen i chi wybod pa gais tynnu sy'n ymwneud â'r ymrwymiad sy'n cael ei adeiladu. Gan fod gofod enw'r gangen nodwedd yn cynnwys y dynodwr cais tynnu - ei rif, neu enw'r gangen, bydd yn rhaid nodi'r dynodwr bob amser yn yr ymrwymiad.
    • Mae prif adeiladau cangen yn methu. Er enghraifft, mae gennych y camau canlynol: lawrlwytho'r prosiect, rhedeg profion, adeiladu'r prosiect, gwneud datganiad, anfon hysbysiadau, clirio cangen nodwedd y cais tynnu olaf. Os bydd yr adeiladwaith yn methu wrth anfon hysbysiad, bydd yn rhaid i chi ddileu'r holl adnoddau yn y clwstwr â llaw.
    • Heb gyd-destun priodol, nid yw dileu canghennau nodwedd yn y prif adeilad yn amlwg.

  2. Defnyddio bachau gwe (enghraifft).

    • Efallai nad dyma'ch dull gweithredu. Er enghraifft, yn Jenkins, dim ond un math o biblinell sy'n cefnogi'r gallu i arbed ei ffurfweddiadau yn y cod ffynhonnell. Wrth ddefnyddio bachau gwe, mae angen i chi ysgrifennu eich sgript eich hun i'w prosesu. Bydd yn rhaid gosod y sgript hon yn rhyngwyneb Jenkins, sy'n anodd ei chynnal.

  3. I ysgrifennu Cronjob ac ychwanegu clwstwr Kubernetes.

    • Treulio amser ar ysgrifennu a chymorth.
    • Mae'r gweithredwr eisoes yn gweithio mewn arddull debyg, wedi'i ddogfennu a'i gefnogi.

Diolch am eich sylw i'r erthygl. Dolen i'r prosiect ar Github.

Ffynhonnell: hab.com

Ychwanegu sylw