ጊዜ ያለፈበት የባህሪ ቅርንጫፍን በ Kubernetes ዘለላ ውስጥ ሰርዝ

ጊዜ ያለፈበት የባህሪ ቅርንጫፍን በ Kubernetes ዘለላ ውስጥ ሰርዝ

ሠላም! የባህሪ ቅርንጫፍ (ቅድመ እይታን አሰማር፣ የግምገማ መተግበሪያ) - ይህ ዋናው ቅርንጫፍ ሲሰማራ ብቻ ሳይሆን እያንዳንዱም ወደ ልዩ ዩአርኤል የሚጎትት ጥያቄ ነው። ኮዱ በምርት አካባቢ ውስጥ እንደሚሰራ ማረጋገጥ ይችላሉ፤ ባህሪው ለሌሎች ፕሮግራመሮች ወይም የምርት ስፔሻሊስቶች ሊታይ ይችላል። የመጎተት ጥያቄ ላይ እየሰሩ ሳሉ፣ እያንዳንዱ አዲስ ቃል፣ የአሁኑ የአሮጌው ኮድ ስራ ይሰረዛል፣ እና ለአዲሱ ኮድ አዲስ ስራ ላይ ይውላል። የመጎተት ጥያቄን ወደ ዋናው ቅርንጫፍ ሲያዋህዱ ጥያቄዎች ሊነሱ ይችላሉ። ከአሁን በኋላ የባህሪ ቅርንጫፍ አያስፈልገዎትም፣ ነገር ግን የ Kubernetes ሃብቶች አሁንም በክላስተር ውስጥ ናቸው።

ስለ ባህሪ ቅርንጫፎች ተጨማሪ

በኩበርኔትስ ውስጥ የባህሪ ቅርንጫፎችን ለመስራት አንዱ አቀራረብ የስም ቦታዎችን መጠቀም ነው። በአጭሩ የምርት ውቅር ይህን ይመስላል።

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

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

ለባህሪ ቅርንጫፍ፣ የስም ቦታ የሚፈጠረው ከለየው (ለምሳሌ፣ የመጎተት ጥያቄ ቁጥር) እና የሆነ ቅድመ ቅጥያ/ድህረ ቅጥያ (ለምሳሌ፣ -ፕሪ-):

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

በአጠቃላይ እኔ ጻፍኩ 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

የባህሪ ቅርንጫፎችን ወደ ክላስተር እንዴት እንደሚተገብሩ ማንበብ ይችላሉ። እዚህ и እዚህ.

ተነሳሽነት

አንድ የተለመደ የመጎተት ጥያቄ የህይወት ኡደት ቀጣይነት ባለው ውህደት እንይ (continuous integration):

  1. ወደ ቅርንጫፉ አዲስ ቁርጠኝነት እንገፋለን.
  2. በግንባታው ላይ ሊንተሮች እና/ወይም ሙከራዎች ይካሄዳሉ።
  3. የኩበርኔትስ የመሳብ ጥያቄ ውቅሮች በበረራ ላይ ይፈጠራሉ (ለምሳሌ ፣ ቁጥሩ በተጠናቀቀው አብነት ውስጥ ገብቷል)።
  4. kubectl ን በመጠቀም፣ ውቅሮች ወደ ክላስተር (ማሰማራት) ይታከላሉ።
  5. የመጎተት ጥያቄ ከዋናው ቅርንጫፍ ጋር ተዋህዷል።

በመጎተቻ ጥያቄ ውስጥ እየሰሩ ሳሉ፣ ለአሮጌው ኮድ እያንዳንዱ አዲስ ቃል ኪዳን አሁን ይሰረዛል፣ እና ለአዲሱ ኮድ አዲስ ስራ ላይ ይውላል። ነገር ግን የመሳብ ጥያቄ ወደ ዋናው ቅርንጫፍ ሲዋሃድ ዋናው ቅርንጫፍ ብቻ ነው የሚገነባው። በውጤቱም ፣ የመጎተት ጥያቄን ቀድሞውኑ የረሳነው እና የኩበርኔትስ ሀብቶቹ አሁንም በክላስተር ውስጥ ናቸው።

እንዴት መጠቀም እንደሚቻል

ከዚህ በታች ባለው ትዕዛዝ ፕሮጀክቱን ይጫኑ:

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

በሚከተለው ይዘት ፋይል ይፍጠሩ እና በ በኩል ይጫኑ kubectl apply -f:

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

መለኪያ የስም ቦታ ንኡስ ሕብረቁምፊ ከሌሎች የስም ቦታዎች ለሚነሱ ጥያቄዎች የስም ቦታዎችን ለማጣራት ያስፈልጋል። ለምሳሌ፣ ክላስተር የሚከተሉት የስም ቦታዎች ካሉት፡- 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.

መለኪያ ከቀናት በኋላ ከስራ ውጪ የድሮ የስም ቦታዎችን ለመሰረዝ ያስፈልጋል። ለምሳሌ, የስም ቦታ ከተፈጠረ 3 дня 1 час ወደ ኋላ, እና መለኪያው ያመለክታል 3 дняይህ የስም ቦታ ይሰረዛል። የስም ቦታው ከተፈጠረ በተቃራኒው አቅጣጫ ይሰራል 2 дня 23 часа ወደ ኋላ, እና መለኪያው ያመለክታል 3 дняይህ የስም ቦታ አይሰረዝም።

አንድ ተጨማሪ መለኪያ አለ ፣ ሁሉንም የስም ቦታዎችን ለመፈተሽ እና ለቀናት ያለ ማሰማራት ለምን ያህል ጊዜ መፈተሽ ሀላፊነት አለበት - በየደቂቃው ያረጋግጡ. በነባሪነት እኩል ነው 30 минутам.

ይህን ሥራ የሚያደርገው እንዴት ነው?

በተግባር, ያስፈልግዎታል:

  1. Docker ገለልተኛ በሆነ አካባቢ ውስጥ ለመስራት.
  2. ሚኒኩቤ በአካባቢው የኩበርኔትስ ክላስተር ያነሳል።
  3. kubectl - ለክላስተር አስተዳደር የትእዛዝ መስመር በይነገጽ።

በአካባቢው የኩበርኔትስ ስብስብን እናነሳለን፡-

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

ለምርት አካባቢ ውቅሮችን አውርድ

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

የምርት ውቅሮች የቆዩ የስም ቦታዎችን ለመፈተሽ የተዋቀሩ ስለሆኑ እና አዲስ የተነሱት ክላስተር ስለሌላቸው የአካባቢን ተለዋዋጭ እንተካለን። 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 apply -f stale-feature-branch-production-configs.yml

በክላስተር ውስጥ ሃብት መገኘቱን በማጣራት ላይ StaleFeatureBranch:

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

በክላስተር ውስጥ አንድ ኦፕሬተር መታየቱን እናረጋግጣለን።

$ 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":"Operator Version: 0.0.1"}
...
... "msg":"Starting EventSource", ... , "source":"kind source: /, Kind="}
... "msg":"Starting Controller", ...}
... "msg":"Starting workers", ..., "worker count":1}

ተዘጋጅቶ እንጭነዋለን fixtures (ክላስተር ሀብቶችን ለመቅረጽ ዝግጁ የሆኑ ውቅሮች) ለአንድ ግብአት StaleFeatureBranch:

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

አወቃቀሮቹ የስም ቦታዎችን ከንዑስ ሕብረቁምፊ ጋር ለመፈለግ ያመለክታሉ -pr- አንዴ ገባ 1 минуту.:

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

ኦፕሬተሩ ምላሽ ሰጥቷል እና የስም ቦታዎችን ለመፈተሽ ዝግጁ ነው፡-

$ 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 ብዙ ጊዜ እና በአንድ ደቂቃ ውስጥ መወገዳቸውን ያረጋግጡ.

አማራጮች

በክላስተር ውስጥ ከሚሠራ ኦፕሬተር ይልቅ ምን ሊደረግ ይችላል? ብዙ አቀራረቦች አሉ ፣ ሁሉም ፍጽምና የጎደላቸው ናቸው (እና ድክመቶቻቸው ተጨባጭ ናቸው) እና እያንዳንዱ ሰው ለአንድ የተለየ ፕሮጀክት ምን የተሻለ እንደሆነ ለራሱ ይወስናል።

  1. የዋና ቅርንጫፍ ቀጣይነት ባለው ውህደት ግንባታ ወቅት የባህሪ ቅርንጫፍን ሰርዝ።

    • ይህንን ለማድረግ የትኛው የመጎተት ጥያቄ እየተገነባ ካለው ቁርጠኝነት ጋር እንደሚገናኝ ማወቅ ያስፈልግዎታል። የባህሪው ቅርንጫፍ የስም ቦታ የመሳብ ጥያቄ መለያ - ቁጥሩ ወይም የቅርንጫፉ ስም ስላለው መለያው ሁል ጊዜ በቁርጠኝነት ውስጥ መገለጽ አለበት።
    • የማስተር ቅርንጫፍ ግንባታዎች እየተሳኩም ነው። ለምሳሌ, የሚከተሉት ደረጃዎች አሉዎት: ፕሮጀክቱን ያውርዱ, ሙከራዎችን ያካሂዱ, ፕሮጀክቱን ይገንቡ, ይልቀቁ, ማሳወቂያዎችን ይላኩ, የመጨረሻውን የመሳብ ጥያቄ ባህሪ ቅርንጫፍ ያጽዱ. ማሳወቂያ በሚልኩበት ጊዜ ግንባታው ካልተሳካ በክላስተር ውስጥ ያሉትን ሁሉንም ሀብቶች እራስዎ መሰረዝ ይኖርብዎታል።
    • ትክክለኛ አውድ ከሌለ በዋናው ግንባታ ውስጥ ያሉትን የባህሪ ቅርንጫፎች መሰረዝ ግልጽ አይደለም.

  2. የድር መንጠቆዎችን መጠቀም (ምሳሌ).

    • ይህ የእርስዎ አካሄድ ላይሆን ይችላል። ለምሳሌ በ ጄንከንዝ, አንድ አይነት የቧንቧ መስመር ብቻ ውቅሮቹን በምንጭ ኮድ ውስጥ የማዳን ችሎታን ይደግፋል. የድር መንጠቆዎችን ሲጠቀሙ እነሱን ለማስኬድ የራስዎን ስክሪፕት መጻፍ ያስፈልግዎታል። ይህ ስክሪፕት ለማቆየት አስቸጋሪ በሆነው በጄንኪንስ በይነገጽ ውስጥ መቀመጥ አለበት።

  3. ለመጻፍ ክሮንጆብ እና የኩበርኔትስ ክላስተር ያክሉ።

    • በመጻፍ እና በመደገፍ ጊዜ ማሳለፍ.
    • ኦፕሬተሩ ቀድሞውኑ በተመሳሳይ ዘይቤ ይሠራል ፣ ተመዝግቧል እና ይደገፋል።

ለጽሑፉ ትኩረት ስለሰጡን እናመሰግናለን። በ Github ላይ ካለው ፕሮጀክት ጋር አገናኝ.

ምንጭ: hab.com

አስተያየት ያክሉ