Хориҷ кардани шохаи хусусияти кӯҳнашуда дар кластери Kubernetes

Хориҷ кардани шохаи хусусияти кӯҳнашуда дар кластери Kubernetes

Салом! Филиали хусусият (aka deploy preview, review app) - ин вақте аст, ки на танҳо филиали асосӣ ҷойгир карда мешавад, балки ҳар як дархости кашидан ба URL-и беназир. Шумо метавонед тафтиш кунед, ки оё код дар муҳити истеҳсолӣ кор мекунад ё не; ин хусусият метавонад ба дигар барномасозон ё мутахассисони маҳсулот нишон дода шавад. Ҳангоме ки шумо дар дархости кашидан кор карда истодаед, ҳар як тавсеаи ҷорӣ барои рамзи кӯҳна нест карда мешавад ва паҳнкунии нав барои рамзи нав бароварда мешавад. Вақте ки шумо дархости ҷалбро ба филиали асосӣ якҷоя кардед, саволҳо пайдо мешаванд. Шумо дигар ба шохаи хусусият ниёз надоред, аммо захираҳои Kubernetes ҳанӯз дар кластер ҳастанд.

Бештар дар бораи филиалҳои хусусият

Як равиш барои сохтани шохаҳои хусусият дар Кубернетес ин истифодаи фазои номҳо мебошад. Хулоса, конфигуратсияи истеҳсолӣ чунин аст:

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

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

Барои шохаи хусусият, фазои ном бо идентификатори он (масалан, рақами дархости ҷалб) ва як намуди префикс/постфикс (масалан, -пр-):

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

Умуман, ман навиштам Оператори Kubernetes (барномае, ки ба захираҳои кластер дастрасӣ дорад), истинод ба лоиҳа дар Github. Он фазои номҳоро, ки ба шохаҳои кӯҳнаи хусусият тааллуқ доранд, нест мекунад. Дар Kubernetes, агар шумо фазои номро нест кунед, захираҳои дигар дар ин фазои ном низ ба таври худкор нест карда мешаванд.

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

Шумо метавонед дар бораи чӣ гуна татбиқ кардани шохаҳои хусусият дар кластер хонед дар ин ҷо и дар ин ҷо.

Муваффақият

Биёед як давраи муқаррарии дархости ҷалбро бо ҳамгироии доимӣ бубинем (continuous integration):

  1. Мо ба филиал ухдадории нав медихем.
  2. Дар сохтмон линтерҳо ва/ё санҷишҳо гузаронида мешаванд.
  3. Конфигуратсияҳои дархости кашидани Kubernetes ба зудӣ тавлид мешаванд (масалан, рақами он ба қолаби тайёр ворид карда мешавад).
  4. Бо истифода аз kubectl татбиқ, конфигуратсияҳо ба кластер илова карда мешаванд (тағир).
  5. Дархости кашидан ба филиали асосӣ муттаҳид карда мешавад.

Ҳангоме ки шумо дар дархости кашидан кор карда истодаед, ҳар як тавсеаи ҷорӣ барои рамзи кӯҳна нест карда мешавад ва паҳнкунии нав барои рамзи нав бароварда мешавад. Аммо вақте ки дархости кашидан ба филиали асосӣ якҷоя карда мешавад, танҳо филиали асосӣ сохта мешавад. Дар натиҷа, маълум мешавад, ки мо аллакай дархости кашиданро фаромӯш кардаем ва захираҳои Kubernetes он ҳоло ҳам дар кластер ҳастанд.

Чӣ тавр истифода бурда мешавад

Лоиҳаро бо фармони зерин насб кунед:

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

Файлеро бо мундариҷаи зерин эҷод кунед ва тавассути насб кунед kubectl apply -f:

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

Параметр namespaceSubstring барои филтр кардани фазои номҳо барои гирифтани дархостҳо аз дигар фазоҳои ном лозим аст. Масалан, агар кластер фазои номҳои зерин дошта бошад: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, пас номзадҳо барои ҳазф мешаванд habr-back-end-pr-17, habr-back-end-pr-33.

Параметр afterDaysWithoutDeploy барои нест кардани фазои номҳои кӯҳна лозим аст. Масалан, агар фазои ном эҷод карда шавад 3 дня 1 час бозгашт, ва параметр нишон медиҳад 3 дня, ин фазои ном нест карда мешавад. Он инчунин дар самти муқобил кор мекунад, агар фазои ном эҷод карда шавад 2 дня 23 часа бозгашт, ва параметр нишон медиҳад 3 дня, ин фазои ном нест карда намешавад.

Боз як параметр вуҷуд дорад, он барои зуд-зуд скан кардани тамоми фазоҳои номҳо ва тафтиш кардани рӯзҳо бидуни ҷойгиркунӣ масъул аст - тафтиш Ҳар дақиқа. Бо нобаёнӣ он баробар аст 30 минутам.

Чӣ тавр ба ин кор

Дар амал ба шумо лозим меояд:

  1. Доктор барои кор дар мухити алохида.
  2. Миникубе кластери Кубернетесро ба таври маҳаллӣ баланд хоҳад кард.
  3. кубектл — интерфейси сатри фармон барои идоракунии кластер.

Мо кластери Кубернетесро ба таври маҳаллӣ афзоиш медиҳем:

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

Нишон диҳед kubectl кластери маҳаллиро бо нобаёнӣ истифода баред:

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

Конфигуратсияҳоро барои муҳити истеҳсолӣ зеркашӣ кунед:

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

Азбаски конфигуратсияҳои истеҳсолӣ барои санҷидани фазои номҳои кӯҳна танзим шудаанд ва кластери навтаъсиси мо онҳоро надорад, мо тағирёбандаи муҳити зистро иваз мекунем IS_DEBUG ба true. Бо ин арзиш параметр afterDaysWithoutDeploy ба назар гирифта намешавад ва фазои номҳо барои рӯзҳо бидуни ҷойгиркунӣ тафтиш карда намешаванд, танҳо барои пайдоиши зерсатри (-pr-).

Агар шумо дар Linux:

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

Агар шумо дар macOS:

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

Насб кардани лоиҳа:

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

Тафтиши он, ки захира дар кластер пайдо шудааст StaleFeatureBranch:

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

Мо тафтиш мекунем, ки оператор дар кластер пайдо шудааст:

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

Агар шумо ба гузоришҳои он назар кунед, он барои коркарди захираҳо омода аст 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}

Мо тайёрро насб мекунем fixtures (конфигуратсияҳои омода барои моделсозии захираҳои кластер) барои захира StaleFeatureBranch:

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

Конфигуратсияҳо барои ҷустуҷӯи фазои номҳо бо зерсатр нишон медиҳанд -pr- як маротиба дар 1 минуту.:

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

Оператор посух дод ва омода аст, ки фазои номҳоро тафтиш кунад:

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

Насб кунед fixtures, дорои ду фазои ном (project-pr-1, project-pr-2) ва онҳо deployments, services, ingress, ва ғайра:

$ 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

Мо тафтиш мекунем, ки ҳамаи захираҳои дар боло бомуваффақият офарида шудаанд:

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

Азбаски мо дохил кардем debug, фазои номҳо project-pr-1 и project-pr-2, бинобар ин ҳама захираҳои дигар бояд фавран бе назардошти параметр тоза карда шаванд afterDaysWithoutDeploy. Инро дар гузоришҳои оператор дидан мумкин аст:

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

Агар шумо мавҷудияти захираҳоро тафтиш кунед, онҳо дар ҳолати худ хоҳанд буд Terminating (раванди несткунӣ) ё аллакай ҳазфшуда (баромади фармон холӣ аст).

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

Шумо метавонед раванди эҷодро такрор кунед fixtures якчанд маротиба ва боварӣ ҳосил кунед, ки онҳо дар давоми як дақиқа хориҷ карда мешаванд.

Тафовутҳо

Ба ҷои операторе, ки дар кластер кор мекунад, чӣ кор кардан мумкин аст? Якчанд равишҳо вуҷуд доранд, ки ҳамаашон нокомиланд (ва камбудиҳои онҳо субъективӣ мебошанд) ва ҳар кас худаш қарор медиҳад, ки кадоме барои лоиҳаи мушаххас беҳтар аст:

  1. Шохаи хусусиятро ҳангоми сохтани пайвастаи пайвастаи филиали асосӣ нест кунед.

    • Барои ин, шумо бояд бидонед, ки кадом дархости кашидан ба ӯҳдадорие, ки сохта мешавад, алоқаманд аст. Азбаски фазои номи шохаи хусусият дорои идентификатори дархости ҷалб - рақами он ё номи филиал мебошад, идентификатор бояд ҳамеша дар ӯҳдадорӣ нишон дода шавад.
    • Сохтмони филиалҳо ноком мешаванд. Масалан, шумо марҳилаҳои зерин доред: лоиҳаро зеркашӣ кунед, санҷишҳоро иҷро кунед, лоиҳаро созед, бароред, огоҳинома фиристед, шохаи хусусияти дархости охиринро тоза кунед. Агар сохтмон ҳангоми фиристодани огоҳинома ноком шавад, шумо бояд ҳамаи захираҳои кластерро дастӣ нест кунед.
    • Бе контексти мувофиқ, нест кардани шохаҳои хусусият дар сохтори асосӣ равшан нест.

  2. Истифодаи вебхукҳо (намуна).

    • Ин метавонад муносибати шумо набошад. Масалан, дар Ҷенкинс, танҳо як намуди лӯла қобилияти захира кардани конфигуратсияҳои худро дар коди сарчашма дастгирӣ мекунад. Ҳангоми истифодаи вебхукҳо, шумо бояд скрипти худро барои коркарди онҳо нависед. Ин скрипт бояд дар интерфейси Ҷенкинс ҷойгир карда шавад, ки нигоҳдорӣ душвор аст.

  3. Нависед Cronjob ва кластери Kubernetes илова кунед.

    • Вақтро барои навиштан ва дастгирӣ сарф кунед.
    • Оператор аллакай бо услуби шабеҳ кор мекунад, ҳуҷҷатгузорӣ ва дастгирӣ карда мешавад.

Ташаккур барои таваҷҷӯҳатон ба мақола. Истинод ба лоиҳа дар Github.

Манбаъ: will.com

Илова Эзоҳ