เปเบ™เบฐเบ™เบณ Shell-operator: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบณเบฅเบฑเบš Kubernetes เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™

เบกเบตเบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบš blog เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบš เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เปƒเบ™ Kubernetes เปเบฅเบฐเปเบ™เบงเปƒเบ” เบ‚เบฝเบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡. เป€เบงเบฅเบฒเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบขเบฒเบเบˆเบฐเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฒเบ™เปเบเป‰เป„เบ‚ Open Source เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ” - เบเบงเบ”เป€เบšเบดเปˆเบ‡ shell-operator!

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡?

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ shell-operator เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ: เบˆเบญเบ‡เป€เบซเบ”เบเบฒเบ™เบˆเบฒเบเบงเบฑเบ”เบ–เบธ Kubernetes, เปเบฅเบฐเป€เบกเบทเปˆเบญเป€เบซเบ”เบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป„เบ”เป‰เบฎเบฑเบš, เป€เบ›เบตเบ”เบ•เบปเบงเป‚เบ„เบ‡เบเบฒเบ™เบžเบฒเบเบ™เบญเบ, เปƒเบซเป‰เบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบซเบ”เบเบฒเบ™:

เปเบ™เบฐเบ™เบณ Shell-operator: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบณเบฅเบฑเบš Kubernetes เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™

เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ, เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบธเปˆเบก, เบงเบฝเบเบ‡เบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเป€เบฅเบตเปˆเบกเบ›เบฒเบเบปเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™เบ—เบฒเบ‡เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เบงเบฝเบเบ‡เบฒเบ™เบ™เป‰เบญเบเป†เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเปเบเป‰เป„เบ‚เป‚เบ”เบเปƒเบŠเป‰ bash scripts เบ‡เปˆเบฒเบเบ”เบฒเบ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ, เบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เบฎเบนเป‰, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปƒเบ™ Golang. เปเบ™เปˆเบ™เบญเบ™, เบเบฒเบ™เบฅเบปเบ‡เบ—เบถเบ™เปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเบ‚เบญเบ‡เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบงเบฝเบเบ‡เบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบˆเบฐเบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš.

เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เปƒเบ™ 15 เบ™เบฒเบ—เบต

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™เบเบธเปˆเบก Kubernetes เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปเบเบฐเบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเป„เบ”เป‰. เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฐเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: replicating เบ„เบงเบฒเบกเบฅเบฑเบšเปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ docker.

Pods เบ—เบตเปˆเปƒเบŠเป‰เบฎเบนเบšเบžเบฒเบšเบˆเบฒเบเบ—เบฐเบšเบฝเบ™เป€เบญเบเบฐเบŠเบปเบ™เบ•เป‰เบญเบ‡เบกเบตเบขเบนเปˆเปƒเบ™ manifest เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ„เบงเบฒเบกเบฅเบฑเบšเบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™. เบ„เบงเบฒเบกเบฅเบฑเบšเบ™เบตเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เปƒเบ™เปเบ•เปˆเบฅเบฐ namespace เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡ pods. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เปเบ•เปˆเบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, namespace เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบซเบ™เบถเปˆเบ‡เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบซเบผเบฒเบ. เปเบฅเบฐเบ–เป‰เบฒเบšเปเปˆเบกเบต 2-3 เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ ... เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบฑเบšเบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบซเบผเบฒเบ. เปเบฅเบฐเบญเบตเบเบขเปˆเบฒเบ‡เบซเบ™เบถเปˆเบ‡เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบฅเบฑเบš: เบ‚เป‰เบญเบเบขเบฒเบเบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เป€เบ›เบฑเบ™เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ„เบฒเบง. เปƒเบ™เบ—เบตเปˆเบชเบธเบ”, เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ„เบนเปˆเบกเบท เป€เบ›เบฑเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚ เบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ•เบดเบœเบปเบ™เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™ โ€” เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบฅเบฑเบšโ€‹.

เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบ

เปƒเบซเป‰เบ‚เบฝเบ™เบชเบฐเบ„เบฃเบดเบšเปเบเบฐเบ—เบตเปˆเปเบฅเปˆเบ™เบ—เบธเบเป† N เบงเบดเบ™เบฒเบ—เบต เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡ namespaces เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบฅเบฑเบš, เปเบฅเบฐเบ–เป‰เบฒเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบฅเบฑเบš, เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™. เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบ„เป‰เบฒเบเบ„เบท script shell เปƒเบ™ cron - เป€เบ›เบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ„เบฅเบฒเบชเบชเบดเบเปเบฅเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰เบเบฑเบšเบ—เบธเบเบ„เบปเบ™. เบ‚เปเป‰เป€เบชเบเปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡ namespace เปƒเบซเบกเปˆเปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบšเบฒเบ‡เป€เบงเบฅเบฒเบกเบฑเบ™เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเป‚เบ”เบเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบฅเบฑเบš, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ™เปเบฒเป„เบ›เบชเบนเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง pods.

เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ”เป‰เบงเบ shell-operator

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฐเบ„เบดเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง cron เบ„เบฅเบฒเบชเบชเบดเบเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเปเบ—เบ™เบ—เบตเปˆเบ”เป‰เบงเบเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเป€เบกเบทเปˆเบญ namespace เบ–เบทเบเป€เบžเบตเปˆเบก: เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบฅเบฑเบšเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบกเบฑเบ™. เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰ shell-operator.

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡ script เป„เบ”เป‰. scripts เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ shell-operator เป€เบญเบตเป‰เบ™เบงเปˆเบฒ hook. เบ—เบธเบเป† hook เป€เบกเบทเปˆเบญเปเบฅเปˆเบ™เบ”เป‰เบงเบเบ—เบธเบ‡ --config เปเบˆเป‰เบ‡เปƒเบซเป‰เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปเบเบฐเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบœเบนเบเบกเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™, i.e. เบเปˆเบฝเบงเบเบฑเบšเป€เบซเบ”เบเบฒเบ™เปƒเบ”เบ—เบตเปˆเบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ 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

เบเบดเปˆเบ‡เปƒเบซเบเปˆ! เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™ script เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก. เป€เบžเบทเปˆเบญ "เบŸเบทเป‰เบ™เบŸเบน" เบกเบฑเบ™, เบกเบตเบชเบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญ: เบเบฐเบเบฝเบกเบฎเบนเบšเบžเบฒเบšเปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™เบเบธเปˆเบก.

เบเบฒเบ™เบเบฐเบเบฝเบกเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบต hook เป„เบ”เป‰

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบชเบฐเบ„เบดเบš, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบงเปˆเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ kubectl ะธ jq. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบฎเบนเบšเบžเบฒเบšเบ•เป‰เบญเบ‡เบกเบตเบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: hook เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, shell-operator เบ—เบตเปˆเบˆเบฐเบŸเบฑเบ‡เป€เบซเบ”เบเบฒเบ™เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ hook, เปเบฅเบฐเบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบ hook (kubectl เปเบฅเบฐ jq). Hub.docker.com เบกเบตเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเปเบฅเป‰เบง, เป€เบŠเบดเปˆเบ‡เบšเบฑเบ™เบˆเบธ Shell-operator, kubectl เปเบฅเบฐ jq. เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เบเบฒเบ™เป€เบžเบตเปˆเบก hook เบ‡เปˆเบฒเบเบ”เบฒเบ 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

เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ—เบตเปˆ hook เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เปเบฅเบฐเป€เบงเบฅเบฒเบ™เบตเป‰เบ‚เบฝเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบเบธเปˆเบก:

  1. เบˆเบญเบ‡เป€เบซเบ”เบเบฒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ namespace;
  2. เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบฅเบฑเบšเปƒเบ™ namespaces เบญเบทเปˆเบ™เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง.

เบกเบฑเบ™ turns เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบงเปˆเบฒโ€‹เบเบฑเบโ€‹เบ—เบตเปˆโ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹เบ•เป‰เบญเบ‡โ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เป€เบฎเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เป€เบซเบผเบปเปˆเบฒโ€‹เบ™เบตเป‰โ€‹. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบต ServiceAccount เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡. เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡ 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

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ, namespace เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปเบกเปˆเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบšเปˆเบญเบ™เบ—เบตเปˆ shell-operator เบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเปเบฅเบฐ manifests เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰:

$ 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-operator เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเบฑเบšเป€เบซเบ”เบเบฒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ namespace เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ hook เป€เบกเบทเปˆเบญเบˆเปเบฒเป€เบ›เบฑเบ™.

เปเบ™เบฐเบ™เบณ Shell-operator: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบณเบฅเบฑเบš Kubernetes เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, script shell เบ‡เปˆเบฒเบเป†เบเบฒเบเป€เบ›เบฑเบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบชเปเบฒเบฅเบฑเบš Kubernetes เปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบธเปˆเบก. เปเบฅเบฐเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เปƒเบ™ Golang:

เปเบ™เบฐเบ™เบณ Shell-operator: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบณเบฅเบฑเบš Kubernetes เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™

เบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰...เปเบ™เบฐเบ™เบณ Shell-operator: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบณเบฅเบฑเบš Kubernetes เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบ›เบตเบ”เป€เบœเบตเบเบ„เบงเบฒเบกเบซเบกเบฒเบเบ‚เบญเบ‡เบกเบฑเบ™เปƒเบซเป‰เบฅเบฐเบญเบฝเบ”เบ•เบทเปˆเบกเบขเบนเปˆเปƒเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบดเปˆเบ‡เบžเบดเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰.

เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡

เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบงเบฑเบ”เบ–เบธเปเบกเปˆเบ™เบ”เบต, เปเบ•เปˆเบกเบฑเบเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ•เปเปˆ เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบšเบฒเบ‡เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบงเบฑเบ”เบ–เบธ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ replicas เปƒเบ™ Deployment เบซเบผเบทเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ›เป‰เบฒเบเบงเบฑเบ”เบ–เบธ.

เป€เบกเบทเปˆเบญเป€เบซเบ”เบเบฒเบ™เบกเบฒเบฎเบญเบ”, shell-operator เป„เบ”เป‰เบฎเบฑเบš JSON manifest เบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธ. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบปเบ™เปƒเบˆเปƒเบ™ JSON เบ™เบตเป‰เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ hook เป„เบ”เป‰ เบžเบฝเบ‡เปเบ•เปˆ เป€เบกเบทเปˆเบญเบžเบงเบเป€เบ‚เบปเบฒเบ›เปˆเบฝเบ™เปเบ›เบ‡. เบกเบตเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰ jqFilter, เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ jq เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš JSON manifest.

เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบทเปˆเบญเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบ›เป‰เบฒเบเบŠเบทเปˆเบชเปเบฒเบฅเบฑเบš Deployment objects, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเบฑเปˆเบ™เบ•เบญเบ‡เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก labels เบญเบญเบเบˆเบฒเบเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก metadata. config เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบตเป‰โ€‹:

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

เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ jqFilter เบ™เบตเป‰เบ›เปˆเบฝเบ™ JSON เบเบฒเบงเบ‚เบญเบ‡ Deployment เปƒเบซเป‰เป€เบ›เบฑเบ™ JSON เบชเบฑเป‰เบ™เบ—เบตเปˆเบกเบตเบ›เป‰เบฒเบเบŠเบทเปˆ:

เปเบ™เบฐเบ™เบณ Shell-operator: เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบณเบฅเบฑเบš Kubernetes เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™

shell-operator เบˆเบฐเปเบฅเปˆเบ™ 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"
]}

A digression เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ: เปเบกเปˆเบ™, shell-operator เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ เปเบฅเปˆเบ™เบชเบฐเบ„เบฃเบดเบšเปเบšเบš crontab. เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™.

เป€เบžเบทเปˆเบญเบˆเปเบฒเปเบ™เบเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡ hook เป„เบ”เป‰เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง, shell-operator เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบŠเบปเปˆเบงเบ„เบฒเบงเปเบฅเบฐเบœเปˆเบฒเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ•เบปเบงเปเบ›เบ‚เบญเบ‡ hook. BINDING_CONTEXT_TYPE. เป„เบŸเบฅเปŒเบ›เบฐเบเบญเบšเบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบ JSON เบ‚เบญเบ‡เป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบฅเปˆเบ™ hook. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เบธเบเป† 10 เบ™เบฒเบ—เบต hook เบˆเบฐเปเบฅเปˆเบ™เบ”เป‰เบงเบเป€เบ™เบทเป‰เบญเบซเบฒเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

[{ "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 เป„เบ”เป‰เบ–เบทเบเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เปเบฅเป‰เบงเปƒเบ™ hook เบ—เบตเปˆ replicates เบ„เบงเบฒเบกเบฅเบฑเบš:

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

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบญเบทเปˆเบ™เป†เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™.

เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ•เปเปˆเป„เบ›?

เปƒเบ™ repository เป‚เบ„เบ‡เบเบฒเบ™, เปƒเบ™ /example directory, เบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ hooks เบ—เบตเปˆเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก. เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เบฝเบ™ hooks เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™.

เบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบเปเบฒ metrics เป‚เบ”เบเปƒเบŠเป‰ Prometheus - metrics เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบกเปˆเบ™เป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบขเบนเปˆเปƒเบ™เบžเบฒเบ เบกเบ—.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบ„เบฒเบ”เป€เบ”เบปเบฒเป„เบ”เป‰, shell-operator เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ Go เปเบฅเบฐเปเบˆเบเบขเบฒเบเบžเบฒเบเปƒเบ•เป‰เปƒเบšเบญเบฐเบ™เบธเบเบฒเบ” Open Source (Apache 2.0). เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ‚เปเบ‚เบญเบšเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ”เป‰เบฒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ”เป† เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบš GitHubโ€‹: เปเบฅเบฐเบ”เบฒเบง, เปเบฅเบฐเบšเบฑเบ™เบซเบฒ, เปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป.

เบเบฒเบ™เบเบปเบเบœเป‰เบฒเบกเปˆเบฒเบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบฑเบš, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเปเบˆเป‰เบ‡เปƒเบซเป‰เบ—เปˆเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒ shell-operator เปเบกเปˆเบ™ เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบฎเบฑเบเบชเบฒ add-ons เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก Kubernetes เป„เบ”เป‰เบ—เบฑเบ™เบชเบฐเป„เบซเบกเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ•เปˆเบฒเบ‡เป†. เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเบ™เบตเป‰ เบšเบญเบ เปƒเบ™เบงเบฑเบ™เบˆเบฑเบ™เบ—เบตเปˆ HighLoad++ 2019 เบ—เบตเปˆ St. Petersburg - เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบœเบตเบเปเบœเปˆเบงเบดเบ”เบตเป‚เบญ เปเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบญเบ”เบˆเบฒเบเบชเบฝเบ‡เบ‚เบญเบ‡เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ™เบตเป‰เปƒเบ™เป„เบงเป†เบ™เบตเป‰.

เบžเบงเบเป€เบฎเบปเบฒเบกเบตเปเบœเบ™เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ™เบตเป‰: addon-operator เปเบฅเบฐเบเบฒเบ™เป€เบเบฑเบšเบเปเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ‚เบญเบ‡ hooks เปเบฅเบฐเป‚เบกเบ”เบนเบ™. เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, addon-operator เปเบกเปˆเบ™เปเบฅเป‰เบง เบกเบตเบขเบนเปˆเปƒเบ™ GitHub, เปเบ•เปˆเป€เบญเบเบฐเบชเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™. เบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบงเบ‚เบญเบ‡เบเบฒเบ™เป€เบเบฑเบšเบเปเบฒเป‚เบกเบ”เบนเบ™เป„เบ”เป‰เบ–เบทเบเบงเบฒเบ‡เปเบœเบ™เป„เบงเป‰เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบ”เบนเบฎเป‰เบญเบ™.

เบ•เบดเบ”เบ•เบฒเบกเป€เบšเบดเปˆเบ‡!

PS

เบญเปˆเบฒเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™ blog เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™