Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ: Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ“แƒ

แƒฉแƒ•แƒ”แƒœแƒก แƒ‘แƒšแƒแƒ’แƒ–แƒ” แƒฃแƒ™แƒ•แƒ” แƒ˜แƒงแƒ แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ–แƒ”แƒช แƒกแƒแƒฃแƒ‘แƒแƒ แƒ˜ แƒ˜แƒงแƒ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ Kubernetes-แƒจแƒ˜ แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒ—แƒแƒ•แƒแƒ“ แƒ“แƒแƒฌแƒ”แƒ แƒ” แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜. แƒแƒ›แƒฏแƒ”แƒ แƒแƒ“ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก แƒฌแƒแƒ แƒ›แƒแƒ’แƒ˜แƒ“แƒ’แƒ˜แƒœแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒงแƒ•แƒแƒœแƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก แƒกแƒฃแƒžแƒ”แƒ  แƒ›แƒแƒ แƒขแƒ˜แƒ• แƒ“แƒแƒœแƒ”แƒ–แƒ” - แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ— แƒญแƒฃแƒ แƒ•แƒ˜-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜!

แƒ แƒแƒขแƒแƒ›?

Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ˜แƒ“แƒ”แƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ: แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ”แƒ แƒ”แƒ— แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜ Kubernetes-แƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ”แƒก แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ, แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— แƒ’แƒแƒ แƒ” แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ, แƒ›แƒ˜แƒแƒฌแƒแƒ“แƒ”แƒ— แƒ›แƒแƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘:

Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ: Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ“แƒ

แƒแƒ›แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ แƒ’แƒแƒฉแƒœแƒ“แƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ แƒ›แƒชแƒ˜แƒ แƒ” แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ—แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ’แƒ•แƒ˜แƒœแƒ“แƒแƒ“แƒ แƒกแƒฌแƒแƒ แƒ˜ แƒ’แƒ–แƒ˜แƒ—. แƒงแƒ•แƒ”แƒšแƒ แƒ”แƒก แƒžแƒแƒขแƒแƒ แƒ แƒแƒ›แƒแƒชแƒแƒœแƒ แƒ›แƒแƒ’แƒ•แƒแƒ แƒ“แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ bash แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒ—แƒฃแƒ›แƒชแƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒแƒ’แƒ”แƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒแƒ—, แƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ˜แƒ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ Golang-แƒจแƒ˜. แƒชแƒฎแƒแƒ“แƒ˜แƒ, แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒแƒกแƒ”แƒ—แƒ˜ แƒ›แƒชแƒ˜แƒ แƒ” แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒ›แƒแƒกแƒจแƒขแƒแƒ‘แƒ˜แƒแƒœ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒแƒจแƒ˜ แƒ˜แƒœแƒ•แƒ”แƒกแƒขแƒ˜แƒชแƒ˜แƒ แƒแƒ แƒแƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ 15 แƒฌแƒฃแƒ—แƒจแƒ˜

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก, แƒ—แƒฃ แƒ แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ Kubernetes แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜ แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒก แƒ“แƒแƒ”แƒฎแƒ›แƒแƒ แƒแƒก. แƒแƒ›แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜: แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒžแƒแƒ“แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ”แƒœ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒก แƒ™แƒ”แƒ แƒซแƒ แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜แƒ“แƒแƒœ, แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ”แƒก แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒจแƒ˜ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒก แƒ‘แƒ›แƒฃแƒšแƒก แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ—. แƒ”แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ˜แƒฅแƒ›แƒœแƒแƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜, แƒกแƒแƒœแƒแƒ› แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒ— แƒžแƒแƒ“แƒ”แƒ‘แƒก. แƒ”แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก แƒฎแƒ”แƒšแƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฃ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ  แƒ’แƒแƒ แƒ”แƒ›แƒแƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒ”แƒ แƒ—แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ” แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ’แƒแƒฎแƒ“แƒ”แƒ‘แƒ. แƒ“แƒ แƒ—แƒฃ แƒแƒกแƒ”แƒ•แƒ” แƒแƒ  แƒแƒ แƒ˜แƒก 2-3 แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜... แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒ“แƒ”แƒ‘แƒ. แƒ“แƒ แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ แƒแƒ› แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘: แƒ›แƒ˜แƒœแƒ“แƒ แƒ“แƒ แƒแƒ“แƒแƒ“แƒ แƒ แƒจแƒ”แƒ•แƒชแƒ•แƒแƒšแƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜ แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜ แƒจแƒ”แƒกแƒแƒกแƒ•แƒšแƒ”แƒšแƒแƒ“. แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“, แƒฎแƒ”แƒšแƒ˜แƒ— แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ แƒแƒ’แƒแƒ แƒช แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒแƒ แƒแƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜ โ€” แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒแƒกแƒ แƒ“แƒ แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒแƒ–แƒ”.

แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— shell แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒ˜แƒก แƒงแƒแƒ•แƒ”แƒš N แƒฌแƒแƒ›แƒจแƒ˜ แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒ“แƒ แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒ”แƒ‘แƒก โ€‹โ€‹แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒก แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ—แƒฃ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒ แƒแƒ  แƒแƒ แƒ˜แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒ˜แƒก แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ. แƒแƒ› แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒก แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ˜แƒก แƒฐแƒ’แƒแƒ•แƒก แƒญแƒฃแƒ แƒ•แƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒก cron-แƒจแƒ˜ - แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ แƒงแƒ•แƒ”แƒšแƒแƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒ˜แƒœแƒฃแƒกแƒ˜ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก แƒจแƒฃแƒแƒšแƒ”แƒ“แƒจแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒฅแƒ›แƒœแƒแƒก แƒแƒฎแƒแƒšแƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ” แƒ“แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ“แƒ แƒแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒ˜แƒก แƒ“แƒแƒ แƒฉแƒ”แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ แƒแƒช แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒก แƒžแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒแƒจแƒ˜.

แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ—แƒแƒœ

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒกแƒฌแƒแƒ แƒแƒ“ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก, แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ cron แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒแƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ“แƒแƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”: แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒ แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ›แƒ“แƒ”. แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒœแƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒ”แƒก shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒก. Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒขแƒ”แƒ แƒ›แƒ˜แƒœแƒ”แƒ‘แƒจแƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒก แƒฐแƒฃแƒ™แƒ”แƒ‘แƒ˜ แƒ”แƒฌแƒแƒ“แƒ”แƒ‘แƒ. แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒ™แƒแƒ™แƒแƒšแƒ˜ แƒ“แƒ แƒแƒจแƒ˜แƒ— แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก --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. แƒ”แƒก แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒกแƒฃแƒ แƒแƒ—แƒก แƒฃแƒœแƒ“แƒ แƒฐแƒฅแƒแƒœแƒ“แƒ”แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒœแƒ˜แƒ•แƒ—แƒ”แƒ‘แƒ˜: แƒฉแƒ•แƒ”แƒœแƒ˜ hook, shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒก แƒ’แƒแƒฃแƒฌแƒ”แƒ•แƒก แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒก แƒ“แƒ แƒ’แƒแƒฃแƒจแƒ•แƒ”แƒ‘แƒก Hook-แƒก, แƒ“แƒ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ Hook-แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  (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

แƒ›แƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒฃแƒšแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒชแƒแƒšแƒ™แƒ” แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”, แƒกแƒแƒ“แƒแƒช แƒแƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ“แƒ”แƒ‘แƒ shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒ“แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜:

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

แƒกแƒฃแƒš แƒ”แƒก แƒแƒ แƒ˜แƒก: shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ‘แƒก, แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ”แƒ แƒก แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒฆแƒแƒœแƒ˜แƒกแƒซแƒ˜แƒ”แƒ‘แƒ”แƒ‘แƒก แƒ“แƒ แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒก Hook-แƒก.

Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ: Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ“แƒ

แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“, แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ shell แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒ’แƒแƒ“แƒแƒ˜แƒฅแƒชแƒ Kubernetes-แƒ˜แƒก แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒš แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒแƒ“ แƒ“แƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜. แƒ“แƒ แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ Golang-แƒจแƒ˜ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ แƒ—แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”:

Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ: Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ“แƒ

แƒแƒ› แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ–แƒ” แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ˜แƒšแƒฃแƒกแƒขแƒ แƒแƒชแƒ˜แƒแƒ...Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ: Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ“แƒ

แƒ›แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒ•แƒ”แƒชแƒœแƒแƒ‘แƒ˜แƒ— แƒ”แƒ แƒ—-แƒ”แƒ แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒžแƒฃแƒ‘แƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜.

แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ

แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒงแƒฃแƒ แƒ˜แƒก แƒ“แƒ”แƒ•แƒœแƒ”แƒ‘แƒ แƒ™แƒแƒ แƒ’แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ แƒ”แƒแƒ’แƒ˜แƒ แƒ”แƒ‘แƒ แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒแƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, Deployment-แƒจแƒ˜ แƒแƒกแƒšแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒชแƒ•แƒšแƒ”แƒšแƒแƒ“ แƒแƒœ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒ”แƒขแƒ˜แƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒชแƒ•แƒšแƒ”แƒšแƒแƒ“.

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ แƒ›แƒแƒ“แƒ˜แƒก, shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก JSON แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒก. แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒจแƒ”แƒ•แƒแƒ แƒฉแƒ˜แƒแƒ— แƒ˜แƒก แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒ•แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ”แƒ‘แƒก แƒแƒ› JSON-แƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— Hook แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ˜แƒแƒœ. แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒ•แƒ”แƒšแƒ˜ jqFilter, แƒกแƒแƒ“แƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒ— jq แƒ’แƒแƒ›แƒแƒฎแƒแƒขแƒฃแƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ JSON manifest-แƒ–แƒ”.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒ”แƒขแƒ˜แƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ–แƒ” แƒ แƒ”แƒแƒ’แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒคแƒ˜แƒšแƒขแƒ แƒแƒ— แƒ•แƒ”แƒšแƒ˜ labels แƒ›แƒ˜แƒœแƒ“แƒแƒ แƒก แƒ’แƒแƒ แƒ”แƒ— metadata. แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒกแƒ”แƒ—แƒ˜:

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

แƒ”แƒก jqFilter แƒ’แƒแƒ›แƒแƒฎแƒแƒขแƒฃแƒšแƒ”แƒ‘แƒ แƒแƒฅแƒชแƒ”แƒ•แƒก Deployment-แƒ˜แƒก แƒ’แƒ แƒซแƒ”แƒš JSON แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒก แƒ›แƒแƒ™แƒšแƒ” JSON-แƒแƒ“ แƒšแƒ”แƒ˜แƒ‘แƒšแƒ”แƒ‘แƒ˜แƒ—:

Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ: Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ“แƒ

shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒ’แƒแƒฃแƒจแƒ•แƒ”แƒ‘แƒก Hook-แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒจแƒ˜แƒœ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ”แƒก แƒ›แƒแƒ™แƒšแƒ” JSON แƒจแƒ”แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒกแƒฎแƒ•แƒ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ˜แƒ’แƒœแƒแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

Hook แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜

Hook-แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒ— แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ - แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 2 แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒฆแƒแƒœแƒ˜แƒกแƒซแƒ˜แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก Kubernetes-แƒ“แƒแƒœ แƒ“แƒ 2 แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒ˜:

{"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"
]}

