Mbusak cabang fitur lawas ing kluster Kubernetes

Mbusak cabang fitur lawas ing kluster Kubernetes

Hello! Cabang fitur (alias nyebarake pratinjau, aplikasi review) - iki nalika ora mung cabang master disebarake, nanging uga saben panjaluk narik menyang URL unik. Sampeyan bisa mriksa manawa kode kasebut bisa digunakake ing lingkungan produksi; fitur kasebut bisa ditampilake menyang programer utawa spesialis produk liyane. Nalika sampeyan nggarap panyuwunan narik, saben panyebaran komit anyar kanggo kode lawas bakal dibusak, lan penyebaran anyar kanggo kode anyar diluncurake. Pitakonan bisa uga muncul nalika sampeyan nggabungake panjaluk tarik menyang cabang master. Sampeyan ora perlu maneh cabang fitur, nanging sumber daya Kubernetes isih ing kluster.

Liyane babagan cabang fitur

Salah sawijining pendekatan kanggo nggawe cabang fitur ing Kubernetes yaiku nggunakake spasi jeneng. Ing cendhak, konfigurasi produksi katon kaya iki:

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

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

Kanggo cabang fitur, spasi jeneng digawe kanthi pengenal (contone, nomer panjaluk tarik) lan sawetara jinis prefiks/postfix (contone, -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
...

Umumé, aku nulis Operator Kubernetes (aplikasi sing nduweni akses menyang sumber daya kluster), pranala menyang proyek ing Github. Mbusak spasi jeneng sing kalebu cabang fitur lawas. Ing Kubernetes, yen sampeyan mbusak spasi jeneng, sumber daya liyane ing ruang jeneng kasebut uga bakal dibusak kanthi otomatis.

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

Sampeyan bisa maca babagan carane ngetrapake cabang fitur menyang kluster kene и kene.

Motivasi

Ayo goleki siklus urip panjaluk tarik khas kanthi integrasi terus-terusan (continuous integration):

  1. Kita push komitmen anyar menyang cabang.
  2. Ing mbangun, linter lan / utawa tes ditindakake.
  3. Konfigurasi panyuwunan narik Kubernetes digawe kanthi cepet (contone, nomer kasebut dilebokake ing cithakan sing wis rampung).
  4. Nggunakake aplikasi kubectl, konfigurasi ditambahake menyang kluster (nyebar).
  5. Panjaluk tarik digabung menyang cabang master.

Nalika sampeyan nggarap panyuwunan narik, saben panyebaran komit anyar kanggo kode lawas bakal dibusak, lan penyebaran anyar kanggo kode anyar diluncurake. Nanging nalika panjalukan narik digabungake menyang cabang master, mung cabang master sing bakal dibangun. Akibaté, dadi metu sing kita wis lali bab panjalukan narik, lan sumber daya Kubernetes isih ing kluster.

Carane nggunakake

Instal proyek kanthi printah ing ngisor iki:

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

Nggawe file karo isi ing ngisor iki lan nginstal liwat kubectl apply -f:

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

Parameter namespaceSubstring perlu kanggo nyaring namespaces kanggo panjalukan narik saka namespaces liyane. Contone, yen kluster duwe spasi jeneng ing ngisor iki: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, banjur calon kanggo pambusakan bakal habr-back-end-pr-17, habr-back-end-pr-33.

Parameter afterDaysWithoutDeploy perlu kanggo mbusak spasi jeneng lawas. Contone, yen namespace digawe 3 дня 1 час bali, lan parameter nuduhake 3 дня, namespace iki bakal dibusak. Uga dianggo ing arah ngelawan yen namespace digawe 2 дня 23 часа bali, lan parameter nuduhake 3 дня, namespace iki ora bakal dibusak.

Ana siji parameter liyane, tanggung jawab kanggo sepira kerepe mindhai kabeh ruang jeneng lan mriksa dina tanpa panyebaran - mriksaEveryMinutes. Kanthi gawan iku padha 30 минутам.

Carane ora karya iki

Ing laku, sampeyan kudu:

  1. docker kanggo makarya ing lingkungan sing sepi.
  2. Minikube bakal ngunggahake kluster Kubernetes sacara lokal.
  3. kubectl - antarmuka baris printah kanggo manajemen kluster.

Kita ngunggahake kluster Kubernetes sacara lokal:

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

Indikasi kubectl gunakake kluster lokal kanthi gawan:

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

Download konfigurasi kanggo lingkungan produksi:

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

Amarga konfigurasi produksi dikonfigurasi kanggo mriksa ruang jeneng lawas, lan kluster sing mentas diangkat ora duwe, kita bakal ngganti variabel lingkungan. IS_DEBUG ing true. Kanthi nilai iki parameter afterDaysWithoutDeploy ora dianggep lan spasi jeneng ora dicenthang nganti pirang-pirang dina tanpa nyebarake, mung kanggo kedadeyan substring (-pr-).

Yen sampeyan lagi ing Linux:

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

Yen sampeyan lagi ing macOS:

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

Nginstal proyek:

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

Priksa manawa sumber daya wis katon ing kluster StaleFeatureBranch:

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

Kita mriksa manawa operator wis muncul ing kluster:

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

Yen katon ing log sawijining, iku siap kanggo proses sumber daya 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}

Kita nginstal siap-digawe fixtures (konfigurasi siap kanggo modeling sumber kluster) kanggo sumber StaleFeatureBranch:

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

Konfigurasi kasebut nuduhake kanggo nggoleki spasi jeneng kanthi substring -pr- sapisan ing 1 минуту.:

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

Operator wis nanggapi lan siyap mriksa spasi jeneng:

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

Instal fixtures, ngemot rong spasi jeneng (project-pr-1, project-pr-2) lan wong-wong mau deployments, services, ingress, lan liya-liyane:

$ 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

Kita priksa manawa kabeh sumber daya ing ndhuwur wis kasil digawe:

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

Awit kita kalebu debug, spasi jeneng project-pr-1 и project-pr-2, mula kabeh sumber daya liyane kudu langsung dibusak tanpa njupuk parameter afterDaysWithoutDeploy. Iki bisa dideleng ing log 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"}

Yen sampeyan mriksa kasedhiyan sumber daya, padha bakal ing status Terminating (proses pambusakan) utawa wis dibusak (output printah kosong).

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

Sampeyan bisa mbaleni proses nggawe fixtures kaping pirang-pirang lan priksa manawa lagi dibusak ing menit.

Pilihan

Apa sing bisa ditindakake tinimbang operator sing kerja ing kluster? Ana sawetara pendekatan, kabeh mau ora sampurna (lan kekurangane subyektif), lan saben wong mutusake apa sing paling apik kanggo proyek tartamtu:

  1. Mbusak cabang fitur sajrone mbangun integrasi terus saka cabang master.

    • Kanggo nindakake iki, sampeyan kudu ngerti panjaluk tarik sing ana gandhengane karo komitmen sing dibangun. Wiwit spasi jeneng cabang fitur ngemot pengenal panyuwunan tarik - nomer, utawa jeneng cabang, pengenal mesthi kudu ditemtokake ing komit.
    • Master cabang mbangun gagal. Contone, sampeyan duwe tahapan ing ngisor iki: download proyek, mbukak tes, mbangun proyek, nggawe rilis, ngirim kabar, mbusak cabang fitur saka panjalukan tarik pungkasan. Yen mbangun gagal nalika ngirim kabar, sampeyan kudu mbusak kabeh sumber daya ing kluster kanthi manual.
    • Tanpa konteks sing tepat, mbusak cabang fitur ing master build ora jelas.

  2. Nggunakake webhooks (conto).

    • Iki bisa uga dudu pendekatan sampeyan. Contone, ing Jenkins, mung siji jinis pipa ndhukung kemampuan kanggo nyimpen konfigurasi ing kode sumber. Nalika nggunakake webhooks, sampeyan kudu nulis skrip dhewe kanggo ngolah. Skrip iki kudu diselehake ing antarmuka Jenkins, sing angel dijaga.

  3. Kanggo nulis Cronjob lan nambah kluster Kubernetes.

    • Mbuwang wektu kanggo nulis lan ndhukung.
    • Operator wis kerjane kanthi gaya sing padha, didokumentasikake lan didhukung.

Matur nuwun kanggo manungsa waé kanggo artikel. Link menyang proyek ing Github.

Source: www.habr.com

Add a comment