Nyoplokkeun cabang fitur heubeul dina klaster Kubernetes

Nyoplokkeun cabang fitur heubeul dina klaster Kubernetes

Salam! Cabang fitur (alias nyebarkeun sawangan, review aplikasi) - ieu téh lamun teu ngan cabang master ieu deployed, tapi ogé unggal pamundut narik ka URL unik. Anjeun tiasa mariksa naha kodeu tiasa dianggo dina lingkungan produksi; fiturna tiasa ditingalikeun ka programer atanapi spesialis produk anu sanés. Nalika anjeun damel dina pamundut tarik, unggal panyebaran komit anyar pikeun kodeu lami dihapus, sareng panyebaran énggal pikeun kode énggal digulung. Patarosan tiasa timbul nalika anjeun ngahijikeun pamundut tarik kana cabang master. Anjeun henteu peryogi deui cabang fitur, tapi sumber Kubernetes masih aya dina kluster.

Langkung seueur ngeunaan cabang fitur

Hiji pendekatan pikeun nyieun cabang fitur di Kubernetes nyaéta ngagunakeun spasi ngaran. Pondokna, konfigurasi produksi sapertos kieu:

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

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

Pikeun cabang fitur, spasi ngaran dijieun kalawan identifier na (contona, nomer pamundut tarikan) jeung sababaraha jenis awalan/postfix (contona, -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
...

Sacara umum, kuring nulis Operator Kubernetes (hiji aplikasi nu boga aksés ka sumberdaya cluster), link kana proyék di Github. Ngahapus ngaranspasi anu milik cabang fitur heubeul. Dina Kubernetes, upami anjeun ngahapus ngaranspasi, sumber-sumber sanés dina rohangan ngaran éta ogé otomatis dihapus.

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

Anjeun tiasa maca ngeunaan cara nerapkeun cabang fitur kana klaster di dieu и di dieu.

alesan

Hayu urang tingali siklus hirup paménta tarikan has sareng integrasi kontinyu (continuous integration):

  1. Urang nyorong komitmen anyar kana cabang.
  2. Dina ngawangun, linters sareng / atanapi tés dijalankeun.
  3. Konfigurasi pamundut tarikan Kubernetes dihasilkeun dina laleur (Contona, jumlahna diselapkeun kana citakan rengse).
  4. Ngagunakeun kubectl nerapkeun, konfigurasi ditambahkeun kana klaster (deploy).
  5. Paménta tarik dihijikeun kana cabang master.

Nalika anjeun damel dina pamundut tarik, unggal panyebaran komit anyar pikeun kodeu lami dihapus, sareng panyebaran énggal pikeun kode énggal digulung. Tapi nalika pamundut tarikan dihijikeun kana cabang master, ngan cabang master bakal diwangun. Hasilna, tétéla yén urang geus poho ngeunaan pamundut tarikan, sarta sumberdaya Kubernetes na masih dina kluster.

Kumaha carana make

Pasang proyék kalayan paréntah di handap ieu:

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

Jieun file kalawan eusi handap tur masang via kubectl apply -f:

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

parameter namespaceSubstring diperlukeun pikeun nyaring namespaces pikeun requests tarikan ti namespaces séjén. Salaku conto, upami kluster ngagaduhan ruang ngaran ieu: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, teras calon pikeun ngahapus bakal habr-back-end-pr-17, habr-back-end-pr-33.

parameter afterDaysWithoutDeploy diperlukeun pikeun mupus ngaranspasi heubeul. Contona, upami namespace dijieun 3 дня 1 час balik, sarta parameter nunjukkeun 3 дня, spasi ngaran ieu bakal dipupus. Ogé jalan dina arah nu lalawanan lamun ngaranspasi dijieun 2 дня 23 часа balik, sarta parameter nunjukkeun 3 дня, spasi ngaran ieu moal dihapus.

Aya hiji deui parameter, éta tanggung jawab sabaraha sering nyeken sadaya ngaranspasi jeung pariksa poé tanpa deployment - pariksaEveryMinutes. Sacara standar éta sarua 30 минутам.

Kumaha teu karya ieu

Dina prakték, anjeun bakal kedah:

  1. Docker pikeun digawé di lingkungan terasing.
  2. Minikube bakal ngangkat klaster Kubernetes sacara lokal.
  3. kubectl - panganteur garis paréntah pikeun manajemén klaster.

Kami ngangkat klaster 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.

Sebutkeun kubectl nganggo klaster lokal sacara standar:

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

Unduh konfigurasi pikeun lingkungan produksi:

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

Kusabab konfigurasi produksi dikonpigurasi pikeun pariksa ngaranspasi heubeul, sarta klaster urang karek diangkat teu boga aranjeunna, urang bakal ngaganti variabel lingkungan. IS_DEBUG dina true. Kalawan nilai ieu parameter afterDaysWithoutDeploy henteu dipertimbangkeun sareng spasi ngaran teu dipariksa pikeun poé tanpa nyebarkeun, ngan pikeun lumangsungna substring (-pr-).

Mun anjeun dina Linux:

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

Mun anjeun dina macOS:

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

Masang proyék:

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

Mariksa yen sumberdaya geus mucunghul dina klaster StaleFeatureBranch:

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

Kami pariksa yén operator parantos muncul dina kluster:

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

Upami anjeun ningali log na, éta siap pikeun ngolah 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}

