рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рдкрд░рд┐рдЪрдп рджрд┐рдБрджреИ: Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рднрдпреЛ

рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рд▓реЗрдЦрд╣рд░реВ рднрдЗрд╕рдХреЗрдХрд╛ рдЫрдиреН Kubernetes рдорд╛ рдЕрдкрд░реЗрдЯрд░ рдХреНрд╖рдорддрд╛рд╣рд░реБ рдЕрдирд┐ рдХрд╕рд░реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдкрд░реЗрдЯрд░ рдЖрдлреИ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реНред рдпрд╕ рдкрдЯрдХ рд╣рд╛рдореА рддрдкрд╛рдИрдВрдХреЛ рдзреНрдпрд╛рдирдорд╛ рд╣рд╛рдореНрд░реЛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рдЬрд╕рд▓реЗ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛рд▓рд╛рдИ рд╕реБрдкрд░-рд╕рдЬрд┐рд▓реЛ рд╕реНрддрд░рдорд╛ рд▓реИрдЬрд╛рдиреНрдЫ - рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рд╢реЗрд▓ рдЕрдкрд░реЗрдЯрд░!

рдХрд┐рди?

рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рд╡рд┐рдЪрд╛рд░ рдПрдХрджрдо рд╕рд░рд▓ рдЫ: Kubernetes рд╡рд╕реНрддреБрд╣рд░реВрдмрд╛рдЯ рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдиреБрд╣реЛрд╕реН, рд░ рдЬрдм рдпреА рдШрдЯрдирд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреНрдЫрдиреН, рдмрд╛рд╣реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдШрдЯрдирд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдЧрд░реНрджреИ:

рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рдкрд░рд┐рдЪрдп рджрд┐рдБрджреИ: Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рднрдпреЛ

рдпрд╕рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рддрдм рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛ рдЬрдм, рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдХреЛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рдХреНрд░рдордорд╛, рд╕рд╛рдирд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рджреЗрдЦрд╛ рдкрд░реНрди рдерд╛рд▓реЗ рдХрд┐ рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдореИ рд╕рд╣реА рддрд░реАрдХрд╛рд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред рдпреА рд╕рдмреИ рд╕рд╛рдирд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рд╕рд░рд▓ рдмреНрдпрд╛рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╣рд▓ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдпрджреНрдпрдкрд┐, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ, рдпреЛ Golang рдорд╛ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд▓реЗрдЦреНрди рд░рд╛рдореНрд░реЛ рдЫред рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдкреНрд░рддреНрдпреЗрдХ рдпрд╕реНрддреЛ рд╕рд╛рдиреЛ рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рдХреЛ рдкреВрд░реНрдг-рд╕реНрддрд░реАрдп рд╡рд┐рдХрд╛рд╕рдорд╛ рд▓рдЧрд╛рдиреА рдЕрдкреНрд░рднрд╛рд╡реА рд╣реБрдиреЗрдЫред

15 рдорд┐рдиреЗрдЯрдорд╛ рдЕрдкрд░реЗрдЯрд░

Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реБрди рд╕рдХреНрдЫ рд░ рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рд▓реЗ рдХрд╕рд░реА рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ рднрдиреНрдиреЗ рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реМрдВред рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрди рд╣реБрдиреЗрдЫ: рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд╣реБрдБрдЪ рдЧрд░реНрди рдЧреЛрдкреНрдп рдкреНрд░рддрд┐рдХреГрддрд┐ред

рдирд┐рдЬреА рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдмрд╛рдЯ рдЫрд╡рд┐рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреЛрдбрд╣рд░реВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдореЗрдирд┐рдлреЗрд╕реНрдЯрдорд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд╣реБрдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЯрд╛рдХреЛ рд╕рд╛рде рдЧреЛрдкреНрдп рд▓рд┐рдВрдХ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпреЛ рдЧреЛрдкреНрдп рдкреЛрдбрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдкреНрд░рддреНрдпреЗрдХ рдиреЗрдорд╕реНрдкреЗрд╕рдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпреЛ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдгрд╣рд░реВ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдпреМрдВ рднрдиреЗ, рдПрдЙрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдиреЗрдорд╕реНрдкреЗрд╕ рдзреЗрд░реИ рд╣реБрдиреЗрдЫред рд░ рдпрджрд┐ рддреНрдпрд╣рд╛рдБ 2-3 рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗ ... рд░рд╣рд╕реНрдпрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдзреЗрд░реИ рдареВрд▓реЛ рд╣реБрдиреНрдЫред рд░ рд░рд╣рд╕реНрдпрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЕрд░реНрдХреЛ рдХреБрд░рд╛: рдо рд╕рдордп рд╕рдордпрдорд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд╣реБрдБрдЪ рдЧрд░реНрди рдХреБрдЮреНрдЬреА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред рдЕрдиреНрддрддрдГ, рдореНрдпрд╛рдиреБрдЕрд▓ рд╕рдЮреНрдЪрд╛рд▓рди рд╕рдорд╛рдзрд╛рдирдХреЛ рд░реВрдкрдорд╛ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдкреНрд░рднрд╛рд╡рд╣реАрди - рд╣рд╛рдореАрд▓реЗ рдЧреЛрдкреНрдпрд╣рд░реВрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ рд░ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рд╕рд░рд▓ рд╕реНрд╡рдЪрд╛рд▓рди

рдПрдХ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЦреМрдВ рдЬреБрди рдкреНрд░рддреНрдпреЗрдХ N рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдПрдХ рдкрдЯрдХ рдЪрд▓реНрдЫ рд░ рдЧреЛрдкреНрдп рдЙрдкрд╕реНрдерд┐рддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ, рд░ рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЧреЛрдкреНрдп рдЫреИрди рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рд╕рд┐рд░реНрдЬрдирд╛ рд╣реБрдиреНрдЫред рдпрд╕ рд╕рдорд╛рдзрд╛рдирдХреЛ рдлрд╛рдЗрджрд╛ рдпреЛ рд╣реЛ рдХрд┐ рдпреЛ рдХреНрд░реЛрдирдорд╛ рд╢реЗрд▓ рд▓рд┐рдкрд┐ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ - рд╕рдмреИрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд░ рдмреБрдЭреНрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпреЛ рд╣реЛ рдХрд┐ рдпрд╕рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрдгрд╣рд░реВ рдмреАрдЪрдХреЛ рдЕрдиреНрддрд░рд╛рд▓рдорд╛ рдирдпрд╛рдБ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд░ рдХреЗрд╣реА рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рдЧреЛрдкреНрдп рд░реВрдкрдорд╛ рд░рд╣рдиреЗрдЫ, рдЬрд╕рд▓реЗ рдкреЛрдбрд╣рд░реВ рд╕реБрд░реВ рдЧрд░реНрди рддреНрд░реБрдЯрд┐рд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрдиреЗрдЫред

рд╢реЗрд▓ рдЕрдкрд░реЗрдЯрд░ рд╕рдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рди

рд╣рд╛рдореНрд░реЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╣реА рддрд░рд┐рдХрд╛рд▓реЗ рдХрд╛рдо рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА, рдХреНрд▓рд╛рд╕рд┐рдХ рдХреНрд░реЛрди рд▓рдиреНрдЪ рд▓рд╛рдИ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рдВрдЧ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЬрдм рдПрдХ рдиреЗрдорд╕реНрдкреЗрд╕ рдердкрд┐рдиреНрдЫ: рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдЧреЛрдкреНрдп рдмрдирд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рдХрд╕рд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рд╣реЗрд░реМрдВред

рдкрд╣рд┐рд▓реЗ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЗрд░реМрдВред рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░ рд╕рд░реНрддрд╣рд░реВрдорд╛ рд▓рд┐рдкрд┐рд╣рд░реВрд▓рд╛рдИ рд╣реБрдХ рднрдирд┐рдиреНрдЫред рдЭрдгреНрдбрд╛рдХреЛ рд╕рд╛рде рдЪрд▓рд╛рдЙрдБрджрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╣реБрдХ --config рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рд▓рд╛рдИ рдпрд╕рдХреЛ рдмрд╛рдЗрдиреНрдбрд┐рдЩрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдиреНрдЫ, рдЕрд░реНрдерд╛рддреНред рдХреБрди рдШрдЯрдирд╛рд╣рд░реВрдорд╛ рдпреЛ рд╕реБрд░реБ рдЧрд░реНрдиреБрдкрд░реНрдЫред рд╣рд╛рдореНрд░реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ onKubernetesEvent:

#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
  { "kind": "namespace",
    "event":["add"]
  }
]}
EOF
fi

рдпрд╣рд╛рдБ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ рд╣рд╛рдореА рдШрдЯрдирд╛рд╣рд░реВ рдердкреНрди рдЗрдЪреНрдЫреБрдХ рдЫреМрдВ (add) рдкреНрд░рдХрд╛рд░рдХрд╛ рд╡рд╕реНрддреБрд╣рд░реВ namespace.

рдЕрдм рддрдкрд╛рдИрд▓реЗ рдХреЛрдб рдердкреНрдиреБ рдкрд░реНрдЫ рдЬреБрди рдШрдЯрдирд╛ рдШрдЯреНрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреЗрдЫ:

#!/bin/bash
if [[ $1 == "--config" ]] ; then
  # ╨║╨╛╨╜╤Д╨╕╨│╤Г╤А╨░╤Ж╨╕╤П
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
  "event":["add"]
}
]}
EOF
else
  # ╤А╨╡╨░╨║╤Ж╨╕╤П:
  # ╤Г╨╖╨╜╨░╤В╤М, ╨║╨░╨║╨╛╨╣ namespace ╨┐╨╛╤П╨▓╨╕╨╗╤Б╤П
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  # ╤Б╨╛╨╖╨┤╨░╤В╤М ╨▓ ╨╜╤С╨╝ ╨╜╤Г╨╢╨╜╤Л╨╣ ╤Б╨╡╨║╤А╨╡╤В
  kubectl create -n ${createdNamespace} -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  ...
data:
  ...
EOF
fi

рдорд╣рд╛рди! рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рд╛рдиреЛ, рд╕реБрдиреНрджрд░ рд▓рд┐рдкрд┐ рдерд┐рдпреЛред рдпрд╕рд▓рд╛рдИ "рдкреБрдирд░реНрдЬреАрд╡рд┐рдд" рдЧрд░реНрди, рддреНрдпрд╣рд╛рдБ рджреБрдИ рдЪрд░рдгрд╣рд░реВ рдмрд╛рдБрдХреА рдЫрдиреН: рдЫрд╡рд┐ рддрдпрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реБрд░реВ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╣реБрдХрдХреЛ рд╕рд╛рде рдЫрд╡рд┐ рддрдпрд╛рд░ рдЧрд░реНрджреИ

рдпрджрд┐ рддрдкрд╛рдЗрдБ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЗрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдЖрджреЗрд╢рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ kubectl ╨╕ jqред рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд┐ рдЫрд╡рд┐рдорд╛ рдирд┐рдореНрди рдЪреАрдЬрд╣рд░реВ рд╣реБрдиреБрдкрд░реНрдЫ: рд╣рд╛рдореНрд░реЛ рд╣реБрдХ, рдПрдХ рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░ рдЬрд╕рд▓реЗ рдШрдЯрдирд╛рд╣рд░реВ рд╕реБрдиреНрдиреЗрдЫ рд░ рд╣реБрдХ рдЪрд▓рд╛рдЙрдиреЗрдЫ, рд░ рд╣реБрдХ (kubectl рд░ jq) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдЖрджреЗрд╢рд╣рд░реВред Hub.docker.com рд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рддрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдЫрд╡рд┐ рдЫ рдЬрд╕рдорд╛ shell-operator, kubectl рд░ jq рдкреНрдпрд╛рдХреЗрдЬ рдЧрд░рд┐рдПрдХреЛ рдЫред рд╕рдмреИ рдмрд╛рдБрдХреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╣реБрдХ рдердкреНрди рдЫ Dockerfile:

$ cat Dockerfile
FROM flant/shell-operator:v1.0.0-beta.1-alpine3.9
ADD namespace-hook.sh /hooks

$ docker build -t registry.example.com/my-operator:v1 . 
$ docker push registry.example.com/my-operator:v1

рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ

рд╣реБрдХрд▓рд╛рдИ рдлреЗрд░рд┐ рд╣реЗрд░реМрдВ рд░ рдпрд╕ рдкрдЯрдХ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдХреБрди рдХрд╛рд░реНрдпрд╣рд░реВ рд░ рдХреБрди рд╡рд╕реНрддреБрд╣рд░реВрд╕рдБрдЧ рдпрд╕рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН:

  1. рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдиреНрдЫ;
  2. рдирд╛рдорд╕реНрдерд╛рдирдорд╛ рдПрдЙрдЯрд╛ рдЧреЛрдкреНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ рдЬрд╣рд╛рдБ рдпреЛ рд╕реБрд░реВ рдЧрд░рд┐рдПрдХреЛ рдЫред

рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рдкреЛрдб рдЬрд╕рдорд╛ рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐ рд╕реБрд░реБ рд╣реБрдиреЗрдЫ рдпреА рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рд╣реБрдиреБрдкрд░реНрдЫред рдпреЛ рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЕрдиреБрдорддрд┐ ClusterRole рд░ ClusterRoleBinding рдХреЛ рд░реВрдкрдорд╛ рдЧрд░рд┐рдиреБ рдкрд░реНрдЫ, рдХрд┐рдирднрдиреЗ рд╣рд╛рдореА рд╕рдореНрдкреВрд░реНрдг рдХреНрд▓рд╕реНрдЯрд░рдмрд╛рдЯ рд╡рд╕реНрддреБрд╣рд░реВрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдЫреМрдВред

YAML рдорд╛ рдЕрдиреНрддрд┐рдо рд╡рд┐рд╡рд░рдг рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: monitor-namespaces-acc

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: monitor-namespaces
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list", "create", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: monitor-namespaces
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: monitor-namespaces
subjects:
  - kind: ServiceAccount
    name: monitor-namespaces-acc
    namespace: example-monitor-namespaces

рддрдкрд╛рдИрд▓реЗ рд╕рд╛рдзрд╛рд░рдг рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрдХреЛ рд░реВрдкрдорд╛ рднреЗрд▓рд╛ рдЧрд░рд┐рдПрдХреЛ рдЫрд╡рд┐ рд╕реБрд░реВ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1
      serviceAccountName: monitor-namespaces-acc

рд╕реБрд╡рд┐рдзрд╛рдХреЛ рд▓рд╛рдЧрд┐, рдПрдЙрдЯрд╛ рдЫреБрдЯреНрдЯреИ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ рдЬрд╣рд╛рдБ рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░ рд╕реБрд░реВ рдЧрд░рд┐рдиреЗрдЫ рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рдХрдЯрд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░рд┐рдиреЗрдЫ:

$ kubectl create ns example-monitor-namespaces
$ kubectl -n example-monitor-namespaces apply -f rbac.yaml
$ kubectl -n example-monitor-namespaces apply -f deployment.yaml

рдпрддрд┐ рдорд╛рддреНрд░ рд╣реЛ: рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рд▓реЗ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫ, рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдиреЗрдЫ рд░ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрд╛ рд╣реБрдХ рдЪрд▓рд╛рдЙрдиреЗрдЫред

рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рдкрд░рд┐рдЪрдп рджрд┐рдБрджреИ: Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рднрдпреЛ

рддреНрдпрд╕реИрд▓реЗ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╢реЗрд▓ рд▓рд┐рдкрд┐ Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдкрд░реЗрдЯрд░ рдорд╛ рдкрд░рд┐рдгрдд рднрдпреЛ рд░ рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫред рд░ рдпреЛ рд╕рдмреИ рдЧреЛрд▓рд╛рдЩрдорд╛ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд┐рдирд╛:

рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рдкрд░рд┐рдЪрдп рджрд┐рдБрджреИ: Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рднрдпреЛ

рдпрд╕ рд╡рд┐рд╖рдпрдорд╛ рдЕрд░реНрдХреЛ рджреГрд╖реНрдЯрд╛рдиреНрдд рдЫ ...рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рдкрд░рд┐рдЪрдп рджрд┐рдБрджреИ: Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рднрдпреЛ

рд╣рд╛рдореА рдирд┐рдореНрди рдкреНрд░рдХрд╛рд╢рдирд╣рд░реВ рдордзреНрдпреЗ рдПрдХрдорд╛ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рдпрд╕рдХреЛ рдЕрд░реНрде рдкреНрд░рдХрдЯ рдЧрд░реНрдиреЗрдЫреМрдВред

рдлрд┐рд▓реНрдЯрд░рд┐рдЩ

рдЯреНрд░реНрдпрд╛рдХрд┐рдЩ рд╡рд╕реНрддреБрд╣рд░реВ рд░рд╛рдореНрд░реЛ рдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рдкреНрд░рд╛рдпрдГ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХреЗрд╣рд┐ рд╡рд╕реНрддреБ рдЧреБрдгрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджреИ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдорд╛ рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╡рд╛ рд╡рд╕реНрддреБ рд▓реЗрдмрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиред

рдЬрдм рдШрдЯрдирд╛ рдЖрдЗрдкреБрдЧреНрдЫ, рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рд▓реЗ рд╡рд╕реНрддреБрдХреЛ JSON manifest рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫред рд╣рд╛рдореА рдпрд╕ JSON рдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреЗ рдЧреБрдгрд╣рд░реВ рдЪрдпрди рдЧрд░реНрди рд░ рд╣реБрдХ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдЫреМрдВ рдорд╛рддреНрд░ рдЬрдм рддрд┐рдиреАрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫрдиреНред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдлрд┐рд▓реНрдб рдЫ jqFilter, рдЬрд╣рд╛рдБ рддрдкрд╛рдИрдВрд▓реЗ JSON manifest рдорд╛ рд▓рд╛рдЧреВ рд╣реБрдиреЗ jq рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рд╡рд╕реНрддреБрд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рд▓реЗрдмрд▓ рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреА, рддрдкрд╛рдИрд▓реЗ рдлрд┐рд▓реНрдб рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ labels рдореИрджрд╛рди рдмрд╛рд╣рд┐рд░ metadataред рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдпрд╕реНрддреЛ рд╣реБрдиреЗрдЫ:

cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "deployment",
  "event":["update"],
  "jqFilter": ".metadata.labels"
}
]}
EOF

рдпреЛ jqFilter рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд▓реЗ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрдХреЛ рд▓рд╛рдореЛ JSON рдкреНрд░рдХрдЯрд▓рд╛рдИ рд▓реЗрдмрд▓рд╣рд░реВрд╕рд╣рд┐рдд рдЫреЛрдЯреЛ JSON рдорд╛ рдкрд░рд┐рдгрдд рдЧрд░реНрдЫ:

рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рдкрд░рд┐рдЪрдп рджрд┐рдБрджреИ: Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рднрдпреЛ

shell-operator рд▓реЗ рд╣реБрдХ рдЪрд▓рд╛рдЙрдиреЗрдЫ рдЬрдм рдпреЛ рдЫреЛрдЯреЛ JSON рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫ, рд░ рдЕрдиреНрдп рдЧреБрдгрд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрд▓рд╛рдИ рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░рд┐рдиреЗрдЫред

рд╣реБрдХ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рдиреНрджрд░реНрдн

рд╣реБрдХ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдШрдЯрдирд╛рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ - рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХреБрдмреЗрд░рдиреЗрдЯрдмрд╛рдЯ рдШрдЯрдирд╛рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ реи рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд░ реи рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ:

{"onKubernetesEvent":[
  {"name":"OnCreatePod",
  "kind": "pod",
  "event":["add"]
  },
  {"name":"OnModifiedNamespace",
  "kind": "namespace",
  "event":["update"],
  "jqFilter": ".metadata.labels"
  }
],
"schedule": [
{ "name":"every 10 min",
  "crontab":"* */10 * * * *"
}, {"name":"on Mondays at 12:10",
"crontab": "* 10 12 * * 1"
]}

рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдбрд┐рдЧреНрд░реЗрд╢рди: рд╣реЛ, рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рд▓реЗ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ crontab рд╢реИрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯред рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдХрд╛рдЧрдЬрд╛рдд.

рд╣реБрдХ рдХрд┐рди рд╕реБрд░реБ рднрдпреЛ рднрдиреЗрд░ рдЫреБрдЯреНрдпрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐, рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫ рд░ рд╣реБрдХрдорд╛ рдЪрд▓реНрдиреЗ рдмрд╛рдЯреЛрдорд╛ рдпрд╕рд▓рд╛рдИ рдкрд╛рд╕ рдЧрд░реНрдЫред BINDING_CONTEXT_TYPEред рдлрд╛рдЗрд▓рд▓реЗ рд╣реБрдХ рдЪрд▓рд╛рдЙрдиреБрдХреЛ рдХрд╛рд░рдгрдХреЛ JSON рд╡рд┐рд╡рд░рдг рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдкреНрд░рддреНрдпреЗрдХ 10 рдорд┐рдиреЗрдЯ рд╣реБрдХ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рд╕рдВрдЧ рдЪрд▓реНрдиреЗрдЫ:

[{ "binding": "every 10 min"}]

... рд░ рд╕реЛрдордмрд╛рд░ рдпреЛ рдпреЛ рд╕рдВрдЧ рд╕реБрд░реБ рд╣реБрдиреЗрдЫ:

[{ "binding": "every 10 min"}, { "binding": "on Mondays at 12:10"}]

рдЧрд░реНрди onKubernetesEvent рддреНрдпрд╣рд╛рдБ рдердк JSON рдЯреНрд░рд┐рдЧрд░рд╣рд░реВ рд╣реБрдиреЗрдЫ, рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рд╡рд╕реНрддреБрдХреЛ рд╡рд┐рд╡рд░рдг рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ:

[
 {
 "binding": "onCreatePod",
 "resourceEvent": "add",
 "resourceKind": "pod",
 "resourceName": "foo",
 "resourceNamespace": "bar"
 }
]

рдлрд┐рд▓реНрдбрд╣рд░реВрдХреЛ рд╕рд╛рдордЧреНрд░реА рддрд┐рдиреАрд╣рд░реВрдХреЛ рдирд╛рдордмрд╛рдЯ рдмреБрдЭреНрди рд╕рдХрд┐рдиреНрдЫ, рд░ рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдкрдвреНрди рд╕рдХрд┐рдиреНрдЫ рдХрд╛рдЧрдЬрд╛рддред рдХреНрд╖реЗрддреНрд░рдмрд╛рдЯ рд╕реНрд░реЛрдд рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг resourceName jq рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдкрд╣рд┐рд▓реЗ рдиреИ рд╣реБрдХрдорд╛ рджреЗрдЦрд╛рдЗрдПрдХреЛ рдЫ рдЬрд╕рд▓реЗ рд░рд╣рд╕реНрдпрд╣рд░реВ рдкреНрд░рддрд┐рдХреГрддрд┐ рдЧрд░реНрджрдЫ:

jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH

рддрдкрд╛рдИрдВ рд╕рдорд╛рди рддрд░рд┐рдХрд╛рдорд╛ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдХреЗ рдЕрд░реНрдХреЛ рдЫ?

рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрдгреНрдбрд╛рд░рдорд╛, рдорд╛ / рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рд╣рд░реВ, рддреНрдпрд╣рд╛рдБ рд╣реБрдХрд╣рд░реВрдХреЛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдЫрдиреН рдЬреБрди рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдЪрд▓реНрди рддрдпрд╛рд░ рдЫрдиреНред рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рд╣реБрдХрд╣рд░реВ рд▓реЗрдЦреНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЖрдзрд╛рд░рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдЫ - рдЙрдкрд▓рдмреНрдз рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЦрдгреНрдбрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ рдореЗрдЯреНрд░рд┐рдХреНрд╕.

рддрдкрд╛рдИрд▓реЗ рдЕрдиреБрдорд╛рди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░ Go рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ рд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдЗрдЬрд╛рдЬрддрдкрддреНрд░ (Apache 2.0) рдЕрдиреНрддрд░реНрдЧрдд рд╡рд┐рддрд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫред рд╣рд╛рдореА рдХреБрдиреИ рдкрдирд┐ рд╡рд┐рдХрд╛рд╕ рд╕рд╣рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЖрднрд╛рд░реА рд╣реБрдиреЗрдЫреМрдВ GitHub рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛: рд░ рддрд╛рд░рд╛рд╣рд░реВ, рд░ рдореБрджреНрджрд╛рд╣рд░реВ, рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВред

рдЧреЛрдкреНрдпрддрд╛рдХреЛ рдкрд░реНрджрд╛ рдЙрдард╛рдЙрдБрджреИ, рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкрдирд┐ рд╕реВрдЪрд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВ рдХрд┐ рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░ рд╣реЛ рд╕рд╛рдиреЛ рд╣рд╛рдореНрд░реЛ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдЕрдВрд╢ рдЬрд╕рд▓реЗ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реНрдерд╛рдкрд┐рдд рдПрдб-рдЕрдирд╣рд░реВ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд░рд╛рдЦреНрди рд░ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрди рд╕рдХреНрдЫред рдпреЛ рдкреНрд░рдгрд╛рд▓реА рдмрд╛рд░реЗ рдердк рдкрдвреНрдиреБрд╣реЛрд╕реН рднрдиреНрдпреЛ рд╢рд╛рдмреНрджрд┐рдХ рд╕реЛрдордмрд╛рд░ рд╕реЗрдиреНрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдорд╛ HighLoad++ 2019 рдорд╛ - рд╣рд╛рдореА рдЫрд┐рдЯреНрдЯреИ рдпрд╕ рд░рд┐рдкреЛрд░реНрдЯрдХреЛ рднрд┐рдбрд┐рдпреЛ рд░ рдЯреНрд░рд╛рдиреНрд╕рдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВред

рд╣рд╛рдореАрд╕рдБрдЧ рдпреЛ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдмрд╛рдБрдХреА рднрд╛рдЧ рдЦреЛрд▓реНрдиреЗ рдпреЛрдЬрдирд╛ рдЫ: рдПрдбрдЕрди-рдЕрдкрд░реЗрдЯрд░ рд░ рд╣реБрдХ рд░ рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдХреЛ рд╣рд╛рдореНрд░реЛ рд╕рдВрдЧреНрд░рд╣ред рд╡реИрд╕реЗ, addon-operator рдкрд╣рд┐рд▓реЗ рдиреИ рдЫ GitHub рдорд╛ рдЙрдкрд▓рдмреНрдз рдЫ, рддрд░ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рдЧрдЬрд╛рдд рдЕрдЭреИ рдмрд╛рдЯреЛрдорд╛ рдЫред рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдХреЛ рд╕рдВрдЧреНрд░рд╣рдХреЛ рд░рд┐рд▓реАрдЬ рдЧрд░реНрдореАрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред

рд░рд╣рдиреБрд╣реЛрд╕реН!

PS

рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:

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

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