Pagtangtang sa usa ka outdated feature branch sa Kubernetes cluster

Pagtangtang sa usa ka outdated feature branch sa Kubernetes cluster

Hello! Feature nga sanga (aka deploy preview, review app) - kini mao ang sa diha nga dili lamang sa master nga sanga ang gipakatap, apan usab sa matag pull hangyo sa usa ka talagsaon nga URL. Mahimo nimong susihon kung ang code nagtrabaho sa usa ka palibot sa produksiyon; ang bahin mahimong ipakita sa ubang mga programmer o mga espesyalista sa produkto. Samtang nagtrabaho ka sa usa ka hangyo sa pagbitad, ang matag bag-ong commit karon nga pag-deploy alang sa daan nga code matangtang, ug ang bag-ong pag-deploy alang sa bag-ong code gilukot. Mahimong mutungha ang mga pangutana kung imong gihiusa ang usa ka hangyo sa pagbitad sa master branch. Dili na nimo kinahanglan ang feature branch, apan ang Kubernetes resources anaa gihapon sa cluster.

Dugang pa mahitungod sa feature branch

Usa ka paagi sa paghimo og feature branch sa Kubernetes mao ang paggamit og namespaces. Sa laktud, ang pagsumpo sa produksiyon ingon niini:

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

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

Para sa usa ka feature branch, ang usa ka namespace gihimo uban sa iyang identifier (pananglitan, ang pull request number) ug usa ka matang sa prefix/postfix (pananglitan, -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
...

Sa kinatibuk-an, nagsulat ako Operator sa Kubernetes (usa ka aplikasyon nga adunay access sa mga kapanguhaan sa cluster), link sa proyekto sa Github. Gitangtang niini ang mga namespace nga nahisakop sa daan nga mga sanga nga bahin. Sa Kubernetes, kung imong tangtangon ang usa ka namespace, ang ubang mga kapanguhaan sa kana nga namespace awtomatiko usab nga mapapas.

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

Mahimo nimong mabasa kung giunsa ang pagpatuman sa mga sanga sa bahin sa usa ka cluster dinhi ΠΈ dinhi.

Pag-awhag

Atong tan-awon ang usa ka tipikal nga pull request lifecycle nga adunay padayon nga panagsama (continuous integration):

  1. Nagduso mi og bag-ong commit sa branch.
  2. Sa pagtukod, ang mga linter ug/o mga pagsulay gipadagan.
  3. Ang Kubernetes pull request configurations kay namugna on the fly (pananglitan, ang numero niini gisulod sa nahuman nga template).
  4. Gamit ang kubectl apply, ang mga configuration idugang sa cluster (deploy).
  5. Ang hangyo sa pagbitad gihiusa sa master branch.

Samtang nagtrabaho ka sa usa ka hangyo sa pagbitad, ang matag bag-ong commit karon nga pag-deploy alang sa daan nga code matangtang, ug ang bag-ong pag-deploy alang sa bag-ong code gilukot. Apan kung ang usa ka hangyo sa pagbitad mahiusa sa master branch, ang master branch ra ang matukod. Ingon usa ka sangputanan, nahibal-an nga nakalimtan na namon ang bahin sa hangyo sa pagbitad, ug ang mga kapanguhaan sa Kubernetes naa pa sa cluster.

Unsaon paggamit

I-install ang proyekto gamit ang sugo sa ubos:

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

Paghimo og file nga adunay mosunod nga sulod ug i-install pinaagi sa kubectl apply -f:

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

Parameter namespaceSubstring gikinahanglan sa pagsala sa mga namespace alang sa mga hangyo sa pagbitad gikan sa ubang mga namespace. Pananglitan, kung ang cluster adunay mosunod nga mga namespace: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, unya ang mga kandidato alang sa pagtangtang mahimong habr-back-end-pr-17, habr-back-end-pr-33.

Parameter afterDaysWithoutDeploy gikinahanglan aron matangtang ang daan nga mga namespace. Pananglitan, kung gimugna ang namespace 3 дня 1 час balik, ug ang parameter nagpakita 3 дня, kini nga namespace mapapas. Naglihok usab kini sa atbang nga direksyon kung ang namespace gihimo 2 дня 23 часа balik, ug ang parameter nagpakita 3 дня, kini nga namespace dili mapapas.

Adunay usa pa nga parameter, kini ang responsable kung unsa ka sagad i-scan ang tanan nga mga namespace ug susihon ang mga adlaw nga wala’y pag-deploy - checkEveryMinutes. Sa kasagaran kini managsama 30 ΠΌΠΈΠ½ΡƒΡ‚Π°ΠΌ.

Unsa nga paagi nga kini nga buhat

Sa praktis, kinahanglan nimo:

  1. Docker alang sa pagtrabaho sa usa ka hilit nga palibot.
  2. Minikube mopasaka ug Kubernetes cluster sa lokal.
  3. kubectl - interface sa command line alang sa pagdumala sa cluster.

Nagpataas kami ug Kubernetes cluster sa 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.

Ipasabut kubectl gamita ang lokal nga cluster pinaagi sa default:

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

Pag-download sa mga pag-configure alang sa palibot sa produksiyon:

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

Tungod kay ang mga configuration sa produksiyon gi-configure aron masusi ang daan nga mga namespace, ug ang among bag-ong gipataas nga cluster wala niini, among ilisan ang environment variable IS_DEBUG sa true. Uban niini nga bili ang parameter afterDaysWithoutDeploy wala gikonsiderar ug ang mga namespace wala gisusi sulod sa mga adlaw nga walay pag-deploy, alang lamang sa panghitabo sa substring (-pr-).

Kung naa ka Linux:

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

Kung naa ka macOS:

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

Pag-instalar sa proyekto:

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

Pagsusi nga adunay usa ka kapanguhaan nga nagpakita sa cluster StaleFeatureBranch:

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

Atong susihon nga ang usa ka operator mitungha sa cluster:

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

Kung imong tan-awon ang mga troso niini, andam na kini nga iproseso ang mga kapanguhaan 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}