แƒ›แƒชแƒ˜แƒ แƒ” แƒ’แƒแƒ“แƒแƒฎแƒ•แƒ”แƒ•แƒ: แƒ“แƒ˜แƒแƒฎ, Shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ crontab แƒกแƒขแƒ˜แƒšแƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ. แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ.

แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒกแƒแƒ แƒ™แƒ•แƒ”แƒ•แƒแƒ“, แƒ—แƒฃ แƒ แƒแƒขแƒแƒ› แƒ’แƒแƒฃแƒจแƒ•แƒ แƒ™แƒแƒ™แƒแƒšแƒ˜, shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒฅแƒ›แƒœแƒ˜แƒก แƒ“แƒ แƒแƒ”แƒ‘แƒ˜แƒ— แƒคแƒแƒ˜แƒšแƒก แƒ“แƒ แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ›แƒก แƒ›แƒ˜แƒกแƒ™แƒ”แƒœ แƒ›แƒ˜แƒ›แƒแƒ•แƒแƒš แƒ’แƒ–แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒจแƒ˜ Hook-แƒจแƒ˜. BINDING_CONTEXT_TYPE. แƒคแƒแƒ˜แƒšแƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก Hook-แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒ”แƒ–แƒก 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

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒกแƒฎแƒ•แƒ แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒแƒœแƒแƒšแƒแƒ’แƒ˜แƒฃแƒ แƒแƒ“.

