Wepụ alaka ụlọ ọrụ emechiela n'ime ụyọkọ Kubernetes

Wepụ alaka ụlọ ọrụ emechiela n'ime ụyọkọ Kubernetes

Ndewo! Alaka njirimara (aka deploy preview, ngwa nyocha) - nke a bụ mgbe ebugara ọ bụghị naanị ngalaba nna ukwu, kamakwa ọ na-adọta arịrịọ ọ bụla na URL pụrụ iche. Ị nwere ike ịlele ma koodu ahụ na-arụ ọrụ na mpaghara mmepụta; enwere ike igosi ndị mmemme ọzọ ma ọ bụ ndị ọkachamara ngwaahịa. Mgbe ị na-arụ ọrụ na arịrịọ ịdọrọ, a na-ehichapụ koodu ọhụrụ nke ọ bụla na-etinye ugbu a, ma tinyekwa koodu ọhụrụ maka koodu ọhụrụ ahụ. Ajụjụ nwere ike ibilite mgbe ị jikọtara arịrịọ ịdọrọ n'ime alaka ụlọ ọrụ. Ị chọghịzi alaka ụlọ ọrụ ahụ, mana akụrụngwa Kubernetes ka dị na ụyọkọ ahụ.

Ndị ọzọ gbasara alaka atụmatụ

Otu ụzọ isi mepụta alaka atụmatụ na Kubernetes bụ iji oghere aha. Na nkenke, nhazi mmepụta ihe dị ka nke a:

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

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

Maka ngalaba njirimara, a na-emepụta oghere aha ya na njirimara ya (dịka ọmụmaatụ, nọmba arịrịọ dọkpụrụ) yana ụfọdụ ụdị prefix/postfix (dịka ọmụmaatụ, -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'ozuzu, m dere Onye ọrụ Kubernetes (ngwa nwere ohere ịnweta akụrụngwa ụyọkọ), njikọ na oru ngo na Github. Ọ na-ewepụ oghere aha ndị dị na ngalaba njirimara ochie. Na Kubernetes, ọ bụrụ na ihichapụ oghere aha, a na-ehichapụkwa akụrụngwa ndị ọzọ dị na oghere aha ahụ na-akpaghị aka.

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

Ị nwere ike ịgụ maka otu esi etinye alaka atụmatụ n'ime ụyọkọ ebe a и ebe a.

Mkpali

Ka anyị lelee a ahụkarị sere arịrịọ lifecycle na-aga n'ihu mwekota (continuous integration):

  1. Anyị na-akwali ọhụrụ nkwa na alaka ụlọ ọrụ.
  2. N'elu ụlọ ahụ, a na-agba ọsọ na/ma ọ bụ ule.
  3. A na-emepụta nhazi arịrịọ Kubernetes na ofufe (dịka ọmụmaatụ, etinyere nọmba ya n'ime ndebiri emechara).
  4. Iji kubectl tinye, a na-agbakwunye nhazi na ụyọkọ (ebuga).
  5. A na-ejikọta arịrịọ ịdọrọ n'ime alaka ụlọ ọrụ.

Mgbe ị na-arụ ọrụ na arịrịọ ịdọrọ, a na-ehichapụ koodu ọhụrụ nke ọ bụla na-etinye ugbu a, ma tinyekwa koodu ọhụrụ maka koodu ọhụrụ ahụ. Ma mgbe a na-ejikọta arịrịọ ịdọrọ n'ime alaka ụlọ ọrụ, ọ bụ naanị alaka ụlọ ọrụ ka a ga-ewu. N'ihi ya, ọ na-apụta na anyị echefuolarị arịrịọ ịdọrọ, na akụrụngwa Kubernetes ya ka dị na ụyọkọ.

Otu esi eji

Wụnye oru ngo na iwu dị n'okpuru:

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

Mepụta faịlụ nwere ọdịnaya ndị a wee wụnye site na kubectl apply -f:

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

Ogologo ahaspaceSubstring achọrọ iji nzacha oghere aha maka ịdọrọ arịrịọ sitere na oghere aha ndị ọzọ. Dịka ọmụmaatụ, ọ bụrụ na ụyọkọ ahụ nwere oghere aha ndị a: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, mgbe ahụ, ndị ga-achọ ihichapụ ga-abụ habr-back-end-pr-17, habr-back-end-pr-33.

Ogologo Mgbe ụbọchị gachara na-enweghị Deploy achọrọ ka ihichapụ oghere aha ochie. Dịka ọmụmaatụ, ọ bụrụ na emepụtara oghere aha 3 дня 1 час azụ, na oke na-egosi 3 дня, a ga-ehichapụ oghere aha a. Ọ na-arụkwa ọrụ n'akụkụ nke ọzọ ma ọ bụrụ na emepụtara oghere aha 2 дня 23 часа azụ, na oke na-egosi 3 дня, Agaghị ehichapụ oghere aha a.

Enwere otu paramita ọzọ, ọ bụ ya na-ahụ maka ugboro ole iji nyochaa oghere aha niile wee lelee ụbọchị na-enweghị ibugharị - lelee nkeji ọ bụla. Site na ndabara ọ hà nhata 30 минутам.

Olee otú nke a na-arụ ọrụ

Na omume, ị ga-achọ:

  1. Docker maka ịrụ ọrụ n'ebe dịpụrụ adịpụ.
  2. Minikube ga-ebulite ụyọkọ Kubernetes na mpaghara.
  3. kubectl - interface ahịrị iwu maka njikwa ụyọkọ.

Anyị na-ebuli ụyọkọ Kubernetes na mpaghara:

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

Anyị na-egosi kubectl jiri ụyọkọ mpaghara na ndabara:

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

Budata nhazi maka gburugburu mmepụta:

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

Ebe ọ bụ na ahaziri nhazi nrụpụta ka ịlele oghere aha ochie, na ụyọkọ anyị ewelitere ọhụrụ enweghị ha, anyị ga-edochi mgbanwe gburugburu ebe obibi. IS_DEBUG on true. Na nke a uru paramita afterDaysWithoutDeploy A naghị eburu n'uche na a naghị enyocha oghere aha maka ụbọchị na-enweghị ibugharị, naanị maka ihe omume nke substring (-pr-).

Ọ bụrụ na ị nọ Linux:

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

Ọ bụrụ na ị nọ macOS:

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

Ịwụnye oru ngo:

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

Na-enyocha na akụrụngwa apụtala na ụyọkọ ahụ StaleFeatureBranch:

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

Anyị na-enyocha na onye ọrụ apụtala na ụyọkọ:

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

Ọ bụrụ na ị lelee ndekọ ya, ọ dị njikere ịhazi akụrụngwa 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}

Anyị na-etinye ihe ejikere fixtures (Nhazi nke emebere maka imepụta akụrụngwa ụyọkọ) maka akụrụngwa StaleFeatureBranch:

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

Nhazi ndị a na-egosi iji eriri obere chọọ oghere aha -pr- otu ugboro na 1 минуту.:

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

Onye ọrụ ahụ azaghachila ma dị njikere ịlele oghere aha:

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

Wụnye fixtures, nwere oghere aha abụọ (project-pr-1, project-pr-2) na ha deployments, services, ingress, were gabazie:

$ 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

Anyị na-enyocha na emepụtara akụrụngwa niile dị n'elu nke ọma:

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

Ebe ọ bụ na anyị gụnyere debug, oghere aha project-pr-1 и project-pr-2, ya mere a ga-ehichapụ ihe niile ndị ọzọ ozugbo na-ejighị n'uche parameter afterDaysWithoutDeploy. Enwere ike ịhụ nke a na ndekọ ndị ọrụ:

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

Ọ bụrụ na ị lelee nnweta akụrụngwa, ha ga-adị na ọkwa Terminating (usoro nhichapụ) ma ọ bụ ehichapụrịrị (mpụta iwu efu).

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

Ị nwere ike ikwugharị usoro okike fixtures ọtụtụ oge ma hụ na ewepụrụ ha n'ime nkeji.

Ndị ọzọ

Kedu ihe a ga-eme kama onye ọrụ na-arụ ọrụ na ụyọkọ? Enwere ụzọ dị iche iche, ha niile ezughị okè (na mmejọ ha bụ nke onwe), onye ọ bụla na-ekpebikwa onwe ya ihe kacha mma maka otu ọrụ:

  1. Hichapụ ngalaba njirimara n'oge njikọta na-aga n'ihu na-ewu alaka ukwu.

    • Iji mee nke a, ị ga-amata arịrịọ ịdọrọ uche na-emetụta ntinye nke a na-ewu. Ebe ọ bụ na ngalaba aha njirimara nwere ihe nchọpụta ihe ndọpụta - nọmba ya, ma ọ bụ aha alaka ụlọ ọrụ ahụ, a ga-akọwapụta ihe njirimara mgbe niile na ntinye aka.
    • Ụlọ ọrụ ngalaba nna ukwu na-akụ afọ n'ala. Dịka ọmụmaatụ, ị nwere usoro ndị a: budata oru ngo, mee ule, wuo ọrụ ahụ, mee ntọhapụ, zipu ọkwa, kpochapụ ngalaba njirimara nke arịrịọ ịdọrọ ikpeazụ. Ọ bụrụ na ụlọ ahụ daa mgbe ị na-eziga ọkwa, ị ga-eji aka ihichapụ akụrụngwa niile dị na ụyọkọ ahụ.
    • Na-enweghị ọnọdụ kwesịrị ekwesị, ihichapụ ngalaba atụmatụ na ụlọ ihe nrụpụta anaghị apụta ìhè.

  2. Iji webhooks (ihe atụ).

    • Nke a nwere ike ọ gaghị abụ ụzọ gị. Dịka ọmụmaatụ, na Jenkins, naanị otu ụdị pipeline na-akwado ike ịchekwa nhazi ya na koodu isi mmalite. Mgbe ị na-eji webhooks, ịkwesịrị ide edemede nke gị ka ị hazie ha. A ga-etinyerịrị edemede a na interface Jenkins, nke siri ike idowe.

  3. Iji dee Cronjob ma tinye ụyọkọ Kubernetes.

    • Na-etinye oge na ide na nkwado.
    • Onye na-arụ ọrụ na-arụ ọrụ ugbua n'ụdị yiri ya, edepụtala ma kwado ya.

Daalụ maka nlebara anya gị na akụkọ ahụ. Njikọ na oru ngo na Github.

isi: www.habr.com

Tinye a comment