Gi-install namon ang andam na fixtures (andam na nga mga configuration para sa pagmodelo sa cluster resources) para sa usa ka resource StaleFeatureBranch:

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

Gipakita sa mga pag-configure ang pagpangita sa mga namespace nga adunay substring -pr- kausa sa 1 ΠΌΠΈΠ½ΡƒΡ‚Ρƒ.:

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

Ang operator mitubag ug andam sa pagsusi sa mga namespaces:

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

Pag-instalar fixtures, nga adunay duha ka namespaces (project-pr-1, project-pr-2) ug sila deployments, services, ingress, ug uban pa:

$ 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

Among gisusi nga ang tanan nga mga kapanguhaan sa ibabaw malampuson nga nahimo:

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

Sukad ato giapil debug, mga namespace project-pr-1 ΠΈ project-pr-2, busa ang tanan nga uban nga mga kapanguhaan kinahanglan nga tangtangon dayon nga wala gikonsiderar ang parameter afterDaysWithoutDeploy. Makita kini sa mga log sa 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"}

Kung imong susihon ang pagkaanaa sa mga kapanguhaan, naa sila sa kahimtang Terminating (proseso sa pagtangtang) o natangtang na (walay sulod ang command output).

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

Mahimo nimong balikon ang proseso sa paghimo fixtures sa makadaghang higayon ug siguroha nga kini matangtang sulod sa usa ka minuto.

Mga alternatibo

Unsa ang mahimo imbes sa usa ka operator nga nagtrabaho sa usa ka cluster? Adunay ubay-ubay nga mga pamaagi, silang tanan dili hingpit (ug ang ilang mga kakulangan kay suhetibo), ug ang matag usa modesisyon alang sa iyang kaugalingon kung unsa ang labing kaayo alang sa usa ka partikular nga proyekto:

  1. I-delete ang feature branch atol sa padayon nga integration build sa master branch.

    • Aron mahimo kini, kinahanglan nimong mahibal-an kung unsang hangyo sa pagbitad ang nagtumong sa commit nga gitukod. Tungod kay ang feature nga branch namespace naglangkob sa pull request identifier - ang numero niini, o ang ngalan sa branch, ang identifier kinahanglang ipiho sa commit.
    • Ang pagtukod sa master branch napakyas. Pananglitan, ikaw adunay mga mosunod nga mga yugto: pag-download sa proyekto, pagdagan sa mga pagsulay, pagtukod sa proyekto, paghimo og pagpagawas, pagpadala sa mga pahibalo, paghawan sa bahin nga sanga sa katapusang hangyo sa pagbitad. Kung mapakyas ang pagtukod kung magpadala usa ka pahibalo, kinahanglan nimo nga tangtangon ang tanan nga mga kapanguhaan sa cluster nga mano-mano.
    • Kung walay hustong konteksto, ang pagtangtang sa mga feature branch sa master build dili klaro.

  2. Paggamit sa mga webhook (usa ka panig-ingnan).

    • Mahimong dili kini ang imong pamaagi. Pananglitan, sa Jenkins, usa lang ka matang sa pipeline ang nagsuporta sa abilidad sa pagluwas sa mga configuration niini sa source code. Kung mogamit mga webhook, kinahanglan nimo nga isulat ang imong kaugalingon nga script aron maproseso kini. Kini nga script kinahanglan ibutang sa Jenkins interface, nga lisud ipadayon.

  3. Isulat Cronjob ug pagdugang usa ka Kubernetes cluster.

    • Paggahin ug panahon sa pagsulat ug suporta.
    • Ang operator nagtrabaho na sa parehas nga istilo, gidokumento ug gisuportahan.

Salamat sa imong pagtagad sa artikulo. Pag-link sa proyekto sa Github.

Source: www.habr.com

Idugang sa usa ka comment