เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบžเบฒเบเปƒเบ™ เปเบฅเบฐเบ™เบญเบ Kubernetes

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เป„เบ”เป‰เบ‚เบฝเบ™ เบ•เบญเบšเบเปˆเบฝเบงเบเบฑเบšเบŠเบตเบงเบดเบ”เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™ Docker เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เปเบเป‰เบšเบฑเบ™เบซเบฒเบžเบฒเบเบ™เบญเบเบ‚เบญเบ‡เบกเบฑเบ™, เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบเปˆเบฒเบงเบชเบฑเป‰เบ™เป†เบงเปˆเบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบฅเบฐเบšเบปเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ”เบตเปƒเบ™ Kuber, เบ”เบถเบ‡เบ„เบงเบฒเบกเบฅเบฑเบš, เปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ—เบตเปˆเบชเบฐเบ”เบงเบเบชเบฐเบšเบฒเบ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบขเบนเปˆเบ™เบญเบ Docker เบ—เบฑเบ‡เบซเบกเบปเบ”. เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบชเบฑเบšเบชเบปเบ™, เปเบ•เปˆ "เบชเบนเบ”" เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡ :) เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ Python, เปเบ•เปˆเป€เบซเบ”เบœเบปเบ™เบšเปเปˆเป„เบ”เป‰เบœเบนเบเบกเบฑเบ”เบเบฑเบšเบžเบฒเบชเบฒ.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบžเบฒเบเปƒเบ™ เปเบฅเบฐเบ™เบญเบ Kubernetes

เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบกเบฒเบ‚เบญเบ‡เบ„เปเบฒเบ–เบฒเบกเบ™เบตเป‰เปเบกเปˆเบ™: เป€เบกเบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡เบซเบ™เบถเปˆเบ‡เบกเบตเป‚เบ„เบ‡เบเบฒเบ™เบซเบ™เบถเปˆเบ‡, เบ—เปเบฒเบญเบดเบ”เบกเบฑเบ™เป€เบ›เบฑเบ™ monolith เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบ—เบตเปˆเบกเบตเป€เบ„เบทเปˆเบญเบ‡เปƒเบŠเป‰เปเบฅเบฐ scripts, เปเบ•เปˆเป€เบกเบทเปˆเบญเป€เบงเบฅเบฒเบœเปˆเบฒเบ™เป„เบ›, เบกเบฑเบ™เป€เบ•เบตเบšเปƒเบซเบเปˆ, เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™เบเปเปˆเป€เบฅเบตเปˆเบกเปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™ microservices, เปเบฅเบฐ. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹. เปƒเบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”, เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบขเบนเปˆเปƒเบ™ VPS เป€เบ›เบปเปˆเบฒ, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰ Ansible, เปเบฅเบฐเปเบ•เปˆเบฅเบฐเบšเปเบฅเบดเบเบฒเบ™เป„เบ”เป‰เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเบ”เป‰เบงเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ YAML เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบฅเบฐเบ›เบธเปˆเบกเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เปเบฅเบฐเป„เบŸเบฅเปŒ config เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบš. เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™, เป€เบŠเบดเปˆเบ‡เบชเบฐเบ”เบงเบเบซเบผเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒ .k config เบ™เบตเป‰เบ–เบทเบเป‚เบซเบฅเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบงเบฑเบ”เบ–เบธเบ—เบปเปˆเบงเป‚เบฅเบ, เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบˆเบฒเบเบ—เบธเบเบšเปˆเบญเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ•เบปเบงเบ‚เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ microservices, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เปเบฅเบฐ เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบ•เบฑเบ”เป„เบกเป‰เปเบšเบšเบฅเบงเบกเบชเบนเบ™ เปเบฅเบฐเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก, foreshadowed เบเป‰เบฒเบเป„เบ› Kuber, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบ„เบงเบฒเบกเบ„เบทเบšเบซเบ™เป‰เบฒ. เบฎเปˆเบงเบกเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒ, Kubernetes เบชเบฐเป€เบซเบ™เบตเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เบ•เบปเบ™เปƒเบ™เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เป‚เบ„เบ‡เบฅเปˆเบฒเบ‡, เบฅเบงเบกเบ—เบฑเบ‡ เบญเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ„เบงเบฒเบกเบฅเบฑเบš ะธ เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ. เบเบปเบ™โ€‹เป„เบโ€‹เบ”เบฑเปˆเบ‡โ€‹เบเปˆเบฒเบงโ€‹เปเบกเปˆเบ™โ€‹เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™โ€‹เปเบฅเบฐโ€‹เป€เบŠเบทเปˆเบญโ€‹เบ–เบทโ€‹เป„เบ”เป‰โ€‹, เบชเบฐโ€‹เบ™เบฑเป‰เบ™โ€‹เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบšเบฒเบšโ€‹เบ—เบตเปˆโ€‹เบฎเบนเป‰โ€‹เบซเบ™เบฑเบ‡โ€‹เบชเบทโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบกเบฑเบ™โ€‹! เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบ‚เป‰เบญเบเบขเบฒเบเบฎเบฑเบเบชเบฒเบฎเบนเบšเปเบšเบšเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš config: เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เปƒเบŠเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบญเบเบฐเบžเบฒเบšเปƒเบ™ microservices เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบฅเบฐเบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เปเบฅเปˆเบ™เบฅเบฐเบซเบฑเบ”เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เป‚เบ”เบเปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ. เป„เบŸเบฅเปŒ config.

เปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบเบปเบ™เป„เบเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ”เป‰เบ–เบทเบเบ”เบฑเบ”เปเบ›เบ‡เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ—เบฑเบ‡เบเบฑเบšเป„เบŸเบฅเปŒ config เบ„เบฅเบฒเบชเบชเบดเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเบ„เบงเบฒเบกเบฅเบฑเบšเบˆเบฒเบ Kuber. เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ config เบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเบ‡เบงเบ”เบเบงเปˆเบฒเบ™เบตเป‰เบเบฑเบ‡เป„เบ”เป‰เบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบžเบฒเบชเบฒเบ‚เบญเบ‡ Python เบ—เบตเบชเบฒเบก, เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

Dict[str, Dict[str, Union[str, int, float]]]

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, cogfig เบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบกเบ—เบตเปˆเบกเบตเบชเปˆเบงเบ™เบ—เบตเปˆเบกเบตเบŠเบทเปˆ, เปเบ•เปˆเบฅเบฐเบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบกเบ—เบตเปˆเบกเบตเบกเบนเบ™เบ„เปˆเบฒเบˆเบฒเบเบ›เบฐเป€เบžเบ”เบ‡เปˆเบฒเบเป†. เปเบฅเบฐเบžเบฒเบเบชเปˆเบงเบ™เบ•เปˆเบฒเบ‡เป†เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ เปเบฅเบฐเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ‚เบญเบ‡เบšเบฒเบ‡เบ›เบฐเป€เบžเบ”. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

adminka:
  django_secret: "ExtraLongAndHardCode"

db_main:
  engine: mysql
  host: 256.128.64.32
  user: cool_user
  password: "SuperHardPassword"

redis:
  host: 256.128.64.32
  pw: "SuperHardPassword"
  port: 26379

smtp:
  server: smtp.gmail.com
  port: 465
  email: [email protected]
  pw: "SuperHardPassword"

เปƒเบ™เบ‚เบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™, เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก engine เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™ SQLite, เปเบฅเบฐ redis เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ mock, เบฅเบฐเบšเบธเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบˆเบฐเบšเบฑเบ™เบ—เบถเบ - เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเบฎเบฑเบšเบฎเบนเป‰เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบฅเบฐเบซเบฑเบ”เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ debugging, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เปเบฅเบฐเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบทเปˆเบ™เป†. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเป€เบžเบฒเบฐเบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบทเปˆเบ™เป†เบซเบผเบฒเบ - เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เปˆเบฒเบ‡เป†, เบกเบฑเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบกเบต orchestration, เปเบ•เปˆเบเบฑเบ‡เบกเบต scripts เบ•เปˆเบฒเบ‡เป†, เปเบฅเบฐเปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ‚เบญเบ‡เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบœเปˆเบฒเบ™. เปเบฅเบฐเปเบเป‰เป„เบ‚เบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ‚เบญเบ‡เบ—เปเปˆเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™ เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ›เบฑเบ™เบซเปˆเบงเบ‡เบšเบฑเบ™เบซเบฒ backend. เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบˆเบฑเบšเบ›เบงเบ”เบ—เบตเปˆเบˆเบฐเปเบšเปˆเบ‡เบ›เบฑเบ™เบงเปˆเบฒเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบฅเบงเบกเบ—เบฑเบ‡เบฅเบฐเบซเบฑเบ”เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบœเปˆเบฒเบ™. setup.py - เบฎเปˆเบงเบกเบเบฑเบ™เบ™เบตเป‰เบฅเบงเบกเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบšเบปเบšเบ™เบดเป€เบงเบ”เบ”เบฝเบง, เป€เบญเบเบฐเบฅเบฒเบ”เบ‚เบญเบ‡เป€เบงเบ—เบตเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰.

เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบเบฑเบ Kubernetes เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฑเปˆเบ‡เบ™เบตเป‰:

containers:
  - name : enter-api
    image: enter-api:latest
    ports:
      - containerPort: 80
    volumeMounts:
      - name: db-main-secret-volume
        mountPath: /etc/secrets/db-main

volumes:
  - name: db-main-secret-volume
    secret:
      secretName: db-main-secret

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปเบ•เปˆเบฅเบฐเบ„เบงเบฒเบกเบฅเบฑเบšเบญเบฐเบ—เบดเบšเบฒเบเบžเบฒเบเบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡. เบ„เบงเบฒเบกเบฅเบฑเบšเบ‚เบญเบ‡เบ•เบปเบงเป€เบญเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบšเบšเบ™เบตเป‰:

apiVersion: v1
kind: Secret
metadata:
  name: db-main-secret
type: Opaque
stringData:
  db_main.yaml: |
    engine: sqlite
    filename: main.sqlite3

เบฎเปˆเบงเบกเบเบฑเบ™เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ YAML เบ•เบฒเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ /etc/secrets/db-main/section_name.yaml

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

config.py

__author__ = 'AivanF'
__copyright__ = 'Copyright 2020, AivanF'

import os
import yaml

__all__ = ['config']
PROJECT_DIR = os.path.abspath(__file__ + 3 * '/..')
SECRETS_DIR = '/etc/secrets'
KEY_LOG = '_config_log'
KEY_DBG = 'debug'

def is_yes(value):
    if isinstance(value, str):
        value = value.lower()
        if value in ('1', 'on', 'yes', 'true'):
            return True
    else:
        if value in (1, True):
            return True
    return False

def update_config_part(config, key, data):
    if key not in config:
        config[key] = data
    else:
        config[key].update(data)

def parse_big_config(config, filename):
    '''
    Parse YAML config with multiple section
    '''
    if not os.path.isfile(filename):
        return False
    with open(filename) as f:
        config_new = yaml.safe_load(f.read())
        for key, data in config_new.items():
            update_config_part(config, key, data)
        config[KEY_LOG].append(filename)
        return True

def parse_tiny_config(config, key, filename):
    '''
    Parse YAML config with a single section
    '''
    with open(filename) as f:
        config_tiny = yaml.safe_load(f.read())
        update_config_part(config, key, config_tiny)
        config[KEY_LOG].append(filename)

def combine_config():
    config = {
        # To debug config load code
        KEY_LOG: [],
        # To debug other code
        KEY_DBG: is_yes(os.environ.get('DEBUG')),
    }
    # For simple local runs
    CONFIG_SIMPLE = os.path.join(PROJECT_DIR, 'config.yaml')
    parse_big_config(config, CONFIG_SIMPLE)
    # For container's tests
    CONFIG_ENVVAR = os.environ.get('CONFIG')
    if CONFIG_ENVVAR is not None:
        if not parse_big_config(config, CONFIG_ENVVAR):
            raise ValueError(
                f'No config file from EnvVar:n'
                f'{CONFIG_ENVVAR}'
            )
    # For K8s secrets
    for path, dirs, files in os.walk(SECRETS_DIR):
        depth = path[len(SECRETS_DIR):].count(os.sep)
        if depth > 1:
            continue
        for file in files:
            if file.endswith('.yaml'):
                filename = os.path.join(path, file)
                key = file.rsplit('.', 1)[0]
                parse_tiny_config(config, key, filename)
    return config

def build_config():
    config = combine_config()
    # Preprocess
    for key, data in config.items():
        if key.startswith('db_'):
            if data['engine'] == 'sqlite':
                data['filename'] = os.path.join(PROJECT_DIR, data['filename'])
    # To verify correctness
    if config[KEY_DBG]:
        print(f'** Loaded config:n{yaml.dump(config)}')
    else:
        print(f'** Loaded config from: {config[KEY_LOG]}')
    return config

config = build_config()

เป€เบซเบ”เบœเบปเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ: เบžเบงเบเป€เบฎเบปเบฒเบฅเบงเบก configs เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบˆเบฒเบเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป‚เบ”เบเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก, เปเบฅเบฐเบžเบฒเบเบชเปˆเบงเบ™ config เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบˆเบฒเบเบ„เบงเบฒเบกเบฅเบฑเบš Kuber, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ preprocess เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ. เบšเบงเบเบเบฑเบšเบ•เบปเบงเปเบ›เบšเบฒเบ‡เบขเปˆเบฒเบ‡. เบ‚เป‰เบญเบเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเป€เบกเบทเปˆเบญเบ„เบปเป‰เบ™เบซเบฒเป„เบŸเบฅเปŒเบˆเบฒเบเบ„เบงเบฒเบกเบฅเบฑเบš, เบเบฒเบ™เบˆเปเบฒเบเบฑเบ”เบ„เบงเบฒเบกเป€เบฅเบดเบเปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เป€เบžเบฒเบฐเบงเปˆเบฒ K8s เบชเป‰เบฒเบ‡เป‚เบŸเป€เบ”เบตเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เปƒเบ™เปเบ•เปˆเบฅเบฐเบ„เบงเบฒเบกเบฅเบฑเบšเบ—เบตเปˆเบ„เบงเบฒเบกเบฅเบฑเบšเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰, เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเปˆเบชเบนเบ‡เบเบงเปˆเบฒ.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡ :) เบ„เปเบฒเป€เบซเบฑเบ™เปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ”เป†เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบซเบผเบทเบ‚เบปเบ‡เป€เบ‚เบ”เบญเบทเปˆเบ™เป†เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบš. เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบŠเบธเบกเบŠเบปเบ™เบเบฑเบ‡เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ, เบšเบฒเบ‡เบ—เบตเบกเบฑเบ™เบกเบตเบกเบนเบ™เบ„เปˆเบฒเป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ConfigMaps (เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เป€เบ—เบทเปˆเบญ) เปเบฅเบฐเบเบฒเบ™เป€เบœเบตเบเปเบœเปˆเบฅเบฐเบซเบฑเบ”เปƒเบ™ GitHub / PyPI? เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบชเบดเปˆเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™เป€เบเบตเบ™เป„เบ›เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบ—เบปเปˆเบงเป„เบ›, เปเบฅเบฐเป€เบฅเบฑเบเบ™เป‰เบญเบ peeking เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ„เบปเบ™เบญเบทเปˆเบ™, เบ„เบทเบเบฑเบšเบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ™เบตเป‰, เปเบฅเบฐเบเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเบ‚เบญเบ‡ nuances, เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”, เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบˆเบฐเป€เบซเบฑเบ™เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™. , เบžเปเปเบฅเป‰เบง ๐Ÿ˜‰

เบžเบฝเบ‡เปเบ•เปˆเบœเบนเป‰เปƒเบŠเป‰เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเปƒเบ™เบเบฒเบ™เบชเปเบฒเบซเบผเบงเบ”. เป€เบ‚เบปเป‰เบฒโ€‹เบชเบนเปˆโ€‹เบฅเบฐโ€‹เบšเบปเบšเบเบฐเบฅเบธเบ™เบฒ.

เบ‚เป‰เบญเบเบ„เบงเบ™เป€เบœเบตเบเปเบœเปˆเป€เบ›เบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™/เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบšเป?

  • 0,0%เปเบกเปˆเบ™เปเบฅเป‰เบง, เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰ /contribution0

  • 33,3%เปเบกเปˆเบ™เปเบฅเป‰เบง, เบกเบฑเบ™เบ”เบตเบซเบผเบฒเบ 4

  • 41,7%เบšเปเปˆ, เปƒเบœเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เปเบฅเบฐเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ5

  • 25,0%เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบซเบผเบตเบโ€‹เป€เบงเบฑเป‰เบ™โ€‹เบเบฒเบ™โ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡ 3

12 เบœเบนเป‰เปƒเบŠเป‰เบฅเบปเบ‡เบ„เบฐเปเบ™เบ™เบชเบฝเบ‡. 3 เบœเบนเป‰เปƒเบŠเป‰เบ‡เบปเบ”.

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

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