рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рд▓реЗрдЦрд╣рд░реВ рднрдЗрд╕рдХреЗрдХрд╛ рдЫрдиреН
рдХрд┐рди?
рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рдХреЛ рд╡рд┐рдЪрд╛рд░ рдПрдХрджрдо рд╕рд░рд▓ рдЫ: 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
рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ
рд╣реБрдХрд▓рд╛рдИ рдлреЗрд░рд┐ рд╣реЗрд░реМрдВ рд░ рдпрд╕ рдкрдЯрдХ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдХреБрди рдХрд╛рд░реНрдпрд╣рд░реВ рд░ рдХреБрди рд╡рд╕реНрддреБрд╣рд░реВрд╕рдБрдЧ рдпрд╕рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН:
- рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдиреНрдЫ;
- рдирд╛рдорд╕реНрдерд╛рдирдорд╛ рдПрдЙрдЯрд╛ рдЧреЛрдкреНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ рдЬрд╣рд╛рдБ рдпреЛ рд╕реБрд░реВ рдЧрд░рд┐рдПрдХреЛ рдЫред
рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рдкреЛрдб рдЬрд╕рдорд╛ рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐ рд╕реБрд░реБ рд╣реБрдиреЗрдЫ рдпреА рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рд╣реБрдиреБрдкрд░реНрдЫред рдпреЛ рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЕрдиреБрдорддрд┐ 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 рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдкрд░реЗрдЯрд░ рдорд╛ рдкрд░рд┐рдгрдд рднрдпреЛ рд░ рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫред рд░ рдпреЛ рд╕рдмреИ рдЧреЛрд▓рд╛рдЩрдорд╛ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд┐рдирд╛:
рдпрд╕ рд╡рд┐рд╖рдпрдорд╛ рдЕрд░реНрдХреЛ рджреГрд╖реНрдЯрд╛рдиреНрдд рдЫ ...
рд╣рд╛рдореА рдирд┐рдореНрди рдкреНрд░рдХрд╛рд╢рдирд╣рд░реВ рдордзреНрдпреЗ рдПрдХрдорд╛ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рдпрд╕рдХреЛ рдЕрд░реНрде рдкреНрд░рдХрдЯ рдЧрд░реНрдиреЗрдЫреМрдВред
рдлрд┐рд▓реНрдЯрд░рд┐рдЩ
рдЯреНрд░реНрдпрд╛рдХрд┐рдЩ рд╡рд╕реНрддреБрд╣рд░реВ рд░рд╛рдореНрд░реЛ рдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рдкреНрд░рд╛рдпрдГ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХреЗрд╣рд┐ рд╡рд╕реНрддреБ рдЧреБрдгрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджреИ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдорд╛ рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╡рд╛ рд╡рд╕реНрддреБ рд▓реЗрдмрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиред
рдЬрдм рдШрдЯрдирд╛ рдЖрдЗрдкреБрдЧреНрдЫ, рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░рд▓реЗ рд╡рд╕реНрддреБрдХреЛ JSON manifest рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫред рд╣рд╛рдореА рдпрд╕ JSON рдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреЗ рдЧреБрдгрд╣рд░реВ рдЪрдпрди рдЧрд░реНрди рд░ рд╣реБрдХ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдЫреМрдВ рдорд╛рддреНрд░ рдЬрдм рддрд┐рдиреАрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫрдиреНред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдлрд┐рд▓реНрдб рдЫ jqFilter
, рдЬрд╣рд╛рдБ рддрдкрд╛рдИрдВрд▓реЗ JSON manifest рдорд╛ рд▓рд╛рдЧреВ рд╣реБрдиреЗ jq рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рд╡рд╕реНрддреБрд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рд▓реЗрдмрд▓ рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреА, рддрдкрд╛рдИрд▓реЗ рдлрд┐рд▓реНрдб рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ labels
рдореИрджрд╛рди рдмрд╛рд╣рд┐рд░ metadata
ред рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдпрд╕реНрддреЛ рд╣реБрдиреЗрдЫ:
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "deployment",
"event":["update"],
"jqFilter": ".metadata.labels"
}
]}
EOF
рдпреЛ jqFilter рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд▓реЗ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрдХреЛ рд▓рд╛рдореЛ JSON рдкреНрд░рдХрдЯрд▓рд╛рдИ рд▓реЗрдмрд▓рд╣рд░реВрд╕рд╣рд┐рдд рдЫреЛрдЯреЛ JSON рдорд╛ рдкрд░рд┐рдгрдд рдЧрд░реНрдЫ:
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) рдЕрдиреНрддрд░реНрдЧрдд рд╡рд┐рддрд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫред рд╣рд╛рдореА рдХреБрдиреИ рдкрдирд┐ рд╡рд┐рдХрд╛рд╕ рд╕рд╣рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЖрднрд╛рд░реА рд╣реБрдиреЗрдЫреМрдВ
рдЧреЛрдкреНрдпрддрд╛рдХреЛ рдкрд░реНрджрд╛ рдЙрдард╛рдЙрдБрджреИ, рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкрдирд┐ рд╕реВрдЪрд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВ рдХрд┐ рд╢реЗрд▓-рдЕрдкрд░реЗрдЯрд░ рд╣реЛ рд╕рд╛рдиреЛ рд╣рд╛рдореНрд░реЛ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдЕрдВрд╢ рдЬрд╕рд▓реЗ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реНрдерд╛рдкрд┐рдд рдПрдб-рдЕрдирд╣рд░реВ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд░рд╛рдЦреНрди рд░ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрди рд╕рдХреНрдЫред рдпреЛ рдкреНрд░рдгрд╛рд▓реА рдмрд╛рд░реЗ рдердк рдкрдвреНрдиреБрд╣реЛрд╕реН
рд╣рд╛рдореАрд╕рдБрдЧ рдпреЛ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдмрд╛рдБрдХреА рднрд╛рдЧ рдЦреЛрд▓реНрдиреЗ рдпреЛрдЬрдирд╛ рдЫ: рдПрдбрдЕрди-рдЕрдкрд░реЗрдЯрд░ рд░ рд╣реБрдХ рд░ рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдХреЛ рд╣рд╛рдореНрд░реЛ рд╕рдВрдЧреНрд░рд╣ред рд╡реИрд╕реЗ, addon-operator рдкрд╣рд┐рд▓реЗ рдиреИ рдЫ
рд░рд╣рдиреБрд╣реЛрд╕реН!
PS
рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:
- ┬л
Kubernetes рдХреЛ рд▓рд╛рдЧреА рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ: рд╕реНрдЯреЗрдЯрдлреБрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдХрд╕рд░реА рдЪрд▓рд╛рдЙрдиреЗ ┬╗; - ┬л
Golang рдорд╛ Kubernetes рдХреЛ рд▓рд╛рдЧреА рдПрдХ рдЕрдкрд░реЗрдЯрд░ рд▓реЗрдЦреНрджреИ ┬╗; - ┬л
Grafana - Statusmap рдкреНрдпрд╛рдирд▓рдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рдкреНрд▓рдЧрдЗрди рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрджреИ ┬╗; - ┬л
рд▓рдЧрд╣рд╛рдЙрд╕ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрджреИ - Kubernetes рдорд╛ рд▓рдЧрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкреНрд░рдгрд╛рд▓реА ┬╗; - ┬л
рд╣рд╛рдореА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдкрдорд╛ рдбреЗрдк рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрдЫреМрдВ - CI/CD рдорд░реНрдорддрдХрд╛ рд▓рд╛рдЧрд┐ DevOps рдЙрдкрдпреЛрдЧрд┐рддрд╛ "ред
рд╕реНрд░реЛрдд: www.habr.com