Urang pasang siap-dijieun fixtures (konfigurasi siap-dijieun pikeun modeling sumberdaya klaster) pikeun sumberdaya a StaleFeatureBranch:

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

Konfigurasi nunjukkeun pikeun milarian spasi ngaran kalayan substring a -pr- sakali asup 1 минуту.:

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

Operator parantos ngaréspon sareng siap mariksa ngaranspasi:

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

Masang fixtures, ngandung dua spasi ngaran (project-pr-1, project-pr-2) sareng aranjeunna deployments, services, ingress, teras salajengna:

$ 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

Kami pariksa yén sadaya sumber daya di luhur parantos suksés didamel:

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

Kusabab urang kaasup debug, spasi ngaran project-pr-1 и project-pr-2, ku kituna sagala sumber sejenna kudu dihapus langsung tanpa merhatikeun parameter afterDaysWithoutDeploy. Ieu tiasa ditingali dina 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"}

Upami anjeun pariksa kasadiaan sumber daya, aranjeunna bakal aya dina statusna Terminating (prosés ngahapus) atanapi parantos dihapus (kaluaran paréntah 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
...

Anjeun tiasa ngulang prosés nyiptakeun fixtures sababaraha kali tur pastikeun aranjeunna dihapus dina hiji menit.

Alternatipna

Naon anu tiasa dilakukeun tibatan operator anu damel di klaster? Aya sababaraha pendekatan, sadayana henteu sampurna (sareng kakuranganana subjektif), sareng sadayana mutuskeun pikeun dirina naon anu pangsaéna pikeun proyék khusus:

  1. Pupus cabang fitur salami ngawangun integrasi kontinyu tina cabang master.

    • Jang ngalampahkeun ieu, anjeun kudu nyaho mana pamenta narik relates to commit nu keur diwangun. Kusabab ngaranspasi cabang fitur ngandung identifier pamundut tarik - nomerna, atanapi nami cabangna, identifier bakal salawasna kedah disebatkeun dina commit.
    • Pangwangunan cabang master gagal. Contona, anjeun boga tahapan handap: ngundeur proyék, ngajalankeun tés, ngawangun proyek, nyieun release a, ngirim bewara, mupus cabang fitur tina pamundut tarikan panungtungan. Upami ngawangun gagal nalika ngirim béwara, anjeun kedah ngahapus sadaya sumber dina kluster sacara manual.
    • Tanpa kontéks anu pas, ngahapus cabang fitur dina master build henteu écés.

  2. Ngagunakeun webhooks (conto).

    • Ieu bisa jadi teu pendekatan Anjeun. Contona, dina Jenkins, ngan ukur hiji jinis pipa anu ngadukung kamampuan pikeun nyimpen konfigurasina dina kode sumber. Nalika nganggo webhooks, anjeun kedah nyerat naskah anjeun nyalira pikeun ngolahna. Skrip ieu kedah disimpen dina antarmuka Jenkins, anu sesah dijaga.

  3. Tulis pesen Cronjob tur nambahkeun klaster Kubernetes.

    • Méakkeun waktos kanggo nyerat sareng ngadukung.
    • Operator parantos damel dina gaya anu sami, didokumentasikeun sareng didukung.

Hatur nuhun kana perhatian anjeun kana artikel. Link kana proyék di Github.

sumber: www.habr.com

Tambahkeun komentar