Esory ny sampana endri-javatra efa lany andro ao amin'ny cluster Kubernetes

Esory ny sampana endri-javatra efa lany andro ao amin'ny cluster Kubernetes

Miarahaba! Sampana manasongadina (aka deploy preview, app review) - izany dia rehefa tsy ny sampana master ihany no apetraka, fa koa ny fangatahana misintona tsirairay mankany amin'ny URL tokana. Azonao atao ny manamarina raha miasa amin'ny tontolo famokarana ilay endri-javatra; Raha miasa amin'ny fangatahana fisintonana ianao, dia voafafa ny fandefasana vaovao rehetra amin'izao fotoana izao ho an'ny kaody taloha, ary ny fandefasana vaovao ho an'ny kaody vaovao dia mivoaka. Mety hipoitra ny fanontaniana rehefa natambatrao tao amin'ny sampana master ny fangatahana fisarihana. Tsy mila ny sampana endri-javatra intsony ianao, fa ny loharano Kubernetes dia mbola ao anaty cluster.

Bebe kokoa momba ny sampana endri-javatra

Fomba iray amin'ny fanaovana sampana manasongadina ao amin'ny Kubernetes dia ny fampiasana velarana anarana. Raha fintinina, ny firafitry ny famokarana dia toy izao:

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

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

Ho an'ny sampana endri-javatra, dia misy velarana anarana noforonina miaraka amin'ny famantarana azy (ohatra, ny laharan'ny fangatahana fisarihana) ary karazana prefix/postfix (ohatra, -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
...

Amin'ny ankapobeny, nanoratra aho Kubernetes Operator (fampiharana afaka miditra amin'ny loharanon-karena), rohy mankany amin'ny tetikasa ao amin'ny Github. Esoriny ny toeran'ny anarana izay an'ny sampana endri-javatra taloha. Ao amin'ny Kubernetes, raha mamafa toerana misy anarana ianao, dia ho voafafa ho azy koa ny loharano hafa ao amin'io habakabaka io.

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

Azonao atao ny mamaky momba ny fomba fametrahana sampana endri-javatra ao anaty cluster eto ΠΈ eto.

motivation

Andeha hojerentsika ny tsingerin-taonan'ny fangatahana misintona mahazatra miaraka amin'ny fampidirana mitohy (continuous integration):

  1. Manosika fanoloran-tena vaovao amin'ny sampana izahay.
  2. Eo amin'ny fananganana dia atao ny linters sy/na fitsapana.
  3. Ny fanefena fangatahan'ny Kubernetes dia amboarina amin'ny sidina (ohatra, ampidirina ao anatin'ilay mΓ΄dely vita ny laharany).
  4. Amin'ny fampiasana kubectl mihatra, ampidirina amin'ny cluster (deploy) ny fanamafisana.
  5. Atambatra amin'ny sampana master ny fangatahana fisarihana.

Raha miasa amin'ny fangatahana fisintonana ianao, dia voafafa ny fandefasana vaovao rehetra amin'izao fotoana izao ho an'ny kaody taloha, ary ny fandefasana vaovao ho an'ny kaody vaovao dia mivoaka. Fa rehefa atambatra amin'ny sampana master ny fangatahana fisintonana dia ny sampana master ihany no hatsangana. Vokatr'izany dia hita fa efa hadinonay ny fangatahana fisintonana, ary ny loharanon-karena Kubernetes dia mbola ao anaty cluster.

Ahoana ny fampiasana

Apetraho ny tetikasa miaraka amin'ny baiko etsy ambany:

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

Mamorona rakitra miaraka amin'ity atiny manaraka ity ary apetraho amin'ny alalan'ny kubectl apply -f:

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

fikirana namespaceSubstring ilaina ny manivana ny espace names ho an'ny fangatahana misintona avy amin'ny namespaces hafa. Ohatra, raha manana ireto toerana ireto ny cluster: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, dia ho ny kandidΓ  ho fafana habr-back-end-pr-17, habr-back-end-pr-33.

fikirana afterDaysWithoutDeploy ilaina hamafa ny namespaces taloha. Ohatra, raha noforonina ny namespace 3 дня 1 час miverina, ary manondro ny parameter 3 дня, ho voafafa ity espace name ity. Izy io koa dia miasa amin'ny lalana mifanohitra raha noforonina ny espace 2 дня 23 часа miverina, ary manondro ny parameter 3 дня, tsy ho voafafa ity espace name ity.

Misy paramètre iray hafa, izy no tompon'andraikitra amin'ny impiry hanitsiana ny toerana misy anarana rehetra sy hanamarina andro tsy misy fametrahana - checkEveryMinutes. Amin'ny alàlan'ny default dia mitovy 30 минутам.

Inona no manao izany asa

Amin'ny fampiharana dia mila:

  1. Docker mba hiasa amin'ny tontolo mitoka-monina.
  2. Minikube hanangana vondrona Kubernetes eo an-toerana.
  3. kubectl - interface tsara andalana ho an'ny fitantanana cluster.

Manangana cluster Kubernetes eto an-toerana izahay:

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

Manondro izahay kubectl ampiasao ny cluster eo an-toerana amin'ny alΓ lan'ny default:

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

Download ny tefy ho an'ny tontolo famokarana:

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

Koa satria ny fanamafisana ny famokarana dia namboarina mba hijerena ireo toerana misy anarana taloha, ary tsy manana azy ireo ny cluster vao natsangana, dia hosoloinay ny fari-piainan'ny tontolo iainana. IS_DEBUG amin'ny true. Miaraka amin'io sanda io ny parameter afterDaysWithoutDeploy dia tsy raisina an-tsaina ary tsy voamarika mandritra ny andro tsy misy fanaparitahana ny toerana misy anarana, raha tsy misy ny substring (-pr-).

Raha eo ianao Linux:

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

Raha eo ianao macOS:

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

Fametrahana ny tetikasa:

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

Fanamarinana fa nisy loharano niseho tao amin'ny cluster StaleFeatureBranch:

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

Manamarina izahay fa nisy opΓ©rateur niseho tao amin'ny cluster:

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

Raha mijery ny diariny ianao, dia vonona ny hikarakara loharanon-karena 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}

Mametraka efa vita izahay fixtures (fanamboarana efa vita ho an'ny loharanon-karena modely) ho an'ny loharano iray StaleFeatureBranch:

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

Ny fanefena dia manondro ny fitadiavana toerana misy anarana misy zana-tsipika -pr- indray mandeha isaky 1 ΠΌΠΈΠ½ΡƒΡ‚Ρƒ.:

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

Namaly ny opΓ©rateur ary vonona ny hanamarina ny toerana misy anarana:

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

hametraka fixtures, misy espace roa (project-pr-1, project-pr-2) ary izy ireo deployments, services, ingress, sy ny sisa:

$ 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

Hamarininay fa vita soa aman-tsara ny loharano rehetra etsy ambony:

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

Satria nampidirinay debug, namespaces project-pr-1 ΠΈ project-pr-2, noho izany dia tsy maintsy hofafana avy hatrany ny loharanon-karena hafa rehetra tsy misy fiheverana ny parameter afterDaysWithoutDeploy. Izany dia azo jerena ao amin'ny logs operator:

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

Raha manamarina ny fisian'ny loharanon-karena ianao dia ho eo amin'ny sata Terminating (fizotry ny famafana) na efa voafafa (foana ny vokatra baiko).

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

Azonao atao ny mamerina ny dingana famoronana fixtures imbetsaka ary ataovy azo antoka fa esorina ao anatin'ny iray minitra izy ireo.

safidy

Inona no azo atao fa tsy mpandraharaha iray miasa ao anaty cluster? Misy fomba fiasa maromaro, tsy lavorary avokoa izy rehetra (ary ny lesoka dia subjective), ary ny tsirairay dia manapa-kevitra ho an'ny tenany izay tsara indrindra ho an'ny tetikasa manokana:

  1. Fafao ny sampana endri-javatra mandritra ny fananganana tsy tapaka ny sampana master.

    • Mba hanaovana izany, mila mahafantatra ianao hoe inona ny fangatahana pull mifandraika amin'ny commit izay atsangana. Koa satria ny anaran'ny sampana endri-javatra dia misy ny famantarana fangatahana fisintonana - ny isany, na ny anaran'ny sampana, dia tsy maintsy apetraka ao amin'ny commit foana ny famantarana.
    • Tsy nahomby ny fananganana sampana master. Ohatra, manana ireto dingana manaraka ireto ianao: misintona ny tetikasa, manao fitsapana, manangana ny tetikasa, manaova famoahana, mandefa fampandrenesana, mamafa ny sampana manasongadina ny fangatahana farany. Raha tsy mahomby ny fananganana rehefa mandefa fampandrenesana dia tsy maintsy mamafa ny loharano rehetra ao amin'ny cluster ianao.
    • Raha tsy misy contexte sahaza, dia tsy miharihary ny famafana sampana endri-javatra ao amin'ny master build.

  2. Mampiasa webhooks (ohatra).

    • Mety tsy izany no fomba fanaonao. Ohatra, in Jenkins, karazana fantsona iray ihany no manohana ny fahafahana mitahiry ny fandrindrana azy ao amin'ny kaody loharano. Rehefa mampiasa webhooks ianao dia mila manoratra ny scripto manokana mba handaminana azy ireo. Ity script ity dia tsy maintsy apetraka ao amin'ny interface Jenkins, izay sarotra ny mitazona.

  3. Manoratra Cronjob ary ampio cluster Kubernetes.

    • Mandany fotoana amin'ny fanoratana sy fanohanana.
    • Ny mpandraharaha dia efa miasa amin'ny fomba mitovy, voarakitra an-tsoratra ary tohana.

Misaotra noho ny fiheveranao ny lahatsoratra. Rohy mankany amin'ny tetikasa amin'ny Github.

Source: www.habr.com

Add a comment