Yiyokuro ẹya ti igba atijọ ẹka ni akojọpọ Kubernetes kan

Yiyokuro ẹya ti igba atijọ ẹka ni akojọpọ Kubernetes kan

Hi! Ẹka ẹya-ara (aka ran awọn awotẹlẹ, ohun elo atunyẹwo) - eyi ni nigbati kii ṣe ẹka titunto si nikan ni a gbe lọ, ṣugbọn tun fa ibeere kọọkan si URL alailẹgbẹ kan. O le ṣayẹwo boya koodu naa n ṣiṣẹ ni agbegbe iṣelọpọ; ẹya naa le ṣe afihan si awọn pirogirama miiran tabi awọn alamọja ọja. Nigba ti o ba ti wa ni ṣiṣẹ ni a fa ìbéèrè, kọọkan titun dá lọwọlọwọ ransogun fun awọn atijọ koodu ti wa ni paarẹ, ati awọn titun ran awọn koodu ti wa ni ti yiyi jade. Awọn ibeere le dide nigbati o ba dapọ ibeere fifa sinu ẹka oluwa. Iwọ ko nilo ẹka ẹya mọ, ṣugbọn awọn orisun Kubernetes tun wa ninu iṣupọ naa.

Diẹ ẹ sii nipa awọn ẹka ẹya-ara

Ọna kan si ṣiṣe awọn ẹka ẹya ni Kubernetes ni lati lo awọn aaye orukọ. Ni kukuru, iṣeto iṣelọpọ dabi eyi:

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

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

Fun ẹka ẹya kan, aaye orukọ kan ni a ṣẹda pẹlu idanimọ rẹ (fun apẹẹrẹ, nọmba ibeere fa) ati iru asọtẹlẹ/ifiweranṣẹ (fun apẹẹrẹ, -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
...

Ni gbogbogbo, Mo kọ Kubernetes onišẹ (ohun elo ti o ni iwọle si awọn orisun iṣupọ), asopọ si ise agbese lori Github. O yọkuro awọn aaye orukọ ti o jẹ ti awọn ẹka ẹya atijọ. Ni Kubernetes, ti o ba paarẹ aaye orukọ kan, awọn orisun miiran ni aaye orukọ yẹn tun paarẹ laifọwọyi.

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

O le ka nipa bi o ṣe le ṣe awọn ẹka ẹya sinu iṣupọ kan nibi и nibi.

Iwuri

Jẹ ki a wo igbesi aye gbigbe ibeere fa aṣoju pẹlu iṣọpọ lemọlemọfún (continuous integration):

  1. A Titari adehun tuntun si ẹka naa.
  2. Lori kikọ, awọn linters ati/tabi awọn idanwo ti wa ni ṣiṣe.
  3. Awọn atunto ibeere fa Kubernetes ti wa ni ipilẹṣẹ lori fo (fun apẹẹrẹ, nọmba rẹ ti fi sii sinu awoṣe ti pari).
  4. Lilo kubectl waye, awọn atunto ti wa ni afikun si iṣupọ (fifiranṣẹ).
  5. Fa ìbéèrè ti wa ni dapọ si awọn titunto si eka.

Nigba ti o ba ti wa ni ṣiṣẹ ni a fa ìbéèrè, kọọkan titun dá lọwọlọwọ ransogun fun awọn atijọ koodu ti wa ni paarẹ, ati awọn titun ran awọn koodu ti wa ni ti yiyi jade. Ṣugbọn nigbati ibeere fifa kan ba dapọ si ẹka titunto si, ẹka oluwa nikan ni yoo kọ. Bi abajade, o wa ni pe a ti gbagbe tẹlẹ nipa ibeere fifa, ati awọn orisun Kubernetes rẹ tun wa ninu iṣupọ.

Bawo ni lati lo

Fi sori ẹrọ ise agbese pẹlu aṣẹ ni isalẹ:

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

Ṣẹda faili pẹlu akoonu atẹle ki o fi sii nipasẹ kubectl apply -f:

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

Apaadi namespaceSubstring nilo lati ṣe àlẹmọ awọn aaye orukọ fun fa awọn ibeere lati awọn aaye orukọ miiran. Fun apẹẹrẹ, ti iṣupọ naa ba ni awọn aye orukọ wọnyi: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, lẹhinna awọn oludije fun piparẹ yoo jẹ habr-back-end-pr-17, habr-back-end-pr-33.

Apaadi afterdaysWithoutDeploy nilo lati pa awọn aaye orukọ atijọ rẹ. Fun apẹẹrẹ, ti o ba ṣẹda aaye orukọ 3 дня 1 час pada, ati paramita tọkasi 3 дня, aaye orukọ yii yoo parẹ. O tun ṣiṣẹ ni idakeji ti aaye orukọ ba ṣẹda 2 дня 23 часа pada, ati paramita tọkasi 3 дня, aaye orukọ yii kii yoo parẹ.

paramita kan wa, o jẹ iduro fun iye igba lati ṣe ọlọjẹ gbogbo awọn aaye orukọ ati ṣayẹwo fun awọn ọjọ laisi imuṣiṣẹ - ṣayẹwo Gbogbo Iṣẹju. Nipa aiyipada o jẹ dogba 30 минутам.

Báwo ni ise yi

Ni iṣe, iwọ yoo nilo:

  1. Docker fun ṣiṣẹ ni agbegbe ti o ya sọtọ.
  2. Minikube yoo gbe iṣupọ Kubernetes soke ni agbegbe.
  3. kubectl - wiwo laini aṣẹ fun iṣakoso iṣupọ.

A gbe iṣupọ Kubernetes soke ni agbegbe:

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

Pato kubectl lo iṣupọ agbegbe nipasẹ aiyipada:

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

Ṣe igbasilẹ awọn atunto fun agbegbe iṣelọpọ:

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

Niwọn bi a ti tunto awọn atunto iṣelọpọ lati ṣayẹwo awọn aye orukọ atijọ, ati iṣupọ tuntun ti a gbe dide ko ni wọn, a yoo rọpo oniyipada ayika. IS_DEBUG on true. Pẹlu yi iye paramita afterDaysWithoutDeploy ko ṣe akiyesi ati pe awọn aaye orukọ ko ni ṣayẹwo fun awọn ọjọ laisi imuṣiṣẹ, nikan fun iṣẹlẹ ti substring (-pr-).

Ti o ba wa lori Linux:

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

Ti o ba wa lori macOS:

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

Fifi sori ẹrọ ise agbese:

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

Ṣiṣayẹwo pe orisun kan ti han ninu iṣupọ StaleFeatureBranch:

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

A ṣayẹwo pe oniṣẹ ẹrọ kan ti farahan ninu iṣupọ:

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

Ti o ba wo awọn akọọlẹ rẹ, o ti ṣetan lati ṣe ilana awọn orisun 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}

A fi sori ẹrọ setan-ṣe fixtures (ṣetan-ṣe atunto fun modeli awọn orisun iṣupọ) fun a oluşewadi StaleFeatureBranch:

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

Awọn atunto tọkasi lati wa awọn aaye orukọ pẹlu okun-ipin kan -pr- lẹẹkan sinu 1 минуту.:

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

Oṣiṣẹ ti dahun o si ṣetan lati ṣayẹwo awọn aaye orukọ:

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

Fi sori ẹrọ fixtures, ti o ni awọn aaye orukọ meji ninu (project-pr-1, project-pr-2) ati wọn deployments, services, ingress, ati bẹbẹ lọ:

$ 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

A ṣayẹwo pe gbogbo awọn orisun ti o wa loke ni a ti ṣẹda ni aṣeyọri:

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

Niwon a pẹlu debug, awọn aaye orukọ project-pr-1 и project-pr-2, nitorina gbogbo awọn orisun miiran yoo ni lati paarẹ lẹsẹkẹsẹ laisi akiyesi paramita naa afterDaysWithoutDeploy. Eyi ni a le rii ninu awọn akọọlẹ oniṣẹ:

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

Ti o ba ṣayẹwo wiwa awọn orisun, wọn yoo wa ni ipo naa Terminating (ilana piparẹ) tabi ti paarẹ tẹlẹ (igbejade aṣẹ ti ṣofo).

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

O le tun awọn ẹda ilana fixtures ni igba pupọ ati rii daju pe wọn ti yọ kuro laarin iṣẹju kan.

Awọn miiran

Kini o le ṣee ṣe dipo oniṣẹ ẹrọ ti n ṣiṣẹ ni iṣupọ kan? Awọn ọna pupọ lo wa, gbogbo wọn jẹ alaipe (ati awọn ailagbara wọn jẹ ero-ara), ati pe gbogbo eniyan pinnu fun ararẹ kini o dara julọ fun iṣẹ akanṣe kan:

  1. Pa ẹka ẹya rẹ lakoko iṣọpọ ilọsiwaju ti eka titunto si.

    • Lati ṣe eyi, o nilo lati mọ iru ibeere fa ti o nii ṣe pẹlu ifaramọ ti a kọ. Niwọn bi aaye orukọ ẹka ẹya naa ni idamo ibeere fa - nọmba rẹ, tabi orukọ ẹka naa, idanimọ yoo nigbagbogbo ni lati sọ pato ninu ifaramọ.
    • Awọn ikole ẹka titunto si kuna. Fun apẹẹrẹ, o ni awọn ipele wọnyi: ṣe igbasilẹ iṣẹ akanṣe, ṣiṣe awọn idanwo, kọ iṣẹ akanṣe, ṣe itusilẹ, firanṣẹ awọn iwifunni, ko ẹka ẹya ti ibeere fifa kẹhin kuro. Ti kikọ ba kuna nigbati o ba nfi ifitonileti ranṣẹ, iwọ yoo ni lati pa gbogbo awọn orisun inu iṣupọ naa rẹ pẹlu ọwọ.
    • Laisi ipo ti o yẹ, piparẹ awọn ẹka ẹya ni kikọ titunto si ko han gbangba.

  2. Lilo webhooks (apẹẹrẹ).

    • Eyi le ma jẹ ọna rẹ. Fun apẹẹrẹ, in Jenkins, Iru opo gigun ti epo kan nikan ṣe atilẹyin agbara lati fipamọ awọn atunto rẹ ni koodu orisun. Nigba lilo webhooks, o nilo lati kọ ara rẹ akosile lati lọwọ wọn. Iwe afọwọkọ yii yoo ni lati gbe sinu wiwo Jenkins, eyiti o nira lati ṣetọju.

  3. Kọ ifiranṣẹ kan Cronjob ki o si fi Kubernetes iṣupọ.

    • Lilo akoko lori kikọ ati atilẹyin.
    • Oṣiṣẹ tẹlẹ ṣiṣẹ ni iru ara, ti ni akọsilẹ ati atilẹyin.

O ṣeun fun akiyesi rẹ si nkan naa. Ọna asopọ si iṣẹ akanṣe lori Github.

orisun: www.habr.com

Fi ọrọìwòye kun