Tshem tawm ib qho kev ua haujlwm tsis tu ncua hauv Kubernetes pawg

Tshem tawm ib qho kev ua haujlwm tsis tu ncua hauv Kubernetes pawg

Nyob zoo! Feature ceg (aka xa mus saib ua ntej, tshuaj xyuas app) - qhov no yog thaum tsis yog tsuas yog tus tswv ceg tau xa mus, tab sis kuj txhua qhov kev thov rub mus rau qhov tshwj xeeb URL. Koj tuaj yeem tshawb xyuas seb cov cai ua haujlwm li cas hauv ib puag ncig tsim khoom; Thaum koj tab tom ua haujlwm ntawm kev thov rub, txhua qhov kev cog lus tshiab, qhov kev xa tawm tam sim no rau tus lej qub raug tshem tawm, thiab kev xa tawm tshiab rau tus lej tshiab tau dov tawm. Cov lus nug yuav tshwm sim thaum koj muab qhov kev thov rub rau hauv tus tswv ceg. Koj tsis xav tau cov haujlwm tshwj xeeb, tab sis Kubernetes cov peev txheej tseem nyob hauv pawg.

Xav paub ntau ntxiv txog cov ceg ntoo

Ib txoj hauv kev los ua cov ceg ntoo hauv Kubernetes yog siv cov npe chaw. Nyob rau hauv luv luv, ntau lawm configuration zoo li no:

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

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

Rau ib qho chaw tshwj xeeb, lub npe chaw tsim nrog nws tus lej (piv txwv li, rub tus lej thov) thiab qee yam ua ntej / postfix (piv txwv li, -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
...

Feem ntau, kuv sau Kubernetes Operator (ib daim ntawv thov uas muaj kev nkag mus rau pawg pab pawg), txuas rau qhov project ntawm Github. Nws tshem tawm namespaces uas yog cov qub feature ceg. Hauv Kubernetes, yog tias koj rho tawm lub npe chaw, lwm cov peev txheej hauv lub npe ntawd kuj raug rho tawm.

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

Koj tuaj yeem nyeem txog yuav ua li cas siv cov ceg ntoo hauv ib pawg S, SΡ“S, ΠΈ S, SΡ“S,.

Kev Txhawb

Cia peb saib ntawm ib qho kev thov rub lub neej nrog kev sib txuas txuas ntxiv (continuous integration):

  1. Peb thawb ib qho kev cog lus tshiab rau ceg.
  2. Hauv kev tsim, linters thiab / lossis kev sim ua haujlwm.
  3. Kubernetes rub daim ntawv thov teeb tsa yog tsim los ntawm ya (piv txwv li, nws tus lej tau muab tso rau hauv cov qauv tiav).
  4. Siv kubectl thov, configurations ntxiv rau pawg (deploy).
  5. Kev thov rub yog muab tso rau hauv tus tswv ceg.

Thaum koj tab tom ua haujlwm ntawm kev thov rub, txhua qhov kev cog lus tshiab, qhov kev xa tawm tam sim no rau tus lej qub raug tshem tawm, thiab kev xa tawm tshiab rau tus lej tshiab tau dov tawm. Tab sis thaum muaj kev thov rub mus rau hauv tus tswv ceg, tsuas yog tus tswv ceg yuav raug tsim. Yog li ntawd, nws hloov tawm tias peb twb tsis nco qab txog qhov kev thov rub, thiab nws cov peev txheej Kubernetes tseem nyob hauv pawg.

Yuav siv li cas

Nruab qhov project nrog cov lus txib hauv qab no:

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

Tsim cov ntaub ntawv nrog cov ntsiab lus hauv qab no thiab nruab ntawm kubectl apply -f:

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

Parameter namespaceSubstring yuav tsum tau lim namespaces rau rub thov los ntawm lwm lub namespaces. Piv txwv li, yog tias pawg muaj cov npe hauv qab no: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, ces cov neeg sib tw rau kev tshem tawm yuav yog habr-back-end-pr-17, habr-back-end-pr-33.

Parameter tom qab hnubWithoutDeploy yuav tsum rho tawm cov npe qub qub. Piv txwv li, yog hais tias namespace raug tsim 3 дня 1 час rov qab, thiab parameter qhia 3 дня, no namespace yuav raug deleted. Nws kuj ua hauj lwm nyob rau hauv qhov opposite direction yog hais tias lub namespace yog tsim 2 дня 23 часа rov qab, thiab parameter qhia 3 дня, no namespace yuav tsis raug deleted.

Muaj ib qho kev txwv ntxiv, nws yog lub luag haujlwm rau ntau npaum li cas txhawm rau txheeb xyuas tag nrho cov npe chaw thiab tshawb xyuas hnub yam tsis muaj kev xa tawm - checkEveryMinutes. Los ntawm lub neej ntawd nws yog sib npaug 30 ΠΌΠΈΠ½ΡƒΡ‚Π°ΠΌ.

Yuav ua li cas li no ua hauj lwm

Hauv kev xyaum, koj yuav xav tau:

  1. docker rau kev ua hauj lwm nyob rau hauv ib qho kev sib cais.
  2. Minikube yuav tsa Kubernetes pawg hauv zos.
  3. kubtl ua - hais kom ua kab interface rau pawg tswj hwm.

Peb tsa Kubernetes pawg hauv zos:

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

Peb qhia tau kubectl siv cov pawg hauv zos los ntawm lub neej ntawd:

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

Download configurations rau qhov chaw tsim khoom:

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

Txij li cov khoom tsim tau raug teeb tsa los txheeb xyuas cov npe qub qub, thiab peb cov pawg tshiab uas tsis muaj lawv, peb yuav hloov qhov chaw hloov pauv. IS_DEBUG rau true. Nrog rau qhov no tus nqi parameter afterDaysWithoutDeploy tsis raug coj mus rau hauv tus account thiab namespaces tsis raug tshuaj xyuas rau hnub tsis siv, tsuas yog rau qhov tshwm sim ntawm substring (-pr-).

Yog koj nyob rau Linux:

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

Yog koj nyob rau macOS:

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

Txhim kho qhov project:

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

Tshawb xyuas tias cov peev txheej tau tshwm sim hauv pawg StaleFeatureBranch:

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

Peb xyuas tias tus neeg teb xov tooj tau tshwm sim hauv pawg:

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

Yog tias koj saib ntawm nws cov cav, nws npaj txhij los ua cov peev txheej 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}

