
đ„Si tĂ« arrish nĂ« qiell dhe tĂ« bĂ«hesh pilot | ProHoster Devi nĂ« veçori (po ashtu preview implementimi, aplikacioni i rishikimit) â kjo Ă«shtĂ« kur implementohet jo vetĂ«m dega master, por gjithashtu çdo kĂ«rkesĂ« tĂ«rheqjeje nĂ« njĂ« URL unike. Mund tĂ« kontrolloni nĂ«se kodi punon nĂ« ambientin e prodhimit, veçorinĂ« mund ta tregoni programuesve tĂ« tjerĂ« ose produktologĂ«ve. NdĂ«rsa punoni nĂ« kĂ«rkesĂ«n tuaj, çdo commit i ri heq implementimin aktual pĂ«r kodin e vjetĂ«r, dhe njĂ« implementim i ri pĂ«r kodin e ri del jashtĂ«. Pyetje mund tĂ« lindin atĂ«herĂ« kur keni bashkuar kĂ«rkesĂ«n tuaj tĂ«rheqĂ«se nĂ« degĂ«n master. Dega e veçorisĂ« mĂ« nuk ju nevojitet, por burimet e Kubernetes janĂ« ende nĂ« klaster.
Më shumë për degët e veçorisë
NjĂ« nga qasjet pĂ«r tĂ« bĂ«rĂ« degĂ« tĂ« veçorisĂ« nĂ« Kubernetes â Ă«shtĂ« pĂ«rdorimi i namespace-ve. NĂ«se shkurtojmĂ«, konfigurimet e prodhimit duken kĂ«shtu:
kind: Namespace
apiVersion: v1
metadata:
name: habr-back-end
...
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: habr-back-end
spec:
replicas: 3
...Për degën e veçorisë krijohet një namespace me identifikuesin e saj (p.sh., numri i kërkesës së tërheqjes) dhe ndonjë prefiks/postfix (p.sh., -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
...Në përgjithësi, unë shkrova Kubernetes Operator (një aplikacion që ka qasje në burimet e klasterit), . Ai fshin namespace-t që përkasin në degët e veçorisë të vjetra. Në Kubernetes, nëse fshini një namespace, burimet e tjera në këtë namespace gjithashtu fshihen automatikisht.
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7hPër mënyrën sesi të implementoni degët e veçorisë në klaster, mund të lexoni dhe .
Motivimi
Le të shohim një cikël tipik të jetës së kërkesës së tërheqjes me integrim të vazhdueshëm (integrim i vazhdueshëm):
- Dërgojmë një commit të ri në degë.
- Në ndërtim, lançohet linterat dhe/ose testet.
- Në flakë formohen konfigurimet e Kubernetes për kërkesën e tërheqjes (p.sh., numri i saj futet në një shabllon gati).
- Me ndihmën e kubectl apply, konfigurimet shkojnë në klaster (implementohet).
- Kërkesa e tërheqjes bashkohet në degën master.
Ndërsa punoni në kërkesën tuaj të tërheqjes, çdo commit i ri heq implementimin aktual për kodin e vjetër, dhe një implementim i ri për kodin e ri del jashtë. Por kur kërkesa e tërheqjes bashkohet në degën master, do të ndërtohet vetëm dega master. Në fund rezulton se për kërkesën e tërheqjes tashmë e kemi harruar, por burimet e saj Kubernetes janë ende në klaster.
Si të përdorni
Instaloni projektin me komandën e mëposhtme:
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.ymlKrijoni një skedë me përmbajtjen e mëposhtme dhe instaloni përmes kubectl apply -f:
apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
name: stale-feature-branch
spec:
namespaceSubstring: -pr-
afterDaysWithoutDeploy: 3Parametri namespaceSubstring nevohet për të filtruar namespace-t për pull request-et nga namespace të tjera. Për shembull, nëse në kluster ka këto namespace: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, atëherë kandidatët për fshirje do të jenë habr-back-end-pr-17, habr-back-end-pr-33.
Parametri afterDaysWithoutDeploy nevohet për të fshirë namespace-t e vjetra. Për shembull, nëse namespace është krijuar 3 ditë 1 orë mbrapa, dhe në parametrin është e përcaktuar 3 ditë, ky namespace do të fshihet. Funksionon edhe në anën tjetër, nëse namespace është krijuar 2 ditë 23 orë mbrapa, dhe në parametrin është e përcaktuar 3 ditë, ky namespace nuk do të fshihet.
Ka një parameter tjetër, ai e menaxhon sa shpesh të skanohet të gjithë namespace-t dhe të kontrollohet për ditët pa deploy - checkEveryMinutes. Në mënyrë default, ai është baras 30 minutave.
Si funksionon kjo
Në praktikë, do të nevojitet:
- për të punuar në një ambient të izoluar.
- do të ngrejë klusterin Kubernetes lokal.
- â ndĂ«rfaqe komandash pĂ«r menaxhimin e klusterit.
Ngremë klusterin Kubernetes lokal:
$ minikube start --vm-driver=docker
minikube v1.11.0 në Darwin 10.15.5
Duke përdorur drejtuesin docker duke u bazuar në profilin ekzistues.
Duke nisur pikën e kontrollit minikube në klusterin minikube.Specifikoni kubectl përdor klusterin lokal si default:
$ kubectl config use-context minikube
Kaluan në kontekstin "minikube".Shkarkojmë konfigurimet për mjedisin e production-it:
$ curl https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml > stale-feature-branch-production-configs.ymlDuke qenë se konfigurimet e production-it janë të vendosura të kontrollojnë namespace-t e vjetra, dhe në klusterin tonë të sapo ngritur nuk ka, do të zëvendësojmë variablën e ambientit IS_DEBUG në true. Me këtë vlerë, parametri afterDaysWithoutDeploy nuk merret parasysh dhe namespace-t nuk kontrollohen për ditë pa deploy, vetëm për përputhjen me substring (-pr-).
Nëse jeni në Linux:
$ sed -i 's|false|true|g' stale-feature-branch-production-configs.ymlNëse jeni në macOS:
$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.ymlInstalojmë projektin:
$ kubectl apply -f stale-feature-branch-production-configs.ymlKontrollojmë që në kluster është shfaqur burimi StaleFeatureBranch:
$ kubectl api-resources | grep stalefeaturebranches
EMRI ... GRUPI I API-së ... LLOJI
stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranchKontrollojmë që në kluster është shfaqur operatori:
$ kubectl get pods --namespace stale-feature-branch-operator
EMRI ... STATUS ... MOSHĂ
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Duke punuar ... 38sNëse shohim në logjet e tij, ai është gati për të procesuar burimet StaleFeatureBranch:
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Versioni i Operatorit: 0.0.1"}
...
... "msg":"Duke nisur EventSource", ... , "source":"kind source: \/, Kind="}
... "msg":"Duke nisur Kontrolluesin", ...}
... "msg":"Duke nisur punonjësit", ..., "numri i punonjësve":1}Instalojmë fixtures-në aparatet (konfigurata të gatshme për modelimin e burimeve të klasterit) për burimin StaleFeatureBranch:
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/stale-feature-branch.ymlNë konfigurata tregohet të kërkohen namespace'ët me nënstring -pr- një herë në 1 minutë.:
apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
name: stale-feature-branch
spec:
namespaceSubstring: -pr-
afterDaysWithoutDeploy: 1
checkEveryMinutes: 1Operatori ka reaguar dhe është gati të kontrollojë namespace'ët:
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Stale feature branch is being processed.","namespaceSubstring":"-pr-","afterDaysWithoutDeploy":1,"checkEveryMinutes":1,"isDebug":"true"}Instalojmë aparatet, përfshirë dy namespace'ë (project-pr-1, project-pr-2) dhe të tyre deployed, shërbimet, ingress, etj.:
$ 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 createdPo kontrollojmë që të gjitha burimet e mësipërme janë krijuar me sukses:
$ 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
...Pasi kemi aktivizuar debug, namespace'ët project-pr-1 dhe project-pr-2, pra edhe të gjitha burimet e tjera, do të duhet të fshihen menjëherë pa marrë parasysh parametrin afterDaysWithoutDeploy. Në logët e operatorit kjo është e dukshme:
$ 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 processed.","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 processed.","namespaceName":"project-pr-2","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-2"}Nëse kontrolloni praninë e burimeve, ato do të jenë në statusin Terminating (procesi i fshirjes) ose tashmë të fshira (dalja e komandës është e zbrazët).
$ 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
...Mund të përsërisni procesin e krijimit aparatet disa herë dhe të siguroheni që ato do të fshihen brenda një minute.
Alternativat
ĂfarĂ« mund tĂ« bĂ«ni nĂ« vend tĂ« operatorit qĂ« funksionon nĂ« klaster? Ka disa qasje, tĂ« gjitha janĂ« tĂ« pafund dhe tĂ« metat e tyre janĂ« subjektive, dhe secili vendos se cila Ă«shtĂ« mĂ« e pĂ«rshtatshme pĂ«r projektin e tij:
Të fshihen branch-at e veçorive gjatë ndërtimit të branch-it master të integrimit të vazhdueshëm.
- Për këtë, duhet të dini se cili pull request i përket commit-it që është duke u ndërtuar. Duke qenë se namespace-i i branch-it të veçorive përmban identifikuesin e pull request-it - numrin e tij ose emrin e branch-it, identifikuesi gjithmonë do të duhet të tregojë në commit.
- Ndërtimet e branch-eve master kanë dështuar. Shembuj, keni këto hapa: shkarkoni projektin, krijoni testet, ndihmoni projektin, krijoni lëshimin, dërgoni njoftimet, pastroni branch-in e veçorive të pull request-it të fundit. Nëse ndërtimi dështon në dërgimin e njoftimit, do t'ju duhet të fshini të gjitha burimet në klaster manuelisht.
- Pa kontekstin e duhur, fshirja e branch-it të veçorive në ndërtimin e masterit nuk është e qartë.
PĂ«rdorimi i webhookâave ().
- Mund tĂ« mos jetĂ« qasja juaj. PĂ«r shembull, nĂ« , vetĂ«m njĂ« lloj pipeline mbĂ«shtet mundĂ«sinĂ« e ruajtjes sĂ« konfigurimeve tĂ« tij nĂ« kodin burimor. Kur pĂ«rdorni webhookâĂ«, duhet tĂ« shkruani skriptin tuaj pĂ«r t'i trajtuar ato. Ky skript do tĂ« duhet tĂ« vendoset nĂ« ndĂ«rfaqen e Jenkins, qĂ« Ă«shtĂ« e vĂ«shtirĂ« pĂ«r t'u mbajtur.
Shkruani dhe shtoni klasterin Kubernetes.
- Koha e shpenzuar për shkruarjen dhe mbështetje.
- Operatori tashmë funksionon në një stil të ngjashëm, është dokumentuar dhe mbështetet.
Faleminderit për vëmendjen ndaj artikullit. .
Burimi: habr.com