แƒ แƒ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜?

แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒจแƒ˜, แƒฅ /แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜ แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ”แƒ‘แƒ˜, แƒแƒ แƒ˜แƒก แƒ™แƒแƒ™แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ›แƒ–แƒแƒ“ แƒแƒ แƒ˜แƒแƒœ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ–แƒ” แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“. แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ™แƒแƒ™แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒกแƒแƒก, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ˜.

แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒžแƒ แƒแƒ›แƒ”แƒ—แƒ”แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ˜แƒก แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ - แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ.

แƒ แƒแƒ’แƒแƒ แƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒšแƒ‘แƒแƒ— แƒ›แƒ˜แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ˜แƒ—, shell-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ Go-แƒจแƒ˜ แƒ“แƒ แƒœแƒแƒฌแƒ˜แƒšแƒ“แƒ”แƒ‘แƒ แƒฆแƒ˜แƒ แƒฌแƒงแƒแƒ แƒแƒก แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ˜แƒ— (Apache 2.0). แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ”แƒšแƒ˜ แƒ•แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ GitHub-แƒ–แƒ”: แƒ“แƒ แƒ•แƒแƒ แƒกแƒ™แƒ•แƒšแƒแƒ•แƒ”แƒ‘แƒ˜, แƒ“แƒ แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒ˜, แƒ“แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒ.

แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ แƒ“แƒ˜แƒก แƒ›แƒแƒฎแƒกแƒœแƒ˜แƒ—, แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒชแƒœแƒแƒ‘แƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒญแƒฃแƒ แƒ•แƒ˜-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒ ะฝะตะฑะพะปัŒัˆะฐั แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒแƒก Kubernetes แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜ แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒ˜. แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— แƒ›แƒ”แƒขแƒ˜ แƒแƒ› แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ’แƒแƒœแƒฃแƒชแƒฎแƒแƒ“แƒ แƒกแƒ˜แƒขแƒงแƒ•แƒแƒกแƒ˜แƒขแƒงแƒ•แƒ˜แƒ— แƒแƒ แƒจแƒแƒ‘แƒแƒ—แƒก 2019 แƒฌแƒšแƒ˜แƒก HighLoad++-แƒ–แƒ” แƒกแƒแƒœแƒ™แƒข-แƒžแƒ”แƒขแƒ”แƒ แƒ‘แƒฃแƒ แƒ’แƒจแƒ˜ - แƒ›แƒแƒšแƒ” แƒ’แƒแƒ›แƒแƒ•แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ— แƒแƒ› แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ•แƒ˜แƒ“แƒ”แƒแƒก แƒ“แƒ แƒขแƒ แƒแƒœแƒกแƒ™แƒ แƒ˜แƒžแƒขแƒก.

แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ’แƒ”แƒ’แƒ›แƒ, แƒ แƒแƒ› แƒ’แƒแƒ•แƒฎแƒกแƒœแƒแƒ— แƒแƒ› แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ“แƒแƒœแƒแƒ แƒฉแƒ”แƒœแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜: แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒ“แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒแƒฃแƒญแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒšแƒ”แƒฅแƒชแƒ˜แƒ. แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, addon-แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ github-แƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ’แƒ–แƒแƒจแƒ˜แƒ. แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒšแƒ”แƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒ–แƒแƒคแƒฎแƒฃแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ˜แƒ’แƒ”แƒ’แƒ›แƒ”แƒ‘แƒ.

แƒแƒ“แƒ”แƒ•แƒœแƒ”แƒ— แƒ—แƒ•แƒแƒšแƒงแƒฃแƒ แƒ˜!

PS

แƒแƒกแƒ”แƒ•แƒ” แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒ‘แƒšแƒแƒ’แƒ–แƒ”:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