Ukususa icandelo eliphelelwe lixesha kwiqela leKubernetes

Ukususa icandelo eliphelelwe lixesha kwiqela leKubernetes

Sawubona! Isebe lomboniso (aka deploy preview, review app) - oku kuxa kungekuphela nje i-master branch isetyenzisiweyo, kodwa nesicelo ngasinye sokutsala kwi-URL eyodwa. Ungajonga ukuba ikhowudi isebenza kwindawo yemveliso; inqaku lingaboniswa kwabanye abadwelisi benkqubo okanye iingcali zemveliso. Ngelixa usebenza kwisicelo sokutsalwa, isibophelele ngasinye esitsha sokusebenza ngoku kwikhowudi yakudala siyacinywa, kwaye ikhowudi entsha entsha ikhutshiwe. Imibuzo inokuvela xa udibanisa isicelo sokutsalwa kwi-master branch. Awusafuni isebe elibonakalayo, kodwa izixhobo ze-Kubernetes zisekho kwiqela.

Okungakumbi malunga namasebe anophawu

Enye indlela yokwenza amasebe e-Kubernetes kukusebenzisa izithuba zamagama. Ngamafutshane, uqwalaselo lwemveliso lujongeka ngolu hlobo:

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

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

Kwisebe elibonisayo, isithuba segama siyadalwa nesichongi saso (umzekelo, inombolo yesicelo sokutsalwa) kunye nolunye uhlobo lwesimaphambili/iposi (umzekelo, -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
...

Ngokubanzi, ndabhala Kubernetes Operator (isicelo esinokufikelela kwizixhobo zeqela), ikhonkco kwiprojekthi kwiGithub. Isusa izithuba zamagama ezingamasebe amadala. Kwi-Kubernetes, ukuba ucima isithuba segama, ezinye izixhobo ezikweso sithuba samagama nazo ziyacinywa ngokuzenzekelayo.

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

Unokufunda malunga nendlela yokuphumeza amasebe abonakalayo kwiqela apha и apha.

Isizathu

Makhe sijonge umjikelo wesicelo sotsalo oqhelekileyo wobomi kunye nodibaniso oluqhubekayo (continuous integration):

  1. Sityhala isibophelelo esitsha kwisebe.
  2. Kwisakhiwo, iilitha kunye / okanye iimvavanyo ziqhutywa.
  3. Ulungelelwaniso lwesicelo sokutsala i-Kubernetes luveliswa kwimpukane (umzekelo, inombolo yayo ifakwe kwitemplate egqityiweyo).
  4. Usebenzisa kubectl faka, ulungelelwaniso longezwa kwiqela (deploy).
  5. Isicelo sokutsalwa sidityaniswe kwi-master branch.

Ngelixa usebenza kwisicelo sokutsalwa, isibophelele ngasinye esitsha sokusebenza ngoku kwikhowudi yakudala siyacinywa, kwaye ikhowudi entsha entsha ikhutshiwe. Kodwa xa isicelo sokutsalwa sidityaniswa kwisebe eliyintloko, kuphela isebe elikhulu eliya kwakhiwa. Ngenxa yoko, kuvela ukuba sele silibele malunga nesicelo sokutsala, kwaye izibonelelo zayo ze-Kubernetes zisekho kwiqela.

Indlela yokusebenzisa

Faka iprojekthi ngomyalelo ongezantsi:

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

Yenza ifayile enomxholo olandelayo kwaye uyifake nge kubectl apply -f:

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

IParamu isithuba segamaUmtyana Kufuneka ukucoca izithuba zegama kwizicelo zokutsalwa kwezinye izithuba zamagama. Umzekelo, ukuba iqela linezithuba zamagama zilandelayo: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, emva koko abaviwa bokucima baya kuba habr-back-end-pr-17, habr-back-end-pr-33.

IParamu afterDaysWithoutDeploy Kufuneka ukucima izithuba zamagama ezindala. Umzekelo, ukuba indawo yegama yenziwe 3 дня 1 час umva, kwaye iparameter ibonisa 3 дня, esi sithuba samagama siza kucinywa. Ikwasebenza kwelinye icala ukuba indawo yamagama yenziwe 2 дня 23 часа umva, kwaye iparameter ibonisa 3 дня, esi sithuba samagama asiyi kucinywa.

Kukho enye iparameter, inoxanduva lokuskena kangaphi zonke izithuba zamagama kwaye ujonge iintsuku ngaphandle kokuthunyelwa - khangela yonke iMizuzu. Ngokungagqibekanga ilingana no 30 минутам.

ntoni lo msebenzi

Ukuqhuba, uya kufuna:

  1. Docker ukusebenza kwindawo ekwanti.
  2. IMinikube iyakuphakamisa iqela leKubernetes ekuhlaleni.
  3. kubectl — ujongano lomgca womyalelo wolawulo lweqela.

Siphakamisa iqela leKubernetes ekuhlaleni:

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

Chaza kubectl sebenzisa iqela lasekuhlaleni ngokungagqibekanga:

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

Khuphela ulungelelwaniso lwemeko-bume yemveliso:

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

Kuba ulungelelwaniso lwemveliso luqwalaselwe ukujonga izithuba zamagama amadala, kwaye iqela lethu elisandula ukunyuswa alinazo, siya kuthatha indawo yokutshintsha kwemekobume. IS_DEBUG phezu true. Ngeli xabiso iparameter afterDaysWithoutDeploy ayithathelwa ngqalelo kwaye izithuba zamagama azikhangelwa iintsuku ngaphandle kokusasazwa, kuphela ukwenzeka komtya omncinci (-pr-).

Ukuba uvuliwe Linux:

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

Ukuba uvuliwe macOS:

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

Ukuhlohla iprojekthi:

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

Kujongwa ukuba kukho uvimba wolwazi kwiqela StaleFeatureBranch:

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

Sijonga ukuba umsebenzisi ubonisile kwiqela:

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

Ukuba ujonga iilogi zayo, ilungele ukucubungula izixhobo 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 esele yenziwe fixtures (ulungelelwaniso olusele lwenziwe lokubonisa izixhobo zeqela) kwisixhobo StaleFeatureBranch:

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

Ulungelelwaniso lubonisa ukukhangela izithuba zamagama ngomtya osezantsi -pr- kanye phakathi 1 минуту.:

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

Umsebenzisi uphendule kwaye ulungele ukujonga izithuba 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 ifayile fixtures, iqulathe izithuba zamagama ezimbini (project-pr-1, project-pr-2) kunye nabo deployments, services, ingress, kwaye nangokunjalo:

$ 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

Sijonga ukuba zonke izixhobo ezingentla zenziwe 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
...

Ekubeni sibandakanyiwe debug, izithuba zamagama project-pr-1 и project-pr-2, ngoko ke zonke ezinye izibonelelo ziya kufuneka zicinywe ngokukhawuleza ngaphandle kokuthathela ingqalelo ipharamitha afterDaysWithoutDeploy. Oku kunokubonwa kwiilog zomsebenzisi:

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

Ukuba ujonga ubukho bezibonelelo, ziya kuba kwimeko Terminating (inkqubo yokucima) okanye sele icinyiwe (imveliso yomyalelo ayinanto).

$ 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 inkqubo yokudala fixtures amaxesha amaninzi kwaye uqinisekise ukuba zisusiwe phakathi komzuzu.

Iindlela ezizezinye

Yintoni enokwenziwa endaweni yomsebenzisi osebenza kwiqela? Kukho iindlela ezininzi, zonke azifezekanga (kwaye iintsilelo zabo zixhomekeke), kwaye wonke umntu uzenzela isigqibo malunga neyona nto ilungileyo kwiprojekthi ethile:

  1. Cima isebe lesici ngexesha lokudityaniswa okuqhubekayo kolwakhiwo lwesebe eliphambili.

    • Ukwenza oku, kufuneka wazi ukuba sesiphi isicelo sokutsalwa esinxulumene nesibophelelo esakhiwayo. Ukusukela ukuba indawo yegama yesebe elibonakalayo iqulethe isazisi sesicelo sokutsalwa-inombolo yaso, okanye igama lesebe, isichongi siyakuhlala sicacisiwe kwisibophelelo.
    • Ukwakhiwa kwesebe eliphambili kuyasilela. Umzekelo, unala manqanaba alandelayo: khuphela iprojekthi, qhuba iimvavanyo, yakha iprojekthi, yenza ukukhululwa, thumela izaziso, cima icandelo lecandelo lesicelo sokugqibela sotsalo. Ukuba ulwakhiwo luyasilela xa uthumela isaziso, kuya kufuneka ucime zonke izixhobo kwiqela ngesandla.
    • Ngaphandle komxholo ofanelekileyo, ukucima amasebe eenkalo kwi-master build akubonakali.

  2. Ukusebenzisa i-webhooks (mzekelo).

    • Le isenokungabi yindlela yakho. Umzekelo, kwi Jenkins, uhlobo olulodwa kuphela lombhobho luxhasa ukukwazi ukugcina ulungelelwaniso lwalo kwikhowudi yomthombo. Xa usebenzisa ii-webhooks, kufuneka ubhale esakho iskripthi ukuze usiqhube. Le script kuya kufuneka ibekwe kwi-interface ye-Jenkins, enzima ukuyigcina.

  3. Ukubhala Cronjob kwaye wongeze iqela leKubernetes.

    • Ukuchitha ixesha ekubhaleni nakwinkxaso.
    • Umsebenzisi sele esebenza ngendlela efanayo, ubhalwe kwaye uyaxhaswa.

Enkosi ngengqalelo yakho kweli nqaku. Ikhonkco kwiprojekthi kwiGithub.

umthombo: www.habr.com

Yongeza izimvo