Kubernetes kluster batean zaharkitutako eginbide-adar bat kentzea
Hi! Ezaugarri adarra (Inplementatu aurrebista, berrikusi aplikazioa) - hau da, adar nagusia ez ezik, URL esklusibo batera tiratzeko eskaera bakoitza ere zabaltzen denean. Kodeak produkzio-ingurune batean funtzionatzen duen egiazta dezakezu; funtzioa beste programatzaile edo produktu-espezialistei erakutsi diezaieke. Tira-eskaera batean lanean ari zaren bitartean, kode zaharraren uneko inplementazio berri bakoitza ezabatzen da eta kode berriaren inplementazio berria zabaltzen da. Galderak sor daitezke tira-eskaera bat adar nagusiarekin bateratzean. Jada ez duzu eginbide-adarra behar, baina Kubernetes baliabideak klusterrean daude oraindik.
Ezaugarrien adarrei buruzko informazio gehiago
Kubernetes-en ezaugarri-adarrak egiteko ikuspegi bat izen-espazioak erabiltzea da. Laburbilduz, ekoizpenaren konfigurazioa honelakoa da:
Ezaugarrien adar baterako, izen-espazio bat sortzen da bere identifikatzailearekin (adibidez, tira-eskaeraren zenbakia) eta nolabaiteko aurrizki/postfixarekin (adibidez, -pr-):
Oro har, idatzi nuen Kubernetes operadorea (kluster baliabideetarako sarbidea duen aplikazioa), Github-en proiekturako esteka. Ezaugarrien adar zaharrei dagozkien izen-espazioak kentzen ditu. Kubernetes-en, izen-eremu bat ezabatzen baduzu, izen-eremu horretako beste baliabide batzuk ere automatikoki ezabatzen dira.
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h
Ezaugarrien adarrak kluster batean nola ezartzeari buruz irakur dezakezu Hemen ΠΈ Hemen.
Motibazioa
Ikus dezagun tira-eskaeraren bizi-ziklo tipiko bat etengabeko integrazioarekin (continuous integration):
Adarrarekin konpromiso berri bat bultzatzen dugu.
Eraikuntzan, linters eta/edo probak egiten dira.
Kubernetes pull-eskaeraren konfigurazioak berehala sortzen dira (adibidez, bere zenbakia amaitutako txantiloian txertatzen da).
Kubectl apply erabiliz, konfigurazioak klusterera gehitzen dira (inplementatu).
Pull eskaera adar nagusiarekin bateratzen da.
Tira-eskaera batean lanean ari zaren bitartean, kode zaharraren uneko inplementazio berri bakoitza ezabatzen da eta kode berriaren inplementazio berria zabaltzen da. Baina tira eskaera bat adar nagusiarekin bateratzen denean, adar nagusia bakarrik eraikiko da. Ondorioz, ondorioztatzen da dagoeneko ahaztu dugula pull eskaera, eta bere Kubernetes baliabideak oraindik klusterrean daude.
Parametroa namespaceAzpikatea beste izen-espazio batzuetako tira-eskaeretarako izen-espazioak iragazi behar dira. Adibidez, klusterrak izen-espazio hauek baditu: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, orduan ezabatzeko hautagaiak izango dira habr-back-end-pr-17, habr-back-end-pr-33.
Parametroa AfterDaysWithoutDeploy izen-espazio zaharrak ezabatu behar dira. Adibidez, izen-espazioa sortzen bada 3 Π΄Π½Ρ 1 ΡΠ°Ρ atzera, eta parametroak adierazten du 3 Π΄Π½Ρ, izen-espazio hau ezabatu egingo da. Kontrako norabidean ere funtzionatzen du izen-espazioa sortzen bada 2 Π΄Π½Ρ 23 ΡΠ°ΡΠ° atzera, eta parametroak adierazten du 3 Π΄Π½Ρ, izen-eremu hau ez da ezabatuko.
Parametro bat gehiago dago, izen-espazio guztiak zenbat aldiz eskaneatu eta inplementatu gabe egunak egiaztatzeaz arduratzen da - checkEveryMinutes. Berez berdina da 30 ΠΌΠΈΠ½ΡΡΠ°ΠΌ.
$ 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.
Adierazten dugu kubectl Erabili kluster lokala lehenespenez:
$ kubectl config use-context minikube
Switched to context "minikube".
Produkzio-konfigurazioak izen-espazio zaharrak egiaztatzeko konfiguratuta daudenez eta sortu berri dugun klusterrak ez dituenez, ingurune-aldagaia ordezkatuko dugu. IS_DEBUG on true. Balio honekin parametroa afterDaysWithoutDeploy ez da kontuan hartzen eta izen-espazioak ez dira inplementatu gabe egunetan egiaztatzen, azpikatearen agerpenerako soilik (-pr-).
On bazaude Linux:
$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml
On bazaude macOS:
$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml
Klusterean operadore bat agertu dela egiaztatzen dugu:
$ kubectl get pods --namespace stale-feature-branch-operator
NAME ... STATUS ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s
Bere erregistroak begiratzen badituzu, prest dago baliabideak prozesatzeko StaleFeatureBranch:
Operadoreak erantzun du eta prest dago izen-espazioak egiaztatzeko:
$ 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"}
Ezarri fixtures, bi izen-espazio dituena (project-pr-1, project-pr-2) eta haiek deployments, services, ingress, eta abar:
$ 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
Goiko baliabide guztiak behar bezala sortu direla egiaztatzen dugu:
$ 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
...
Sartu genuenetik debug, izen-espazioak project-pr-1 ΠΈ project-pr-2, beraz, gainerako baliabide guztiak berehala ezabatu beharko dira parametroa kontuan hartu gabe afterDaysWithoutDeploy. Hau operadoreen erregistroetan ikus daiteke:
$ 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"}
Baliabideen erabilgarritasuna egiaztatzen baduzu, egoeran egongo dira Terminating (ezabatze prozesua) edo dagoeneko ezabatuta (komandoaren irteera hutsik dago).
$ 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
...
Sortze-prozesua errepikatu dezakezu fixtures hainbat aldiz eta ziurtatu minutu batean kentzen direla.
alternatibak
Zer egin daiteke kluster batean lan egiten duen operadore baten ordez? Hainbat planteamendu daude, guztiak inperfektuak dira (eta haien gabeziak subjektiboak dira), eta bakoitzak bere kabuz erabakitzen du zein den onena proiektu jakin baterako:
Ezabatu eginbide-adarra adar nagusiaren etengabeko integrazioa eraikitzean.
Horretarako, eraikitzen ari den konpromezuarekin zer tira-eskaera duen jakin behar duzu. Ezaugarrien adarraren izen-eremuak pull-eskaeraren identifikatzailea - bere zenbakia edo adarraren izena daukanez, identifikatzailea beti zehaztu beharko da konpromisoan.
Adar nagusien eraikuntzak huts egiten ari dira. Adibidez, fase hauek dituzu: proiektua deskargatu, probak exekutatu, proiektua eraiki, kaleratze bat egin, jakinarazpenak bidali, azken tira-eskaeraren eginbide-adarra garbitu. Jakinarazpen bat bidaltzean eraikuntzak huts egiten badu, klusterreko baliabide guztiak eskuz ezabatu beharko dituzu.
Testuinguru egokirik gabe, eraikuntza nagusiko ezaugarri-adarrak ezabatzea ez da begi bistakoa.
Baliteke hau ez izatea zure planteamendua. Adibidez, in Jenkins, kanalizazio mota batek bakarrik onartzen du bere konfigurazioak iturburu-kodean gordetzeko gaitasuna. Webhook-ak erabiltzean, zure script-a idatzi behar duzu haiek prozesatzeko. Script hau Jenkins interfazean jarri beharko da, eta hori mantentzea zaila da.
Idazteko Cronjob eta gehitu Kubernetes kluster bat.
Idazten eta laguntzan denbora ematea.
Eragileak dagoeneko antzeko estiloan lan egiten du, dokumentatuta eta onartzen da.