Ke wehe ʻana i kahi lālā hiʻohiʻona kahiko i kahi pūʻulu Kubernetes

Ke wehe ʻana i kahi lālā hiʻohiʻona kahiko i kahi pūʻulu Kubernetes

Alohaʻoe! Lala hiʻona (aka deploy preview, review app) - ʻo ia ka manawa ʻaʻole i kau ʻia ka lālā kumu, akā no kēlā me kēia noi huki i kahi URL kūʻokoʻa. Hiki iā ʻoe ke nānā i ka hana ʻana o ke code i kahi ʻenehana hana; hiki ke hōʻike ʻia ka hiʻohiʻona i nā polokalamu polokalamu ʻē aʻe a i ʻole nā ​​​​mea loea huahana. ʻOiai ʻoe e hana ana i kahi noi huki, ua holoi ʻia kēlā me kēia hana hou i kēia manawa no ka code kahiko, a ua ʻōwili ʻia ka hoʻonohonoho hou no ke code hou. Hiki mai nā nīnau ke hoʻohui ʻoe i kahi noi huki i loko o ka lālā kumu. ʻAʻole pono ʻoe i ka lālā hiʻohiʻona, akā aia nā kumuwaiwai Kubernetes i ka pūʻulu.

ʻOi aku e pili ana i nā lālā hiʻohiʻona

ʻO kahi ala e hana ai i nā lālā hiʻohiʻona ma Kubernetes ʻo ka hoʻohana ʻana i nā inoa inoa. I ka pōkole, ʻike ʻia ka hoʻonohonoho hana ʻana penei:

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

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

No kahi lālā hiʻohiʻona, hana ʻia kahi inoa me kona mea hōʻike (no ka laʻana, ka helu noi huki) a me kekahi ʻano prefix/postfix (no ka laʻana, -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
...

Ma keʻano laulā, kākau wau Mea hoʻohana Kubernetes (kahi noi i loaʻa i nā kumuwaiwai cluster), loulou i ka papahana ma Github. Wehe ia i nā inoa inoa no nā lālā hiʻohiʻona kahiko. Ma nā Kubernetes, inā holoi ʻoe i kahi inoa, holoi ʻia nā kumuwaiwai ʻē aʻe i kēlā inoa inoa.

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

Hiki iā ʻoe ke heluhelu e pili ana i ka hoʻokō ʻana i nā lālā hiʻohiʻona i loko o kahi pūʻulu maanei и maanei.

Hoʻokumu

E nānā kākou i ke ola holoʻokoʻa noi huki maʻamau me ka hoʻohui mau ʻana (continuous integration):

  1. Paipai mākou i kahi hana hou i ka lālā.
  2. Ma ke kūkulu ʻana, holo ʻia nā linters a/a i ʻole nā ​​hoʻāʻo.
  3. Hoʻokumu ʻia nā hoʻonohonoho noi huki ʻana o Kubernetes ma ka lele (no ka laʻana, ua hoʻokomo ʻia kāna helu i loko o ka template i hoʻopau ʻia).
  4. Me ka hoʻohana ʻana i ka kubectl, hoʻohui ʻia nā hoʻonohonoho i ka pūʻulu (deploy).
  5. Hoʻohui ʻia ke noi huki i loko o ka lālā kumu.

ʻOiai ʻoe e hana ana i kahi noi huki, ua holoi ʻia kēlā me kēia hana hou i kēia manawa no ka code kahiko, a ua ʻōwili ʻia ka hoʻonohonoho hou no ke code hou. Akā ke hoʻohui ʻia kahi noi huki i ka lālā kumu, kūkulu ʻia ka lālā kumu. ʻO ka hopena, ua hoʻololi ʻia ua poina iā mākou e pili ana i ka noi huki, a aia kāna mau kumu Kubernetes i loko o ka pūʻulu.

Pehea e hoʻohana ai

E hoʻouka i ka papahana me ke kauoha ma lalo nei:

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

E hana i faila me kēia ʻike a hoʻokomo ma o kubectl apply -f:

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

ʻO ka pākuhi namespaceSubstring pono e kānana i nā papa inoa no nā noi huki mai nā inoa inoa ʻē aʻe. No ka laʻana, inā loaʻa i ka pūʻulu nā inoa inoa aʻe: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, a laila nā moho no ka holoi ʻana habr-back-end-pr-17, habr-back-end-pr-33.

ʻO ka pākuhi afterDaysWithoutDeploy pono e holoi i nā inoa inoa kahiko. No ka laʻana, inā hana ʻia ka inoa inoa 3 дня 1 час hope, a hōʻike ka ʻāpana 3 дня, e holoi ʻia kēia wahi inoa. Hana ʻia ma ka ʻaoʻao ʻē aʻe inā hana ʻia ka inoa inoa 2 дня 23 часа hope, a hōʻike ka ʻāpana 3 дня, ʻaʻole e holoi ʻia kēia wahi inoa.

Aia kekahi ʻāpana ʻē aʻe, ʻo ia ke kuleana no ka manawa pinepine e nānā i nā inoa inoa āpau a nānā i nā lā me ka ʻole o ka waiho ʻana - checkEveryMinutes. Ma ka paʻamau, ua like 30 минутам.

Pehea hana i keia hana

I ka hoʻomaʻamaʻa, pono ʻoe:

  1. Docker no ka hana ana ma kahi kaawale.
  2. ʻO Minikube e hoʻāla i kahi hui Kubernetes ma ka ʻāina.
  3. kubectl — ka laina kauoha no ka hooponopono puulu.

Hoʻoulu mākou i kahi hui Kubernetes ma ka ʻāina:

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

E wehewehe kubectl e hoʻohana i ka pūʻulu kūloko ma ka paʻamau:

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

Hoʻoiho i nā hoʻonohonoho no ke kaiapuni hana:

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

No ka mea, ua hoʻonohonoho ʻia nā hoʻonohonoho hana e nānā i nā inoa inoa kahiko, a ʻaʻole i loaʻa i kā mākou puʻupuʻu hou, e hoʻololi mākou i ka loli kaiapuni. IS_DEBUG maluna o true. Me kēia waiwai ka parameter afterDaysWithoutDeploy ʻAʻole i manaʻo ʻia a ʻaʻole nānā ʻia nā inoa inoa no nā lā me ka ʻole o ka waiho ʻana, no ka hiki ʻana mai o ka substring (-pr-).

Inā ʻoe ma Linux:

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

Inā ʻoe ma macOS:

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

Ke kau nei i ka papahana:

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

E hōʻoia ana ua ʻike ʻia kahi kumuwaiwai i loko o ka pūʻulu StaleFeatureBranch:

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

Nānā mākou ua ʻike ʻia kahi mea hoʻohana i ka pūʻulu:

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

Inā ʻoe e nānā i kāna mau lāʻau, ua mākaukau ʻo ia e hana i nā kumuwaiwai 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}

Hoʻokomo mākou i mākaukau fixtures (nā hoʻonohonoho i hoʻomākaukau ʻia no ka hoʻohālike ʻana i nā kumuwaiwai pūʻulu) no kahi kumuwaiwai StaleFeatureBranch:

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

Hōʻike nā hoʻonohonoho i ka ʻimi ʻana i nā inoa inoa me kahi substring -pr- hoʻokahi manawa i loko 1 минуту.:

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

Ua pane ka mea hoʻohana a ua mākaukau e nānā i nā inoa inoa:

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

E hoʻouka fixtures, loaʻa nā inoa ʻelua (project-pr-1, project-pr-2) a me lākou deployments, services, ingress, a laila:

$ 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

ʻIke mākou ua hana maikaʻi ʻia nā kumuwaiwai āpau ma luna:

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

Mai ko makou komo ana debug, nā papa inoa project-pr-1 и project-pr-2, no laila e hoʻopau koke ʻia nā kumuwaiwai ʻē aʻe me ka ʻole e noʻonoʻo i ka palena afterDaysWithoutDeploy. Hiki ke ʻike ʻia kēia ma nā log o ka mea hoʻohana:

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

Inā ʻoe e nānā i ka loaʻa o nā kumuwaiwai, aia lākou i ke kūlana Terminating (kaʻina hoʻopau) a i ʻole i holoi ʻia (ʻaʻohe puka o ke kauoha).

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

Hiki iā ʻoe ke hana hou i ke kaʻina hana fixtures i kekahi mau manawa a e hōʻoia e wehe ʻia i loko o hoʻokahi minuke.

Nā meaʻokoʻa

He aha ka mea hiki ke hana ma kahi o ka mea hoʻohana e hana ana i kahi hui? Nui nā ala, ʻaʻohe kūpono o lākou a pau (a ʻo ko lākou mau hemahema he kumuhana), a hoʻoholo kēlā me kēia mea nona iho i ka mea maikaʻi loa no kahi papahana.

  1. Holoi i ka lālā hiʻohiʻona i ka hoʻohui ʻana o ka lālā kumu.

    • No ka hana ʻana i kēia, pono ʻoe e ʻike i ke noi huki e pili ana i ka commit e kūkulu ʻia nei. No ka mea, aia ka inoa o ka lālā hiʻohiʻona i ka mea hōʻike noi huki - kona helu, a i ʻole ka inoa o ka lālā, pono e kuhikuhi ʻia ka mea ʻike ma ka commit.
    • Ke hāʻule nei nā kūkulu lālā kumu. No ka laʻana, loaʻa iā ʻoe nā pae aʻe: hoʻoiho i ka papahana, holo i nā hoʻokolohua, kūkulu i ka papahana, hana i kahi hoʻokuʻu, hoʻouna i nā leka hoʻomaopopo, hoʻomaʻemaʻe i ka lālā hiʻohiʻona o ka noi huki hope. Inā hāʻule ke kūkulu ʻana i ka wā e hoʻouna ai i kahi leka hoʻomaopopo, pono ʻoe e holoi lima i nā kumuwaiwai āpau i ka cluster.
    • Me ka ʻole o ka pōʻaiapili kūpono, ʻaʻole maopopo ka holoi ʻana i nā lālā hiʻohiʻona i ka haku kūkulu.

  2. Ke hoʻohana nei i nā hoʻopaʻa pūnaewele (hiʻohiʻona).

    • ʻAʻole paha kēia kāu ala. Eia kekahi laʻana, ma ʻO Jenkins, Hoʻokahi wale nō ʻano o ka pipeline e kākoʻo i ka hiki ke mālama i kāna mau hoʻonohonoho ma ke code kumu. Ke hoʻohana nei i nā webhooks, pono ʻoe e kākau i kāu palapala ponoʻī e hoʻoponopono iā lākou. Pono e hoʻokomo ʻia kēia palapala i ka interface Jenkins, he paʻakikī ke mālama.

  3. E kakau Cronjob a hoʻohui i kahi hui Kubernetes.

    • Hoʻolilo manawa ma ke kākau ʻana a me ke kākoʻo.
    • Ke hana nei ka mea hoʻohana i ke ʻano like, ua palapala ʻia a kākoʻo ʻia.

Mahalo iā ʻoe no kou nānā ʻana i ka ʻatikala. Ka loulou i ka papahana ma Github.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka