Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдкреБрд░рд╛рдиреЛ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ рд╣рдЯрд╛рдЙрдБрджреИ

Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдкреБрд░рд╛рдиреЛ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ рд╣рдЯрд╛рдЙрдБрджреИ

рдирдорд╕реНрддреЗ! рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ (рдЙрд░реНрдл рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░рд┐рднреНрдпреВ, рд░рд┐рднреНрдпреБ рдПрдк) - рдпреЛ рддрдм рд╣реБрдиреНрдЫ рдЬрдм рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдорд╛рддреНрд░ рдирднрдИ рдЕрдирдиреНрдп URL рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрдирд┐ рдЧрд░рд┐рдиреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдХреЛрдб рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫ рдХрд┐ рдЧрд░реНрджреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ; рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд╣рд░реВ рд╡рд╛ рдЙрддреНрдкрд╛рджрди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрд╣рд░реВрд▓рд╛рдИ рджреЗрдЦрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред рдЬрдм рддрдкрд╛рдЗрдБ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдорд╛ рдХрд╛рдо рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ, рдкреБрд░рд╛рдиреЛ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рдХрдорд┐рдЯ рд╣рд╛рд▓рдХреЛ рдбрд┐рдкреНрд▓реЛрдп рдореЗрдЯрд╛рдЗрдиреНрдЫ, рд░ рдирдпрд╛рдБ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рдбрд┐рдкреНрд▓реЛрдп рд░реЛрд▓ рдЖрдЙрдЯ рд╣реБрдиреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдорд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд░реНрдЬ рдЧрд░реНрджрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рдЙрдареНрди рд╕рдХреНрдЫрдиреНред рддрдкрд╛рдИрд▓рд╛рдИ рдЕрдм рдлреАрдЪрд░ рд╢рд╛рдЦрд╛рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди, рддрд░ 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. Kubernetes рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рдЙрдбрд╛рдирдорд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╕рдХреЛ рдирдореНрдмрд░ рд╕рдорд╛рдкреНрдд рдЯреЗрдореНрдкреНрд▓реЗрдЯрдорд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реБрдиреНрдЫ)ред
  4. kubectl рд▓рд╛рдЧреВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рдХреНрд▓рд╕реНрдЯрд░ (рдбрд┐рдкреНрд▓реЛрдп) рдорд╛ рдердкрд┐рдиреНрдЫрдиреНред
  5. рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдорд╛ рдорд░реНрдЬ рдЧрд░рд┐рдПрдХреЛ рдЫред

рдЬрдм рддрдкрд╛рдЗрдБ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдорд╛ рдХрд╛рдо рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ, рдкреБрд░рд╛рдиреЛ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рдХрдорд┐рдЯ рд╣рд╛рд▓рдХреЛ рдбрд┐рдкреНрд▓реЛрдп рдореЗрдЯрд╛рдЗрдиреНрдЫ, рд░ рдирдпрд╛рдБ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рдбрд┐рдкреНрд▓реЛрдп рд░реЛрд▓ рдЖрдЙрдЯ рд╣реБрдиреНрдЫред рддрд░ рдЬрдм рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдорд╛ рдорд░реНрдЬ рд╣реБрдиреНрдЫ, рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдорд╛рддреНрд░ рдирд┐рд░реНрдорд╛рдг рд╣реБрдиреЗрдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рд╣рд╛рдореАрд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрд┐рд░реНрд╕реЗрдХрд╛ рдЫреМрдВ, рд░ рдпрд╕рдХреЛ Kubernetes рд╕реНрд░реЛрддрд╣рд░реВ рдЕрдЭреИ рдкрдирд┐ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдЫрдиреНред

рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ

рддрд▓рдХреЛ рдЖрджреЗрд╢рдХреЛ рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

$ 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

рдкрд░рд┐рдорд┐рддрд┐ namespaceSubstring рдЕрдиреНрдп рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВрдмрд╛рдЯ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдирд┐рдореНрди рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдЫрдиреН: 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.

рдкрд░рд┐рдорд┐рддрд┐ afterDaysWithoutDeploy рдкреБрд░рд╛рдирд╛ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдореЗрдЯрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ 3 ╨┤╨╜╤П 1 ╤З╨░╤Б рдкрдЫрд╛рдбрд┐, рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ 3 ╨┤╨╜╤П, рдпреЛ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдЯрд┐рдиреЗрдЫред рдпрджрд┐ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ рдпрд╕рд▓реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдорд╛ рдкрдирд┐ рдХрд╛рдо рдЧрд░реНрджрдЫ 2 ╨┤╨╜╤П 23 ╤З╨░╤Б╨░ рдкрдЫрд╛рдбрд┐, рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ 3 ╨┤╨╜╤П, рдпреЛ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдЯрд┐рдиреЗ рдЫреИрдиред

рддреНрдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рдердк рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЫ, рдпреЛ рд╕рдмреИ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдХрддрд┐ рдкрдЯрдХ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрдиреЗ рд░ рддреИрдирд╛рддреА рдмрд┐рдирд╛ рджрд┐рдирд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ - рд╣рд░реЗрдХ рдорд┐рдиреЗрдЯ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдпреЛ рдмрд░рд╛рдмрд░ рдЫ 30 ╨╝╨╕╨╜╤Г╤В╨░╨╝.

рдпреЛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ

рдЕрднреНрдпрд╛рд╕ рдорд╛, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ:

  1. рдбрдХрд░ рдПрдХ рдкреГрдердХ рд╡рд╛рддрд╛рд╡рд░рдг рдорд╛ рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреАред
  2. Minikube рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рдЦрдбрд╛ рдЧрд░реНрдиреЗрдЫред
  3. kubectl - рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирдХреЛ рд▓рд╛рдЧрд┐ рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди рдЗрдиреНрдЯрд░рдлреЗрд╕ред

рд╣рд╛рдореА рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ 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".

рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН:

$ 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. рд▓реЗрдЦреНрди рдХреНрд░реЛрдирдЬрдм рд░ Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рдердкреНрдиреБрд╣реЛрд╕реНред

    • рд▓реЗрдЦрди рд░ рд╕рдорд░реНрдердирдорд╛ рд╕рдордп рдЦрд░реНрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
    • рдЕрдкрд░реЗрдЯрд░ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдорд╛рди рд╢реИрд▓реА рдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ, рджрд╕реНрддрд╛рд╡реЗрдЬ рд░ рд╕рдорд░реНрдерд┐рдд рдЫред

рд▓реЗрдЦрдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрднрдПрдХреЛрдорд╛ рдзрдиреНрдпрд╡рд╛рджред Github рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд┐рдЩреНрдХ.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди