Hi! Հատկանիշի մասնաճյուղ (aka deploy նախադիտում, վերանայման հավելված) - սա այն դեպքում, երբ տեղակայվում է ոչ միայն հիմնական մասնաճյուղը, այլև յուրաքանչյուր ձգման հարցում դեպի եզակի URL: Դուք կարող եք ստուգել, թե արդյոք կոդը աշխատում է արտադրական միջավայրում, հատկանիշը կարող է ցուցադրվել այլ ծրագրավորողների կամ արտադրանքի մասնագետների։ Մինչ դուք աշխատում եք pull-ի հարցումով, յուրաքանչյուր նոր commit ընթացիկ տեղակայում հին կոդի համար ջնջվում է, և նոր տեղակայումը նոր կոդի համար դուրս է գրվում: Հարցեր կարող են առաջանալ, երբ դուք միավորում եք pull-ի հարցումը հիմնական մասնաճյուղում: Ձեզ այլևս պետք չէ հատկանիշի ճյուղը, սակայն Kubernetes-ի ռեսուրսները դեռ կլաստերի մեջ են:
Մանրամասն խաղարկային ճյուղերի մասին
Kubernetes-ում առանձնահատկությունների ճյուղեր ստեղծելու մոտեցումներից մեկը անվանատարածքների օգտագործումն է: Մի խոսքով, արտադրության կոնֆիգուրացիան հետևյալն է.
Ընդհանրապես գրել եմ Kubernetes օպերատոր (հավելված, որը հասանելի է կլաստերի ռեսուրսներին), հղում նախագծին Github-ում. Այն հեռացնում է անունների տարածքները, որոնք պատկանում են հին առանձնահատկությունների ճյուղերին: Kubernetes-ում, եթե դուք ջնջում եք անվանատարածք, այդ անվանատարածքի մյուս ռեսուրսները նույնպես ինքնաբերաբար ջնջվում են:
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h
Դուք կարող եք կարդալ այն մասին, թե ինչպես կարելի է կիրառել առանձնահատկությունների ճյուղերը կլաստերի մեջ այստեղ и այստեղ.
Կառուցման վրա կատարվում են լինտերներ և/կամ թեստեր:
Kubernetes-ի ձգման հարցումների կոնֆիգուրացիաները ստեղծվում են անմիջապես (օրինակ, դրա համարը տեղադրվում է պատրաստի ձևանմուշում):
Օգտագործելով kubectl application-ը, կոնֆիգուրացիաները ավելացվում են կլաստերին (տեղակայում):
Ձգման հարցումը միաձուլվում է գլխավոր մասնաճյուղին:
Մինչ դուք աշխատում եք ձգման հարցումի վրա, յուրաքանչյուր նոր հանձնում, հին կոդի ընթացիկ տեղակայումը ջնջվում է, իսկ նոր կոդի նոր տեղակայումը դուրս է գրվում: Բայց երբ ձգման հարցումը միաձուլվում է գլխավոր ճյուղին, կկառուցվի միայն գլխավոր ճյուղը: Արդյունքում պարզվում է, որ մենք արդեն մոռացել ենք ձգման հարցումը, և նրա Kubernetes ռեսուրսները դեռ կլաստերում են։
Parameter namespace Ենթատող անհրաժեշտ է անվանատարածքները զտել այլ անվանատարածքներից քաշելու հարցումների համար: Օրինակ, եթե կլաստերը ունի հետևյալ անունների տարածքները. habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, ապա ջնջման թեկնածուներ կլինեն habr-back-end-pr-17, habr-back-end-pr-33.
Parameter afterDaysWithoutDeploy անհրաժեշտ է հին անվանատարածքները ջնջելու համար: Օրինակ, եթե ստեղծվել է անվանատարածք 3 дня 1 час ետ, և պարամետրը ցույց է տալիս 3 дня, այս անվանատարածքը կջնջվի: Այն նաև աշխատում է հակառակ ուղղությամբ, եթե ստեղծվում է անվանատարածք 2 дня 23 часа ետ, և պարամետրը ցույց է տալիս 3 дня, այս անվանատարածքը չի ջնջվի:
Կա ևս մեկ պարամետր, այն պատասխանատու է այն բանի համար, թե որքան հաճախ է սկանավորում բոլոր անվանատարածքները և ստուգում օրերով առանց տեղակայման. ստուգեքEveryMinutes. Լռելյայն հավասար է 30 минутам.
Մինիկուբե կբարձրացնի Kubernetes կլաստերը տեղական մակարդակում:
կուբեկտլ — հրամանի տողի ինտերֆեյս կլաստերի կառավարման համար:
Մենք տեղական մակարդակում բարձրացնում ենք Kubernetes կլաստերը.
$ 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.
Մենք նշում ենք kubectl լռելյայն օգտագործել տեղական կլաստերը.
$ kubectl config use-context minikube
Switched to context "minikube".
Քանի որ արտադրական կազմաձևերը կազմաձևված են հին անունների տարածքները ստուգելու համար, և մեր նոր բարձրացված կլաստերը դրանք չունի, մենք կփոխարինենք շրջակա միջավայրի փոփոխականը IS_DEBUG մասին true. Այս արժեքով պարամետրը afterDaysWithoutDeploy հաշվի չի առնվում, և անունների տարածքները օրերով չեն ստուգվում առանց տեղակայման, միայն ենթալարի առաջացման համար (-pr-).
Եթե դուք գտնվում եք Linux:
$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml
Եթե դուք գտնվում եք macOS:
$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml
Մենք ստուգում ենք, որ օպերատորը հայտնվել է կլաստերում.
$ kubectl get pods --namespace stale-feature-branch-operator
NAME ... STATUS ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s
Եթե նայեք դրա տեղեկամատյաններին, ապա այն պատրաստ է վերամշակել ռեսուրսները StaleFeatureBranch:
Օպերատորը պատասխանել է և պատրաստ է ստուգել անունների տարածքները.
$ 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"}
Նախադրել fixtures, որը պարունակում է երկու անվանատարածք (project-pr-1, project-pr-2) և դրանք deployments, services, ingressև այլն:
$ 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
Մենք ստուգում ենք, որ վերը նշված բոլոր ռեսուրսները հաջողությամբ ստեղծվել են.
$ 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
...
Քանի որ մենք ներառել ենք debug, անվանատարածքներ project-pr-1 и project-pr-2, հետևաբար մնացած բոլոր ռեսուրսները պետք է անմիջապես ջնջվեն՝ առանց պարամետրը հաշվի առնելու afterDaysWithoutDeploy. Սա կարելի է տեսնել օպերատորի տեղեկամատյաններում.
$ 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"}
Եթե դուք ստուգեք ռեսուրսների առկայությունը, ապա դրանք կլինեն կարգավիճակում Terminating (ջնջման գործընթաց) կամ արդեն ջնջված է (հրամանի ելքը դատարկ է):
$ 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
...
Դուք կարող եք կրկնել ստեղծման գործընթացը fixtures մի քանի անգամ և համոզվեք, որ դրանք հեռացվում են մեկ րոպեի ընթացքում:
Այլընտրանքները
Ի՞նչ կարելի է անել օպերատորի փոխարեն, որն աշխատում է կլաստերում: Կան մի քանի մոտեցումներ, բոլորն էլ անկատար են (և դրանց թերությունները սուբյեկտիվ են), և յուրաքանչյուրն ինքն է որոշում, թե որն է լավագույնը կոնկրետ նախագծի համար.
Ջնջել հատկանիշի ճյուղը հիմնական ճյուղի շարունակական ինտեգրման ժամանակ:
Դա անելու համար դուք պետք է իմանաք, թե որ ձգման հարցումն է վերաբերում կառուցվող պարտավորությանը: Քանի որ առանձնահատկությունների ճյուղի անվանատարածքը պարունակում է pull request նույնացուցիչը՝ դրա համարը կամ ճյուղի անվանումը, նույնացուցիչը միշտ պետք է նշվի commit-ում:
Մասնաճյուղերի կառուցումը ձախողվում է: Օրինակ, դուք ունեք հետևյալ փուլերը՝ ներբեռնեք նախագիծը, կատարեք թեստեր, կառուցեք նախագիծը, թողարկեք, ուղարկեք ծանուցումներ, մաքրեք վերջին ձգման հարցումի գործառույթի ճյուղը: Եթե ծանուցում ուղարկելիս build-ը ձախողվի, դուք ստիպված կլինեք ձեռքով ջնջել կլաստերի բոլոր ռեսուրսները:
Առանց համապատասխան համատեքստի, հիմնական կառուցվածքում գործառույթների ճյուղերի ջնջումը ակնհայտ չէ:
Սա չի կարող լինել ձեր մոտեցումը: Օրինակ՝ մեջ Jenkins, խողովակաշարի միայն մեկ տեսակն աջակցում է սկզբնական կոդում իր կազմաձևերը պահպանելու հնարավորությունը: Վեբ-կեռիկներ օգտագործելիս դուք պետք է գրեք ձեր սեփական սցենարը՝ դրանք մշակելու համար: Այս սցենարը պետք է տեղադրվի Jenkins ինտերֆեյսում, որը դժվար է պահպանել: