рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкрд░рд┐рдЪрдп: рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдмрдирд╛рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд▓реЗрдЦ рдЖ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдЦреБрдж рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдСрдкрд░реЗрдЯрд░ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ ред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╣рдорд╛рд░рд╛ рдУрдкрди рд╕реЛрд░реНрд╕-рд╕рдорд╛рдзрд╛рди, рдЬреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдПрдХ рд╕реБрдкрд░-рдЖрд╕рд╛рди рд╕реНрддрд░ рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ - рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ!

рдХреНрдпреЛрдВ?


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



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

15 рдорд┐рдирдЯ рдореЗрдВ рдСрдкрд░реЗрдЯрд░


рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдЧрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛: рдбреЙрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╣рд╕реНрдп рдХреА рдирдХрд▓ рдХрд░рдирд╛ред

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

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


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

рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рди


рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рд╕рд┐рдХ рдХреНрд░реЛрди рд▓реЙрдиреНрдЪ рдХреЛ рдЗрд╡реЗрдВрдЯ рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рд▓реЙрдиреНрдЪ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд░рд╣рд╕реНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

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

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

рдпрд╣ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рдХрд╛рд░ namespace рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ ( add ) рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

рдЕрдм рдЖрдкрдХреЛ рдЙрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдШрдЯрдирд╛ рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 #!/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 рдФрд░ kubectl jq ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рд╣рдорд╛рд░рд╛ рд╣реБрдХ, рдПрдХ рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдЬреЛ рдШрдЯрдирд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ рдФрд░ рд╣реБрдХ рдХреЛ рдЪрд▓рд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА рд╣реБрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдорд╛рдВрдб (рдХреБрдмреНрд▓реЗрдЯ рдФрд░ рдЬрдХ)ред Hub.docker.com рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддреИрдпрд╛рд░ рдЫрд╡рд┐ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░, рдХреБрдмреЗрдХрдЯреЗрд▓ рдФрд░ 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. рдЬрд╣рд╛рдБ рдпрд╣ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдПрдХ рд░рд╣рд╕реНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдкреЙрдб рдореЗрдВ рд╣рдорд╛рд░реА рдЫрд╡рд┐ рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рдПрдЧреА, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ ServiceAccount рдмрдирд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреБрдорддрд┐ рдХреНрд▓рд╕реНрдЯрд░рд╕реНрдЯрд░ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░рд░реЛрд▓рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреНрд▓рд╕реНрдЯрд░ рднрд░ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

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 


рдпрд╣ рд╕рдм рд╣реИ: рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рд╢реБрд░реВ рд╣реЛрдЧрд╛, рдиреЗрдорд╕реНрдкреЗрд╕ рдирд┐рд░реНрдорд╛рдг рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реБрдХ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред



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



рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд╛рдВрдд рд╣реИ ...


рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдкреНрд░рдХрдЯ рдХрд░реЗрдВрдЧреЗред рдЕрджреНрдпрддрди (1 рдордИ, 2019): " рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ (рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдкреЛрд░реНрдЯ) рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ " рджреЗрдЦреЗрдВред

рдЫрд╛рдирдиреЗ


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

рдЬрдм рдХреЛрдИ рдШрдЯрдирд╛ рдЖрддреА рд╣реИ, рддреЛ рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ JSON рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ JSON рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣реБрдХ рддрднреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдмрджрд▓рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, jqFilter рдлрд╝реАрд▓реНрдб jqFilter рдХреА jqFilter , рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ JSON рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ JSON рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

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

JqFilter рдореЗрдВ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рддреИрдирд╛рддреА рдХреЗ рд▓рдВрдмреЗ JSON рдХреЛ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рд▓рдШреБ JSON рдореЗрдВ рдкреНрд░рдХрдЯ рдХрд░рддреА рд╣реИ:



рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реБрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ рдЬрдм рдпрд╣ рдЫреЛрдЯрд╛ JSON рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдЧреБрдгреЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣реБрдХ рд▓реЙрдиреНрдЪ рд╕рдВрджрд░реНрдн


рд╣реБрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрдкрдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП 2 рд╡рд┐рдХрд▓реНрдк рдФрд░ 2 рд╢реЗрдбреНрдпреВрд▓:

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

рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░: рд╣рд╛рдВ, рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдХреЙрдиреНрдЯреИрдм-рд╕реНрдЯрд╛рдЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╣реБрдХ рдХреНрдпреЛрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ BINDING_CONTEXT_TYPE рдЪрд░ рдореЗрдВ BINDING_CONTEXT_TYPE рддрдХ рд▓реЗ 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" } ] 

рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЙрдирдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ - рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Jq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рд╕реЛрд░реНрд╕рдиреЗрдо рдлрд╝реАрд▓реНрдб рд╕реЗ рд░рд┐рд╕реЛрд░реНрд╕ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реБрдХ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд░рд╣рд╕реНрдпреЛрдВ рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИ:

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

рдЗрд╕реА рддрд░рд╣, рдЖрдк рд╢реЗрд╖ рдлрд╝реАрд▓реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


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

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ - рдЙрдкрд▓рдмреНрдз рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред

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

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

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

рджреЗрдЦрддреЗ рд░рд╣реЛ!

рдкреБрдирд╢реНрдЪ


рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рднреА рдкрдврд╝реЗрдВ:

Source: https://habr.com/ru/post/hi447442/


All Articles