
рдЬреИрд╕рд╛ рдХрд┐ рд░рдбрд╛рд░ рдЯреЗрдХреНрдиреЙрд▓реЙрдЬреА рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓рдореЛрдбрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдУрд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рд╣рдорд╛рд░реА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реЗрд╡рд╛рдПрдБ рд╣реЗрд▓реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рддреИрдирд╛рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг 99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред 1% рддрдм рд░рд╣рддрд╛ рд╣реИ рдЬрдм рдорд╛рдирдХ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдмреИрдХрдЕрдк рдпрд╛ рд╕реЗрд╡рд╛ рдЕрджреНрдпрддрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдкрд░реЗрдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдореИрдВ - рдЧреНрд░рд┐рдЧреЛрд░реА рдорд┐рдЦрд╛рд▓реНрдХрд┐рди, рд▓рдореЛрдбрд╛ рдореЗрдВ рдЖрд░ рдПрдВрдб рдбреА рдЯреАрдо рдХреЗ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ - рдЙрди рдкрд╛рдареЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рд╕рдВрдЪрд╛рд▓рдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ K8s рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд╕реЗ рд╕реАрдЦрд╛ рдерд╛ред
рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣реИ?
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛ рд╣реИред рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдореБрдЦреНрдп рд╕рд╛рд░ рд╡рд╕реНрддреБрдПрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╣реИрдВред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреЙрдб рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд░реЗрдкреНрд▓рд┐рдХрд╛рд╕реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреЙрдб рдХреЛ рдХрд┐рддрдиреЗ рдкреНрд░рддрд┐рдХреГрддрд┐рдпрд╛рдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдпрдВрддреНрд░рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддрд┐рдХреГрддрд┐рдХрдВрдЯреНрд░реЛрд▓рд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЙрдб рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред рдирдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рдорджрдж рд╕реЗ, рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдирд╛, рд╡рд┐рдлрд▓рддрд╛ рд╕реЗ рдЙрдмрд░рдирд╛ рдпрд╛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ ред
рдПрдХ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдХреА рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреЛрд░реЛрд╕ рдЯреАрдо рдиреЗ 2016 рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣реА рд╣реИред рдЖрдк рдХреБрдмреЗрдбреЗрдХреНрд╕ рдкрд░ рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, (100 рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд╕рд╛рде рд╣реА рд╕рд╛рде рдСрдкрд░реЗрдЯрд░рд╣рдм рдкрд░ред рдСрдкрд░реЗрдЯрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП 3 рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрдХрд░рдг рд╣реИрдВ: рдХреБрдмреЗрдмреБрдЗрд╕реНрдЯрд░ , рдСрдкрд░реЗрдЯрд░ рдПрд╕рдбреАрдХреЗ рдФрд░ рдореЗрдЯрд╛рдХрдВрдЯреНрд░реЛрд▓рд░ ред рд▓рдореЛрдбрд╛ рдореЗрдВ рд╣рдо рдСрдкрд░реЗрдЯрд░ рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рд╕рдВрдЪрд╛рд▓рдХ рдПрд╕.рдбреА.рдХреЗ.

рдСрдкрд░реЗрдЯрд░ SDK рдСрдкрд░реЗрдЯрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдСрдкрд░реЗрдЯрд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдкреНрд░рдмрдВрдзрдХ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдореАрдЯрд░рд┐рдВрдЧред
- рдСрдкрд░реЗрдЯрд░ рдПрд╕рдбреАрдХреЗ рдирд┐рдпрдВрддреНрд░рдХ-рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рд╣реИ , рдЬреЛ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ (рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ-рдЧреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИ), рдИ 2 рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ + рдлреНрд░реЗрдорд╡рд░реНрдХред
- рдСрдкрд░реЗрдЯрд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдкреНрд░рдмрдВрдзрдХ - рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛; рдЬрдм рдСрдкрд░реЗрдЯрд░ рдЬрд╝реЛрдВрдмреА рдореЛрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд░реЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
- рдСрдкрд░реЗрдЯрд░ рдореАрдЯрд░рд┐рдВрдЧ - рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдХрд╛рдо рдкрд░ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдФрд░, рдЬрдм рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛ рдХреА рддреИрдирд╛рддреА рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдкреВрд░реНрдг рдирдореВрдирд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рдПрдХ рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ:
operator-sdk new config-monitor
рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдЖрд╡рдВрдЯрд┐рдд рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреВрд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рднреАрддрд░ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред cluster-wide
рдСрдкрд░реЗрдЯрд░ --cluster-scoped
рдЬреЛрдбрд╝рдХрд░ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдмрдирд╛рдИ рдЧрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреА:
- cmd - рдореЗрдВ
main package
, рдЬрд┐рд╕рдореЗрдВ Manager
рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; - рддреИрдирд╛рдд - рдСрдкрд░реЗрдЯрд░, рд╕реАрдЖрд░рдбреА рдФрд░ рдЖрд░рдмреАрдПрд╕реА рдСрдкрд░реЗрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рдШреЛрд╖рдгрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ;
- pkg - рдпрд╣рд╛рдБ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдХреЛрдб рд╣реЛрдЧрд╛ред
cmd/manager/main.go
рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ cmd/manager/main.go
рдлрд╝рд╛рдЗрд▓ рд╣реИред
рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ // Become the leader before proceeding err = leader.Become(ctx, "config-monitor-lock") if err != nil { log.Error(err, "") os.Exit(1) } // Create a new Cmd to provide shared dependencies and start components mgr, err := manager.New(cfg, manager.Options{ Namespace: namespace, MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort), }) ... // Setup Scheme for all resources if err := apis.AddToScheme(mgr.GetScheme()); err != nil { log.Error(err, "") os.Exit(1) } // Setup all Controllers if err := controller.AddToManager(mgr); err != nil { log.Error(err, "") os.Exit(1) } ... // Start the Cmd if err := mgr.Start(signals.SetupSignalHandler()); err != nil { log.Error(err, "Manager exited non-zero") os.Exit(1) }
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ: err = leader.Become(ctx, "config-monitor-lock")
- рдПрдХ рдиреЗрддрд╛ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ, рдирд╛рдорд╕реНрдерд╛рди / рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдПрдХ рдмрдпрд╛рди рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХреНрд░рд┐рдп рдЙрджрд╛рд╣рд░рдг рдХреА рдЬрд░реВрд░рдд рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдСрдкрд░реЗрдЯрд░ SDK рдЬреАрд╡рди рд░рдгрдиреАрддрд┐ рдХреЗ рд▓рд┐рдП рд▓реАрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкрд╣рд▓рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рддрдм рддрдХ рд▓реАрдбрд░ рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗ рд╣рдЯрд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ред
рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рдж рдиреЗрддрд╛ рдирд┐рдпреБрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдирдП Manager
рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - mgr, err := manager.New(...)
ред рдЙрдирдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
err := apis.AddToScheme(mgr.GetScheme())
- рдирдИ рд╕рдВрд╕рд╛рдзрди рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг;err := controller.AddToManager(mgr)
- рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг;err := mgr.Start(signals.SetupSignalHandler())
- рдирд┐рдпрдВрддреНрд░рдХ рд▓реЙрдиреНрдЪ рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВред
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рди рддреЛ рдирдП рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ, рди рд╣реА рдирд┐рдпрдВрддреНрд░рдХред рдЖрдк рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рд╕рдВрд╕рд╛рдзрди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
operator-sdk add api --api-version=services.example.com/v1alpha1 --kind=MonitoredService
рдпрд╣ рдХрдорд╛рдВрдб MonitoredService
рд╕реНрдХреАрдорд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ pkg/apis
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдЧрд╛, рд╕рд╛рде рд╣реА deploy/crds
crds рдореЗрдВ CRD
рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде yaml рдХрд░реЗрдЧрд╛ред рд╕рднреА рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ monitoredservice_types.go
рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ monitoredservice_types.go
рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЙрдиреАрдЯрд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдПServiceSpec рд╕рдВрд╕рд╛рдзрди рдХреА рдЗрдЪреНрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрд╕рд╛рдзрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдпрд╛рдореНрд▓ рдореЗрдВ рдХреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, Size
рдлрд╝реАрд▓реНрдб рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, ConfigRepo
рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХрд╣рд╛рдБ рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред MonitoredServiceStatus
, рд╕рдВрд╕рд╛рдзрди рдХреА рджреЗрдЦреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреЙрдбреНрд╕ рдХреЗ рдирд╛рдо рдФрд░ рд╡рд░реНрддрдорд╛рди spec
рдкреЙрдбреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
operator-sdk generate k8s
рдпрд╣ deploy/crds
рдореЗрдВ CRD
рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░реЗрдЧрд╛ред
рдЕрдм рд╣рдорд╛рд░реЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдХ:
operator-sdk add controller --api-version=services.example.com/v1alpha1 --kind=Monitor
monitor_controller.go
рдлрд╝рд╛рдЗрд▓ pkg/controller
monitor_controller.go
рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рддрд░реНрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдХрд╛рд╕
рдирд┐рдпрдВрддреНрд░рдХ рдСрдкрд░реЗрдЯрд░ рдХреА рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЗрдХрд╛рдИ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рдирд┐рдпрдВрддреНрд░рдХ рд╣реИрдВ:
- рдореЙрдирд┐рдЯрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗрд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ;
- рдирд╡реАрдиреАрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗрд╡рд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдореВрд▓ рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рд▓реВрдк рд╣реИ, рдпрд╣ рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрддрд╛рд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдПрдХ рдирдпрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ add
рдореЗрдердб рдореЗрдВ рдмрдирд╛рдпрд╛ рдФрд░ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
c, err := controller.New("monitor-controller", mgr, controller.Options{Reconciler: r})
Watch
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕реЗ рдПрдХ рдирдП рд╕рдВрд╕рд╛рдзрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдпрд╛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ MonitoredService
рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╡рд┐рд╢реЗрд╖ рдЕрджреНрдпрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ:
err = c.Watch(&source.Kind{Type: &servicesv1alpha1.MonitoredService{}}, &handler.EnqueueRequestForObject{}, common.CreateOrUpdateSpecPredicate)
рдШрдЯрдирд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ src
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА predicates
рдХрд░рддрд╛ рд╣реИред src
рдЯрд╛рдЗрдк Source
рдХреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
Informer
- рд╕рдордп-рд╕рдордп рдкрд░ рдлрд┐рд▓реНрдЯрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП apiserver
рдХреЛ apiserver
рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдРрд╕реА рдХреЛрдИ рдШрдЯрдирд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред controller-runtime
рдпрд╣ client-go
SharedIndexInformer
рд╕реЗ SharedIndexInformer
рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИредKind
рднреА SharedIndexInformer
рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди Informer
рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ (рдирд┐рдЧрд░рд╛рдиреА рд╕рдВрд╕рд╛рдзрди рдХреА рдпреЛрдЬрдирд╛) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдореБрдЦрдмрд┐рд░ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИредChannel
- chan event.GenericEvent
рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ chan event.GenericEvent
, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
redicates
рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ Predicate
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UpdateEvent
рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ UpdateEvent
рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрд╕рд╛рдзрди spec
рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдЧрдП рдереЗред
рдЬрдм рдХреЛрдИ рдШрдЯрдирд╛ рдЖрддреА рд╣реИ, рддреЛ рдПрдХ EventHandler
рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ - Watch
рд╡рд┐рдзрд┐ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ - рдЬреЛ рдЙрд╕ рдШрдЯрдирд╛ рдХреЛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдЬреЛ рд░реАрдХреЙрдиреНрд╕реАрд▓рд░ рдХреЛ рдЙрдореНрдореАрдж рд╣реИ:
EnqueueRequestForObject
- рдШрдЯрдирд╛ рдХреЗ рдХрд╛рд░рдг рд╡рд╕реНрддреБ рдХреЗ рдирд╛рдо рдФрд░ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИ;EnqueueRequestForOwner
- рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди рдирд┐рдпрдВрддреНрд░рд┐рдд Pod
рд╣рдЯрд╛ Pod
рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ;EnqueueRequestsFromMapFunc
- рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ map
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ ( MapObject
рдореЗрдВ рд▓рд┐рдкрдЯреЗ) рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬрдм рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдПрдХ рдЯрд╛рдЗрдорд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдХ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реИ) рдШрдЯрдирд╛ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Reconciler
рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рд░реАрдХреЙрдиреНрд╕реЗрд▓рд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ - Reconcile
, рдЬрд┐рд╕рдореЗрдВ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдореВрд▓ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ:
рд╕рд╛рдордВрдЬрд╕реНрдп рд╡рд┐рдзрд┐ func (r *ReconcileMonitor) Reconcile(request reconcile.Request) (reconcile.Result, error) { reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) reqLogger.Info("Checking updates in repo for MonitoredService") // fetch the Monitor instance instance := &servicesv1alpha1.MonitoredService{} err := r.client.Get(context.Background(), request.NamespacedName, instance) if err != nil { if errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers. // Return and don't requeue return reconcile.Result{}, nil } // Error reading the object - requeue the request. return reconcile.Result{}, err } // check if service's config was updated // if it was, send event to upgrade controller if podSpec, ok := r.isServiceConfigUpdated(instance); ok { // Update instance Spec instance.Status.PodSpec = *podSpec instance.Status.ConfigChanged = true err = r.client.Status().Update(context.Background(), instance) if err != nil { reqLogger.Error(err, "Failed to update service status", "Service.Namespace", instance.Namespace, "Service.Name", instance.Name) return reconcile.Result{}, err } r.eventsChan <- event.GenericEvent{Meta: &servicesv1alpha1.MonitoredService{}, Object: instance} } return reconcile.Result{}, nil }
рд╡рд┐рдзрд┐ NamespacedName
рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде Request
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрди рдХреЛ рдХреИрд╢ рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: r.client.Get(context.TODO(), request.NamespacedName, instance)
ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрд╕рд╛рдзрди spec
рдореЗрдВ ConfigRepo
рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рд╕реЗрд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ GenericEvent
рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдирдИ рдШрдЯрдирд╛ GenericEvent
рдФрд░ рдЙрд╕ рдЪреИрдирд▓ рдкрд░ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕реЗ Upgrade
рдирд┐рдпрдВрддреНрд░рдХ рд╕реБрдирддрд╛ рд╣реИред
рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, Reconcile
рдПрдХ Result
рдкреНрд░рдХрд╛рд░ рдФрд░ error
ред рдпрджрд┐ Result
рдлрд╝реАрд▓реНрдб Requeue: true
рдпрд╛ error != nil
, рддреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрддрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреБрд░реЛрдз рд╡рд┐рд▓рдВрдм рдХреЗ рд╕рд╛рде рдХрддрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдЬреЛ RateLimiter
рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ RateLimiter
ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, ItemExponentialFailureRateLimiter
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреЗрд░реА рдХреЗ рд╕рдордп рдХреЛ "рд░рд┐рдЯрд░реНрди" рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдпрджрд┐ Requeue
рдХреНрд╖реЗрддреНрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдХ Queue.Forget
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ RateLimiter
рдХреИрд╢ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ (рдЬрд┐рд╕рд╕реЗ рд░рд┐рдЯрд░реНрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдВрдд рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдЗрд╕реЗ рдХрддрд╛рд░ рд╕реЗ рд╣рдЯрд╛рддрд╛ рд╣реИред рдХрддрд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
рдСрдкрд░реЗрдЯрд░ рд▓реЙрдиреНрдЪ
рдСрдкрд░реЗрдЯрд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдПрдХ рд╕рд╡рд╛рд▓ рдмрдирд╛ рд░рд╣рд╛: рдЗрд╕реЗ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрди рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ (рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдорд┐рдиреАрдмреНрдпреВрдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ):
# Setup Service Account kubectl create -f deploy/service_account.yaml # Setup RBAC kubectl create -f deploy/role.yaml kubectl create -f deploy/role_binding.yaml # Setup the CRD kubectl create -f deploy/crds/services_v1alpha1_monitoredservice_crd.yaml # Setup custom resource kubectl create -f deploy/crds/services_v1alpha1_monitoredservice_cr.yaml
рдПрдХ рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрдерди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рджреЛ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рд╣реИрдВред рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ:
operator-sdk up local --namespace=default
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рд╣реИред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
operator-sdk build config-monitor-operator:latest
deploy/operator.yaml
REPLACE_IMAGE
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, REPLACE_IMAGE
рдХреЛ config-monitor-operator:latest
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ config-monitor-operator:latest
:
sed -i "" 's|REPLACE_IMAGE|config-monitor-operator:latest|g' deploy/operator.yaml
рдмрдпрд╛рди рдХреЗ рд╕рд╛рде рддреИрдирд╛рддреА рдмрдирд╛рдПрдБ:
kubectl create -f deploy/operator.yaml
рдЕрдм рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ Pod
рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде Pod
рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ - рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ред
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп
рдЗрд╕ рд╕рдордп рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдХрдордЬреЛрд░ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреА рдХрдореА рд╣реИрдВред рдЬрдм рдПрдХ рдирдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИрдВред рдиреАрдЪреЗ рдХреБрдЫ рд╕рдмрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдЕрдкрдиреА рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рд╕реАрдЦреЗ рд╣реИрдВ:
- рдпрджрд┐ рджреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдвреАрд▓реА рдпреБрдЧреНрдорди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЖрдкрдХреЛ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЖрдкрдХреЛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╕рднреА рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдиреЗ / рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
- рд░рд┐рдХреЙрдиреНрд╕рд┐рд▓ рдкрджреНрдзрддрд┐ рдореЗрдВ рдХреЙрд▓ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдСрдкрд░реЗрд╢рди рд▓рдВрдмрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЛрд░рдЖрдЙрдЯ рдмрдирд╛рдПрдВ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдХреЗрдд рдХрд░рддреЗ рд╣реБрдП рдЕрдиреБрд░реЛрдз рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рднреЗрдЬреЗрдВред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдСрдкрд░реЗрдЯрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред