Dzēsiet novecojuÅ”u lÄ«dzekļu zaru Kubernetes klasterÄ«

Dzēsiet novecojuÅ”u lÄ«dzekļu zaru Kubernetes klasterÄ«

Hi! Funkciju filiāle (pazÄ«stams arÄ« kā izvietoÅ”anas priekÅ”skatÄ«jums, pārskatÄ«Å”anas lietotne) ā€” tas ir tad, kad tiek izvietots ne tikai galvenais zars, bet arÄ« katrs izvilkÅ”anas pieprasÄ«jums uz unikālu URL. JÅ«s varat pārbaudÄ«t, vai kods darbojas ražoÅ”anas vidē, funkciju var parādÄ«t citiem programmētājiem vai produktu speciālistiem. Kamēr strādājat ar izvilkÅ”anas pieprasÄ«jumu, tiek dzēsts katrs jaunais vecā koda izpildes paÅ”reizējais izvietojums un tiek izlaista jaunā koda jaunā izvietoÅ”ana. Jautājumi var rasties, apvienojot izvilkÅ”anas pieprasÄ«jumu galvenajā zarā. Jums vairs nav nepiecieÅ”ama lÄ«dzekļu filiāle, taču Kubernetes resursi joprojām atrodas klasterÄ«.

Vairāk par funkciju filiālēm

Viena no iespējām, kā izveidot funkciju zarus programmā Kubernetes, ir izmantot nosaukumvietas. ÄŖsāk sakot, ražoÅ”anas konfigurācija izskatās Ŕādi:

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

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

Objekta atzaram tiek izveidota nosaukumvieta ar tās identifikatoru (piemēram, izvilkÅ”anas pieprasÄ«juma numuru) un sava veida prefiksu/postfiksu (piemēram, -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
...

Vispār es rakstÄ«ju Kubernetes operators (lietojumprogramma, kurai ir piekļuve klastera resursiem), saite uz projektu vietnē Github. Tas noņem nosaukumvietas, kas pieder vecajām funkciju zarām. Programmā Kubernetes, ja izdzÄ“Å”at nosaukumvietu, automātiski tiek izdzēsti arÄ« citi resursi Å”ajā nosaukumvietā.

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

Varat lasÄ«t par to, kā iekļaut lÄ«dzekļu atzarus klasterÄ« Å”eit Šø Å”eit.

Motivācija

Apskatīsim tipisku izvilkŔanas pieprasījuma dzīves ciklu ar nepārtrauktu integrāciju (continuous integration):

  1. Mēs virzām jaunu apņemÅ”anos filiālē.
  2. Būvējot, tiek izpildītas līknes un/vai testi.
  3. Kubernetes pull pieprasījuma konfigurācijas tiek ģenerētas lidojumā (piemēram, tās numurs tiek ievietots gatavajā veidnē).
  4. Izmantojot kubectl apply, konfigurācijas tiek pievienotas klasterim (izvietoŔanai).
  5. IzvilkÅ”anas pieprasÄ«jums tiek apvienots galvenajā filiālē.

Kamēr strādājat ar izvilkÅ”anas pieprasÄ«jumu, tiek dzēsts katrs jaunais vecā koda izpildes paÅ”reizējais izvietojums un tiek izlaista jaunā koda jaunā izvietoÅ”ana. Bet, kad izvilkÅ”anas pieprasÄ«jums tiek apvienots galvenajā filiālē, tiks izveidota tikai galvenā filiāle. Rezultātā izrādās, ka esam jau aizmirsuÅ”i par vilkÅ”anas pieprasÄ«jumu, un tā Kubernetes resursi joprojām atrodas klasterÄ«.

Kā lietot

Instalējiet projektu ar tālāk norādīto komandu:

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

Izveidojiet failu ar Ŕādu saturu un instalējiet, izmantojot kubectl apply -f:

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

Parametrs namespaceApakÅ”virkne nepiecieÅ”ams, lai filtrētu nosaukumvietas izvilkÅ”anas pieprasÄ«jumiem no citām nosaukumvietām. Piemēram, ja klasterim ir Ŕādas nosaukumvietas: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, tad kandidāti dzÄ“Å”anai bÅ«s habr-back-end-pr-17, habr-back-end-pr-33.

Parametrs afterDaysWithoutDeploy nepiecieÅ”ams, lai izdzēstu vecās nosaukumvietas. Piemēram, ja ir izveidota nosaukumvieta 3 Š“Š½Ń 1 чŠ°Ń atpakaļ, un parametrs norāda 3 Š“Š½Ń, Ŕī nosaukumvieta tiks dzēsta. Tas darbojas arÄ« pretējā virzienā, ja ir izveidota nosaukumvieta 2 Š“Š½Ń 23 чŠ°ŃŠ° atpakaļ, un parametrs norāda 3 Š“Š½Ń, Ŕī nosaukumvieta netiks dzēsta.

Ir vēl viens parametrs, tas ir atbildÄ«gs par to, cik bieži skenēt visas nosaukumvietas un pārbaudÄ«t dienas bez izvietoÅ”anas - pārbaudiet EveryMinutes. Pēc noklusējuma tas ir vienāds 30 Š¼ŠøŠ½ŃƒŃ‚Š°Š¼.

Kā tas darbojas

Praksē jums bÅ«s nepiecieÅ”ams:

  1. dokers darbam izolētā vidē.
  2. Minikube lokāli cels Kubernetes klasteru.
  3. kubectl ā€” komandrindas interfeiss klasteru pārvaldÄ«bai.

Mēs izveidojam Kubernetes klasteru lokāli:

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

Norādiet kubectl pēc noklusējuma izmantot vietējo kopu:

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

Lejupielādēt ražoÅ”anas vides konfigurācijas:

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

Tā kā ražoÅ”anas konfigurācijas ir konfigurētas, lai pārbaudÄ«tu vecās nosaukumvietas, un mÅ«su jaunizveidotajā klasterÄ« to nav, mēs aizstāsim vides mainÄ«go. IS_DEBUG par true. Ar Å”o vērtÄ«bu parametrs afterDaysWithoutDeploy netiek ņemts vērā, un nosaukumvietas netiek pārbaudÄ«tas dienās bez izvietoÅ”anas, tikai par apakÅ”virknes (-pr-).

Ja esat ieslēgts Linux:

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

Ja esat ieslēgts macOS:

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

Projekta instalēŔana:

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

Pārbauda, ā€‹ā€‹vai klasterÄ« ir parādÄ«jies resurss StaleFeatureBranch:

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

Mēs pārbaudām, vai klasterī ir parādījies operators:

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

Ja paskatās uz tā žurnāliem, tas ir gatavs resursu apstrādei 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}

Mēs uzstādām gatavu fixtures (gatavas konfigurācijas klastera resursu modelÄ“Å”anai) resursam StaleFeatureBranch:

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

Konfigurācijas norāda, ka nosaukumvietas jāmeklē ar apakÅ”virkni -pr- vienreiz iekŔā 1 Š¼ŠøŠ½ŃƒŃ‚Ńƒ.:

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

Operators ir atbildējis un ir gatavs pārbaudīt nosaukumvietas:

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

Komplekts fixtures, kas satur divas nosaukumvietas (project-pr-1, project-pr-2) un viņiem deployments, services, ingress, un tā tālāk:

$ 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

Mēs pārbaudām, vai visi iepriekÅ” minētie resursi ir veiksmÄ«gi izveidoti:

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

Tā kā mēs iekļāvām debug, nosaukumvietas project-pr-1 Šø project-pr-2, tāpēc visi pārējie resursi bÅ«s nekavējoties jādzÄ“Å”, neņemot vērā parametru afterDaysWithoutDeploy. To var redzēt operatoru žurnālos:

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

Ja pārbaudÄ«sit resursu pieejamÄ«bu, tie bÅ«s statusā Terminating (dzÄ“Å”anas process) vai jau izdzēsts (komandas izvade ir tukÅ”a).

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

Jūs varat atkārtot izveides procesu fixtures vairākas reizes un pārliecinieties, ka tās tiek noņemtas minūtes laikā.

Alternatīvas

Ko var darÄ«t operatora vietā, kurÅ” strādā klasterÄ«? Ir vairākas pieejas, un tās visas ir nepilnÄ«gas (un to trÅ«kumi ir subjektÄ«vi), un katrs pats izlemj, kas ir vislabākais konkrētajam projektam:

  1. Dzēst lÄ«dzekļa atzaru galvenās filiāles nepārtrauktas integrācijas veidoÅ”anas laikā.

    • Lai to izdarÄ«tu, jums jāzina, kurÅ” izvilkÅ”anas pieprasÄ«jums attiecas uz apņemÅ”anos, kas tiek veidota. Tā kā lÄ«dzekļa filiāles nosaukumvieta satur izvilkÅ”anas pieprasÄ«juma identifikatoru - tā numuru vai filiāles nosaukumu, identifikators vienmēr bÅ«s jānorāda commit.
    • Galvenās filiāles versijas neizdodas. Piemēram, jums ir Ŕādi posmi: lejupielādējiet projektu, izpildiet testus, izveidojiet projektu, izveidojiet laidienu, nosÅ«tiet paziņojumus, notÄ«riet lÄ«dzekļa atzaru no pēdējā vilkÅ”anas pieprasÄ«juma. Ja izveide neizdodas, nosÅ«tot paziņojumu, jums bÅ«s manuāli jāizdzÄ“Å” visi klastera resursi.
    • Bez atbilstoÅ”a konteksta lÄ«dzekļu atzaru dzÄ“Å”ana galvenajā bÅ«vniecÄ«bā nav acÄ«mredzama.

  2. Izmantojot tīmekļa aizķeres (piemērs).

    • Tā var nebÅ«t jÅ«su pieeja. Piemēram, iekŔā Jenkins, tikai viena veida cauruļvads atbalsta iespēju saglabāt tā konfigurācijas avota kodā. Izmantojot tÄ«mekļa aizÄ·eres, jums ir jāraksta savs skripts, lai tos apstrādātu. Å is skripts bÅ«s jāievieto Jenkins saskarnē, kuru ir grÅ«ti uzturēt.

  3. Rakstīt cron darbs un pievienojiet Kubernetes kopu.

    • Tērē laiku rakstÄ«Å”anai un atbalstam.
    • Operators jau strādā lÄ«dzÄ«gā stilā, ir dokumentēts un atbalstÄ«ts.

Paldies par uzmanību rakstam. Saite uz projektu vietnē Github.

Avots: www.habr.com

Pievieno komentāru