Peb nruab npaj-ua fixtures (npaj-ua configurations rau modeling pab pawg neeg) rau ib tug kev pab StaleFeatureBranch:

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

Cov configurations qhia mus nrhiav rau namespaces nrog ib tug substring -pr- ib zaug hauv 1 ΠΌΠΈΠ½ΡƒΡ‚Ρƒ.:

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

Tus neeg teb xov tooj tau teb thiab npaj txhij los tshuaj xyuas lub npe chaw:

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

Nruab fixtures, muaj ob lub npe chaw (project-pr-1, project-pr-2) thiab lawv deployments, services, ingress, thiab lwm yam:

$ 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

Peb xyuas tias tag nrho cov peev txheej saum toj no tau ua tiav tiav:

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

Txij li thaum peb suav nrog debug, cov npe project-pr-1 ΠΈ project-pr-2, yog li ntawd tag nrho lwm yam kev pab yuav tsum tau muab tshem tawm tam sim ntawd yam tsis xav txog qhov parameter afterDaysWithoutDeploy. Qhov no tuaj yeem pom hauv tus neeg teb xov tooj cav:

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

Yog tias koj txheeb xyuas qhov muaj peev txheej, lawv yuav nyob hauv cov xwm txheej Terminating (tus txheej txheem tshem tawm) lossis twb tau muab tshem tawm (cov lus txib tawm yog khoob).

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

Koj tuaj yeem rov ua cov txheej txheem tsim fixtures ob peb zaug thiab xyuas kom tseeb tias lawv raug tshem tawm hauv ib feeb.

Lwm yam

Yuav ua li cas hloov tus neeg teb xov tooj uas ua haujlwm hauv pawg? Muaj ob peb txoj hauv kev, txhua tus ntawm lawv tsis zoo tag nrho (thiab lawv qhov tsis txaus ntseeg yog cov ntsiab lus), thiab txhua tus txiav txim siab rau nws tus kheej seb qhov twg yog qhov zoo tshaj plaws rau ib qhov project:

  1. Rho tawm feature ceg thaum lub sij hawm tas mus li kev koom ua ke tsim ntawm tus tswv ceg.

    • Txhawm rau ua qhov no, koj yuav tsum paub tias qhov kev thov rub twg cuam tshuam nrog kev cog lus uas tab tom tsim. Txij li thaum lub feature ceg namespace muaj tus rub daim ntawv thov - nws tus naj npawb, los yog lub npe ntawm ceg, tus cim yuav tsum tau teev nyob rau hauv qhov kev cog lus.
    • Master ceg tsim ua tsis tiav. Piv txwv li, koj muaj cov theem hauv qab no: rub tawm qhov project, khiav kev sim, tsim qhov project, ua ib qho kev tso tawm, xa cov ntawv ceeb toom, tshem tawm cov ceg ntawm qhov kawg rub thov. Yog tias tsim tsis tau thaum xa ntawv ceeb toom, koj yuav tau tshem tawm tag nrho cov peev txheej hauv pawg manually.
    • Yog tsis muaj cov ntsiab lus tsim nyog, tshem tawm cov ceg ntoo hauv tus tswv tsim tsis pom tseeb.

  2. Kev siv webhooks (Piv txwv).

    • Qhov no yuav tsis yog koj txoj hauv kev. Piv txwv li, hauv Jenkins, tsuas yog ib hom raj xa dej txhawb nqa lub peev xwm los cawm nws cov kev teeb tsa hauv qhov chaws. Thaum siv webhooks, koj yuav tsum sau koj tus kheej tsab ntawv los ua lawv. Tsab ntawv no yuav tsum tau muab tso rau hauv Jenkins interface, uas nyuaj rau tswj.

  3. Sau Cronjob thiab ntxiv Kubernetes pawg.

    • Siv sijhawm sau ntawv thiab txhawb nqa.
    • Tus neeg teb xov tooj twb ua haujlwm zoo sib xws, tau sau tseg thiab txhawb nqa.

Ua tsaug rau koj cov lus qhia. Txuas mus rau qhov project ntawm Github.

Tau qhov twg los: www.hab.com

Ntxiv ib saib