Isusa igatsha lesici esiphelelwe yisikhathi kuqoqo le-Kubernetes

Isusa igatsha lesici esiphelelwe yisikhathi kuqoqo le-Kubernetes

Sawubona! Igatsha lesici (i-aka deploy preview, i-app yokubuyekeza) - kulapho kungekona kuphela igatsha eliyinhloko elisetshenziswayo, kodwa nesicelo ngasinye sokudonsa ku-URL ehlukile. Ungahlola ukuthi ikhodi iyasebenza yini endaweni yokukhiqiza; isici singaboniswa kwabanye abahleli bohlelo noma ochwepheshe bomkhiqizo. Ngenkathi usebenza esicelweni sokudonsa, ukuthunyelwa okusha ngakunye kwamanje kwekhodi endala kuyasuswa, futhi ukukhishwa okusha kwekhodi entsha kuyakhishwa. Imibuzo ingase iphakame lapho uhlanganisa isicelo sokudonsa egatsheni eliyinhloko. Awusalidingi igatsha lesici, kodwa izinsiza ze-Kubernetes ziseseqenjini.

Okuningi mayelana namagatsha esici

Enye indlela yokwenza amagatsha esici ku-Kubernetes ukusebenzisa izikhala zamagama. Ngamafuphi, ukucushwa kokukhiqiza kubukeka kanje:

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

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

Egatsheni lesici, indawo yegama iyakhiwa ngesihlonzi sayo (isibonelo, inombolo yesicelo sokudonsa) kanye nohlobo oluthile lwesiqalo/i-postfix (isibonelo, -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
...

Ngokuvamile, ngabhala Kubernetes Operator (uhlelo lokusebenza olukwazi ukufinyelela izinsiza zeqoqo), isixhumanisi sephrojekthi ku-Github. Isusa izikhala zamagama zamagatsha esici amadala. Ku-Kubernetes, uma ususa indawo yegama, ezinye izinsiza kuleyo ndawo yegama nazo zisuswa ngokuzenzakalelayo.

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

Ungafunda mayelana nendlela yokusebenzisa amagatsha esici abe yiqoqo lapha и lapha.

Ukugqugquzela

Ake sibheke umjikelezo wokuphila wesicelo sokudonsa ngokuhlanganisa okuqhubekayo (continuous integration):

  1. Siphusha ukuzinikela okusha egatsheni.
  2. Esakhiweni, ama-linters kanye/noma ukuhlolwa kuyenziwa.
  3. Ukucushwa kwesicelo sokudonsa kwe-Kubernetes kukhiqizwa empukaneni (isibonelo, inombolo yayo ifakwe kusifanekiso esiqediwe).
  4. Ngokusebenzisa i-kubectl iyasebenza, izilungiselelo zengezwa kuqoqo (deploy).
  5. Isicelo sokudonsa sihlanganiswe negatsha eliyinhloko.

Ngenkathi usebenza esicelweni sokudonsa, ukuthunyelwa okusha ngakunye kwamanje kwekhodi endala kuyasuswa, futhi ukukhishwa okusha kwekhodi entsha kuyakhishwa. Kodwa lapho isicelo sokudonsa sihlanganiswa negatsha elikhulu, kuzokwakhiwa igatsha elikhulu kuphela. Ngenxa yalokho, kuvela ukuthi sesivele sikhohliwe mayelana nesicelo sokudonsa, futhi izinsiza zayo ze-Kubernetes ziseseqenjini.

Indlela yokusebenzisa

Faka iphrojekthi ngomyalo ongezansi:

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

Dala ifayela ngokuqukethwe okulandelayo bese ufaka nge kubectl apply -f:

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

Ipharamitha indawo yegamaSubstring okudingekayo ukuze kuhlungwe izikhala zamagama zezicelo zokudonsa kwezinye izikhala zamagama. Isibonelo, uma iqoqo linezikhala zamagama ezilandelayo: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, bese kuba amakhandidethi azosuswa habr-back-end-pr-17, habr-back-end-pr-33.

Ipharamitha afterDaysWithoutDeploy kuyadingeka ukususa izikhala zamagama ezindala. Isibonelo, uma indawo yegama idaliwe 3 дня 1 час emuva, futhi ipharamitha ikhombisa 3 дня, lesi sikhala samagama sizosuswa. Iphinde isebenze ngokuphambene uma indawo yamagama idaliwe 2 дня 23 часа emuva, futhi ipharamitha ikhombisa 3 дня, lesi sikhala samagama ngeke sisuswe.

Kukhona enye ipharamitha, inesibopho sokuthi kangaki ukuskena zonke izindawo zamagama futhi uhlole izinsuku ngaphandle kokuthunyelwa - hlolaImizuzu Yonke. Ngokuzenzakalelayo kuyalingana 30 минутам.

Kanjani lo msebenzi

Ekusebenzeni, uzodinga:

  1. Docker ngokusebenza endaweni engayodwa.
  2. Minikube izokhulisa iqoqo le-Kubernetes endaweni.
  3. kubctl - Isixhumanisi somugqa womyalo sokuphathwa kweqoqo.

Siphakamisa iqoqo le-Kubernetes endaweni:

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

Cacisa kubectl sebenzisa iqoqo lendawo ngokuzenzakalelayo:

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

Landa ukulungiselelwa kwendawo yokukhiqiza:

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

Njengoba ukulungiselelwa kokukhiqiza kulungiselelwe ukuhlola izikhala zamagama ezindala, futhi iqoqo lethu elisanda kuphakanyiswa alinazo, sizothatha indawo yokuhluka kwemvelo. IS_DEBUG on true. Ngaleli nani ipharamitha afterDaysWithoutDeploy akunakwa futhi izindawo zamagama azihlolwa izinsuku ngaphandle kokuthunyelwa, kuphela ukwenzeka kochungechunge oluncane (-pr-).

Uma uvuliwe Linux:

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

Uma uvuliwe macOS:

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

Ifaka iphrojekthi:

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

Ihlola ukuthi insiza ivele ku-cluster StaleFeatureBranch:

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

Sihlola ukuthi u-opharetha uvele ku-cluster:

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

Uma ubheka izingodo zayo, ikulungele ukucubungula izinsiza 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}

Sifaka esenziwe ngomumo fixtures (ukulungiselelwa osekwenziwe kakade kokumodela izinsiza zeqoqo) kwesisetshenziswa StaleFeatureBranch:

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

Izilungiselelo zibonisa ukusesha izikhala zamagama ngochungechunge oluncane -pr- kanye njalo 1 минуту.:

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

Umsebenzisi uphendulile futhi ulungele ukuhlola izikhala zamagama:

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

Faka fixtures, equkethe izikhala zamagama ezimbili (project-pr-1, project-pr-2) kanye nabo deployments, services, ingress, njalo njalo:

$ 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

Sihlola ukuthi zonke izinsiza ezingenhla zidalwe ngempumelelo:

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

Njengoba sasihlanganisa debug, izikhala zamagama project-pr-1 и project-pr-2, ngakho-ke zonke ezinye izinsiza kuzodingeka zisuswe ngokushesha ngaphandle kokucabangela ipharamitha afterDaysWithoutDeploy. Lokhu kungabonakala kulogi lomsebenzisi:

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

Uma uhlola ukutholakala kwezinsiza, zizoba sesimeni Terminating (inqubo yokususa) noma isivele isuliwe (okuphumayo komyalo akunalutho).

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

Ungaphinda inqubo yokudala fixtures izikhathi eziningana futhi uqiniseke ukuthi ziyasuswa phakathi nomzuzu.

Ezinye izindlela

Yini engenziwa esikhundleni somsebenzisi osebenza eqenjini? Kunezindlela eziningana, zonke aziphelele (futhi ukushiyeka kwazo kuncike), futhi wonke umuntu uyazinqumela ukuthi yini elungele iphrojekthi ethile:

  1. Susa igatsha lesici phakathi nokwakhiwa kokuhlanganiswa okuqhubekayo kwegatsha eliyinhloko.

    • Ukuze wenze lokhu, udinga ukwazi ukuthi yisiphi isicelo sokudonsa esihlobene nesibopho esakhiwayo. Njengoba isici segama segatsha siqukethe isihlonzi sesicelo sokudonsa - inombolo yaso, noma igama legatsha, isihlonzi kuyodingeka ngaso sonke isikhathi sicaciswe kusibopho.
    • Ukwakhiwa kwamagatsha amakhulu kuyehluleka. Isibonelo, unezigaba ezilandelayo: landa iphrojekthi, sebenzisa izivivinyo, yakha iphrojekthi, yenza ukukhululwa, thumela izaziso, sula igatsha lesici sesicelo sokugcina sokudonsa. Uma isakhiwo sihluleka lapho kuthunyelwa isaziso, kuzodingeka ukuthi ususe zonke izinsiza kuqoqo mathupha.
    • Ngaphandle komongo ofanele, ukususa amagatsha esici esakhiweni esiyinhloko akubonakali.

  2. Ukusebenzisa ama-webhooks (isibonelo).

    • Lokhu kungase kungabi yindlela yakho. Ngokwesibonelo, ku Jenkins, uhlobo olulodwa kuphela lwepayipi olusekela ikhono lokulondoloza ukulungiselelwa kwalo kukhodi yomthombo. Uma usebenzisa ama-webhooks, udinga ukubhala owakho umbhalo ukuze uwacubungule. Lesi script kuzofanele sibekwe kusixhumi esibonakalayo se-Jenkins, okunzima ukusinakekela.

  3. Bhala umyalezo I-Cronjob bese wengeza iqoqo le-Kubernetes.

    • Ukuchitha isikhathi ekubhaleni nasekusekeleni.
    • Umsebenzisi usevele usebenza ngesitayela esifanayo, ubhalwe phansi futhi uyasekelwa.

Ngiyabonga ngokunaka kwakho lesi sihloko. Xhuma kuphrojekthi ku-Github.

Source: www.habr.com

Engeza amazwana