Kuondoa tawi la kipengele cha zamani katika kundi la Kubernetes

Kuondoa tawi la kipengele cha zamani katika kundi la Kubernetes

Hi! Tawi la kipengele (aka deploy preview, review app) - huu ndio wakati sio tu tawi kuu linatumika, lakini pia kila ombi la kuvuta kwa URL ya kipekee. Unaweza kuangalia kama msimbo unafanya kazi katika mazingira ya uzalishaji; kipengele kinaweza kuonyeshwa kwa watayarishaji programu au wataalamu wengine wa bidhaa. Wakati unafanya kazi katika ombi la kuvuta, kila uwekaji mpya wa sasa wa msimbo wa zamani unafutwa, na uwekaji mpya wa nambari mpya hutolewa. Maswali yanaweza kutokea wakati uliunganisha ombi la kuvuta kwenye tawi kuu. Huhitaji tena tawi la kipengele, lakini rasilimali za Kubernetes bado ziko kwenye kundi.

Zaidi kuhusu matawi ya kipengele

Njia moja ya kutengeneza matawi ya kipengele katika Kubernetes ni kutumia nafasi za majina. Kwa kifupi, usanidi wa uzalishaji unaonekana kama hii:

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

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

Kwa tawi la kipengele, nafasi ya jina imeundwa na kitambulisho chake (kwa mfano, nambari ya ombi la kuvuta) na aina fulani ya kiambishi awali / kiambishi cha posta (kwa mfano, -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
...

Kwa ujumla, niliandika Opereta wa Kubernetes (programu ambayo ina ufikiaji wa rasilimali za nguzo), kiunga cha mradi kwenye Github. Huondoa nafasi za majina ambazo ni za matawi ya vipengele vya zamani. Katika Kubernetes, ukifuta nafasi ya majina, rasilimali nyingine katika nafasi hiyo ya majina pia hufutwa kiotomatiki.

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

Unaweza kusoma juu ya jinsi ya kutekeleza matawi ya kipengele kwenye nguzo hapa ΠΈ hapa.

Motisha

Wacha tuangalie mzunguko wa kawaida wa ombi la kuvuta na ujumuishaji unaoendelea (continuous integration):

  1. Tunasukuma ahadi mpya kwa tawi.
  2. Kwenye jengo, linters na/au vipimo vinaendeshwa.
  3. Mipangilio ya ombi la kuvuta ya Kubernetes hutolewa kwa kuruka (kwa mfano, nambari yake imeingizwa kwenye kiolezo kilichomalizika).
  4. Kwa kutumia kubectl apply, usanidi huongezwa kwenye nguzo (deploy).
  5. Ombi la kuvuta limeunganishwa kwenye tawi kuu.

Wakati unafanya kazi katika ombi la kuvuta, kila uwekaji mpya wa sasa wa msimbo wa zamani unafutwa, na uwekaji mpya wa nambari mpya hutolewa. Lakini ombi la kuvuta linapounganishwa kwenye tawi kuu, tawi kuu pekee ndilo litakalojengwa. Matokeo yake, inageuka kuwa tayari tumesahau kuhusu ombi la kuvuta, na rasilimali zake za Kubernetes bado ziko kwenye nguzo.

Jinsi ya kutumia

Sakinisha mradi na amri hapa chini:

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

Unda faili iliyo na maudhui yafuatayo na usakinishe kupitia kubectl apply -f:

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

Parameter nafasi ya jinaSubstring inahitajika kuchuja nafasi za majina kwa maombi ya kuvuta kutoka kwa nafasi zingine za majina. Kwa mfano, ikiwa nguzo ina nafasi zifuatazo za majina: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, basi wagombea wa kufutwa watakuwa habr-back-end-pr-17, habr-back-end-pr-33.

Parameter afterDaysWithoutDeploy inahitajika kufuta nafasi za majina za zamani. Kwa mfano, ikiwa nafasi ya jina imeundwa 3 дня 1 час nyuma, na parameter inaonyesha 3 дня, nafasi hii ya majina itafutwa. Pia inafanya kazi katika mwelekeo tofauti ikiwa nafasi ya majina imeundwa 2 дня 23 часа nyuma, na parameter inaonyesha 3 дня, nafasi hii ya majina haitafutwa.

Kuna paramu moja zaidi, inawajibika kwa mara ngapi kuchambua nafasi zote za majina na kuangalia siku bila kupelekwa - angaliaKilaDakika. Kwa chaguo-msingi ni sawa na 30 ΠΌΠΈΠ½ΡƒΡ‚Π°ΠΌ.

Jinsi gani kazi hii

Katika mazoezi, utahitaji:

  1. Docker kwa kufanya kazi katika mazingira ya pekee.
  2. Minikube itainua nguzo ya Kubernetes ndani ya nchi.
  3. kubectl - kiolesura cha mstari wa amri kwa usimamizi wa nguzo.

Tunainua nguzo ya Kubernetes ndani ya nchi:

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

Dhibitisho kubectl tumia nguzo ya ndani kwa chaguo-msingi:

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

Pakua usanidi wa mazingira ya uzalishaji:

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

Kwa kuwa usanidi wa uzalishaji umesanidiwa kuangalia nafasi za majina za zamani, na nguzo yetu mpya iliyoinuliwa haina, tutabadilisha utofauti wa mazingira. IS_DEBUG juu ya true. Kwa thamani hii parameter afterDaysWithoutDeploy haijazingatiwa na nafasi za majina hazijaangaliwa kwa siku bila kupelekwa, tu kwa kutokea kwa kamba ndogo (-pr-).

Ikiwa umewasha Linux:

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

Ikiwa umewasha macOS:

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

Kuweka mradi:

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

Kuangalia kama rasilimali imeonekana kwenye nguzo StaleFeatureBranch:

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

Tunaangalia kuwa opereta ameonekana kwenye nguzo:

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

Ikiwa unatazama magogo yake, iko tayari kusindika rasilimali 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}

Tunaweka tayari fixtures (usanidi uliotayarishwa tayari wa kuiga rasilimali za nguzo) kwa rasilimali StaleFeatureBranch:

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

Mipangilio inaonyesha kutafuta nafasi za majina kwa kamba ndogo -pr- mara moja kila 1 ΠΌΠΈΠ½ΡƒΡ‚Ρƒ.:

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

Opereta amejibu na yuko tayari kuangalia nafasi za majina:

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

Weka fixtures, iliyo na nafasi mbili za majina (project-pr-1, project-pr-2) na wao deployments, services, ingress, Nakadhalika:

$ 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

Tunahakikisha kuwa rasilimali zote zilizo hapo juu zimeundwa kwa ufanisi:

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

Kwa kuwa tulijumuisha debug, nafasi za majina project-pr-1 ΠΈ project-pr-2, kwa hiyo rasilimali nyingine zote zitatakiwa kufutwa mara moja bila kuzingatia parameter afterDaysWithoutDeploy. Hii inaweza kuonekana kwenye kumbukumbu za waendeshaji:

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

Ukiangalia upatikanaji wa rasilimali, zitakuwa katika hali Terminating (mchakato wa kufuta) au tayari umefutwa (matokeo ya amri ni tupu).

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

Unaweza kurudia mchakato wa kuunda fixtures mara kadhaa na uhakikishe kuwa zimeondolewa ndani ya dakika.

Njia mbadala

Nini kinaweza kufanywa badala ya mwendeshaji anayefanya kazi katika nguzo? Kuna njia kadhaa, zote sio kamili (na mapungufu yao ni ya kibinafsi), na kila mtu anaamua mwenyewe ni nini bora kwa mradi fulani:

  1. Futa tawi la kipengele wakati wa ujenzi wa ujumuishaji unaoendelea wa tawi kuu.

    • Ili kufanya hivyo, unahitaji kujua ni ombi gani la kuvuta linahusiana na ahadi ambayo inajengwa. Kwa kuwa nafasi ya jina ya tawi la kipengele ina kitambulisho cha ombi la kuvuta - nambari yake, au jina la tawi, kitambulisho kitalazimika kubainishwa kila wakati kwenye ahadi.
    • Ujenzi wa tawi kuu unashindwa. Kwa mfano, una hatua zifuatazo: pakua mradi, endesha majaribio, jenga mradi, toa toleo, tuma arifa, futa tawi la kipengele cha ombi la mwisho la kuvuta. Ikiwa muundo utashindwa wakati wa kutuma arifa, itabidi ufute rasilimali zote kwenye nguzo mwenyewe.
    • Bila muktadha unaofaa, kufuta matawi ya kipengele katika muundo mkuu sio dhahiri.

  2. Kutumia vijiti vya wavuti (mfano).

    • Huenda hii isiwe mbinu yako. Kwa mfano, katika Jenkins, aina moja tu ya bomba inasaidia uwezo wa kuhifadhi usanidi wake katika msimbo wa chanzo. Unapotumia vijiti vya wavuti, unahitaji kuandika hati yako ili kuyachakata. Hati hii itabidi kuwekwa kwenye kiolesura cha Jenkins, ambacho ni vigumu kukitunza.

  3. Kuandika Cronjob na ongeza nguzo ya Kubernetes.

    • Kutumia muda katika kuandika na kusaidia.
    • Opereta tayari anafanya kazi kwa mtindo sawa, ameandikwa na kuungwa mkono.

Asante kwa umakini wako kwa makala. Unganisha kwa mradi kwenye Github.

Chanzo: mapenzi.com

Kuongeza maoni