ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π²Π½Π°Ρ‚Ρ€Π΅ ΠΈ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ Kubernetes

НСодамна напишав ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ Π·Π° ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΈΠΎΡ‚ Π²Π΅ΠΊ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π²ΠΎ Docker ΠΈ ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ Π½Π΅Π³ΠΎ, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ спомна Π΄Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ сопствСн конфигурациски систСм Π·Π° услугата Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π΄ΠΎΠ±Ρ€ΠΎ Π²ΠΎ Kuber, Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π° Ρ‚Π°Ρ˜Π½ΠΈ ΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π»ΠΎΠΊΠ°Π»Π½ΠΎ, Π΄ΡƒΡ€ΠΈ ΠΈ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ Docker цСлосно. ΠΠΈΡˆΡ‚ΠΎ ΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½ΠΎ, Π½ΠΎ ΠΎΠΏΠΈΡˆΠ°Π½ΠΈΠΎΡ‚ β€žΡ€Π΅Ρ†Π΅ΠΏΡ‚β€œ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ корисСн Π·Π° Π½Π΅ΠΊΠΎΠ³ΠΎ :) ΠšΠΎΠ΄ΠΎΡ‚ Π΅ Π²ΠΎ Python, Π½ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π΅ Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½Π° со Ρ˜Π°Π·ΠΈΠΊΠΎΡ‚.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π²Π½Π°Ρ‚Ρ€Π΅ ΠΈ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ Kubernetes

ΠŸΠΎΠ·Π°Π΄ΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅Ρ‚ΠΎ Π΅ ΠΎΠ²Π°: нСкогаш ΠΏΠΎΡΡ‚ΠΎΠ΅ΡˆΠ΅ Π΅Π΄Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π²ΠΎ ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Ρ‚ΠΎΠ° бСшС ΠΌΠ°Π» ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚ со ΠΊΠΎΠΌΡƒΠ½Π°Π»Π½ΠΈ услуги ΠΈ скрипти, Π½ΠΎ со Ρ‚Π΅ΠΊΠΎΡ‚ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Ρ€Π°ΡΡ‚Π΅ΡˆΠ΅, ΠΏΠΎΠ΄Π΅Π»Π΅Π½ Π½Π° услуги, ΠΊΠΎΠΈ ΠΏΠ°ΠΊ ΠΏΠΎΡ‡Π½Π°Π° Π΄Π° сС Π΄Π΅Π»Π°Ρ‚ Π½Π° микросСрвиси ΠΈ ΠΏΠΎΡ‚ΠΎΠ° сС Π·Π³ΠΎΠ»Π΅ΠΌΠΈ. ΠžΡ‚ΠΏΡ€Π²ΠΈΠ½, сСто ΠΎΠ²Π° бСшС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ Π½Π° Π³ΠΎΠ»ΠΈ VPS, процСситС Π½Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΈ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° кој Π±Π΅Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ со помош Π½Π° Ansible, Π° сСкоја услуга бСшС ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° со ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° YAML со ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΡ‚Π΅ поставки ΠΈ ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈ, Π° слична конфигурациска Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° бСшС искористСна Π·Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈ Π»Π°Π½ΡΠΈΡ€Π°ΡšΠ°, ΡˆΡ‚ΠΎ бСшС ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ, бидСјќи .k ΠΎΠ²Π°Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π΅ Π²Ρ‡ΠΈΡ‚Π°Π½Π° Π²ΠΎ Π³Π»ΠΎΠ±Π°Π»Π΅Π½ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚, достапСн ΠΎΠ΄ ΠΊΠ°Π΄Π΅ Π±ΠΈΠ»ΠΎ Π²ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚.

Π‘Π΅ΠΏΠ°ΠΊ, растот Π½Π° Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° микросСрвиси, Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ врски ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π° ΠΎΠ΄ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ сСча ΠΈ слСдСњС, Π½Π°Π²Π΅ΡΡ‚ΡƒΠ²Π°ΡˆΠ΅ прСсСлба Π²ΠΎ ΠšΡƒΠ±Π΅Ρ€, која сС ΡƒΡˆΡ‚Π΅ Π΅ Π²ΠΎ Ρ‚Π΅ΠΊ. Π—Π°Π΅Π΄Π½ΠΎ со помош Π²ΠΎ Ρ€Π΅ΡˆΠ°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° спомСнатитС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, Kubernetes Π³ΠΈ Π½ΡƒΠ΄ΠΈ своитС пристапи Π·Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со инфраструктурата, Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈ Ρ‚Π°ΠΊΠ°Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΈ Вајни ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π΄Π° сС Ρ€Π°Π±ΠΎΡ‚ΠΈ со Π½ΠΈΠ². ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΡ‚ Π΅ стандардСн ΠΈ сигурСн, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π±ΡƒΠΊΠ²Π°Π»Π½ΠΎ Π΅ Π³Ρ€Π΅Π² Π΄Π° Π½Π΅ сС користи! Но, Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅, Π±ΠΈ сакал Π΄Π° Π³ΠΎ Π·Π°Π΄Ρ€ΠΆΠ°ΠΌ ΠΌΠΎΡ˜ΠΎΡ‚ сСгашСн Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°: ΠΏΡ€Π²ΠΎ, Π΄Π° Π³ΠΎ користам ΠΏΠΎΠ΄Π΅Π΄Π½Π°ΠΊΠ²ΠΎ Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ микросСрвиси Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚, ΠΈ Π²Ρ‚ΠΎΡ€ΠΎ, Π΄Π° ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° Π³ΠΎ стартувам ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°Ρ‚Π° машина ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π΅Π΄Π½Π° Сдноставна конфигурациска Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°.

Π’ΠΎ овој ΠΏΠΎΠ³Π»Π΅Π΄, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΡ‚ Π·Π° ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€Π°ΡšΠ΅ Π½Π° конфигурациски ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ бСшС ΠΈΠ·ΠΌΠ΅Π½Π΅Ρ‚ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ со Π½Π°ΡˆΠ°Ρ‚Π° класична конфигурациска Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΈ со Ρ‚Π°Ρ˜Π½ΠΈΡ‚Π΅ ΠΎΠ΄ Kuber. Π‘Π΅ΡˆΠ΅ Π½Π°Π²Π΅Π΄Π΅Π½Π° ΠΈ ΠΏΠΎΡ€ΠΈΠ³ΠΈΠ΄Π½Π° конфигурациска структура, Π½Π° Ρ˜Π°Π·ΠΈΠΊΠΎΡ‚ Π½Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΎΡ‚ Python, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ слСдува:

Π”ΠΈΠΊΡ‚[ΡƒΠ»ΠΈΡ†Π°, Π”ΠΈΠΊΡ‚[ΡƒΠ»ΠΈΡ†Π°, Унија[ΡƒΠ», ΠΈΠ½Ρ‚, ΠΏΠ»ΠΎΠ²ΠΈ]]]

Односно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ³Ρ„ΠΈΠ³ Π΅ Ρ€Π΅Ρ‡Π½ΠΈΠΊ со ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ сСкоја Π΅ Ρ€Π΅Ρ‡Π½ΠΈΠΊ со врСдности ΠΎΠ΄ Сдноставни Ρ‚ΠΈΠΏΠΎΠ²ΠΈ. И Π΄Π΅Π»ΠΎΠ²ΠΈΡ‚Π΅ ја ΠΎΠΏΠΈΡˆΡƒΠ²Π°Π°Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ пристапот Π΄ΠΎ рСсурситС ΠΎΠ΄ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ Ρ‚ΠΈΠΏ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π΄Π΅Π» ΠΎΠ΄ Π½Π°ΡˆΠ°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°:

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, Π½Π°Π²Π΅Π΄ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π·Π°Ρ‡ΡƒΠ²Π° - ΠΎΠ²ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ сС ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π΅Π½ΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ, ΡˆΡ‚ΠΎ Π³ΠΎ олСснува ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅, Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ‚Π° ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈ. Ова Π΅ особСно Π²Π°ΠΆΠ½ΠΎ Π·Π° нас бидСјќи ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈ - Π΄Π΅Π» ΠΎΠ΄ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π΅ Π½Π°ΠΌΠ΅Π½Π΅Ρ‚ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡ΠΊΠΈ прСсмСтки, Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π΅ само Π½Π° сСрвСри со ΠΎΡ€ΠΊΠ΅ΡΡ‚Ρ€Π°Ρ†ΠΈΡ˜Π°, Ρ‚ΡƒΠΊΡƒ ΠΈ со Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ скрипти, ΠΊΠ°ΠΊΠΎ ΠΈ Π½Π° ΠΊΠΎΠΌΠΏΡ˜ΡƒΡ‚Π΅Ρ€ΠΈΡ‚Π΅ Π½Π° Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π°Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ ΠΏΡ€Π΅ΠΊΡƒ ΠΈ Π΄Π΅Π±Π°Π³ΠΈΡ€Π°Ρ˜Ρ‚Π΅ слоТСни Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π±Π΅Π· Π·Π°Π³Ρ€ΠΈΠΆΡƒΠ²Π°Ρ‡ΠΊΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. ΠŸΠ°Ρ‚Π΅ΠΌ, Π½Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ лошо Π΄Π° сподСлимС Π΄Π΅ΠΊΠ° Π½Π°ΡˆΠΈΡ‚Π΅ Π³Π»Π°Π²Π½ΠΈ Π°Π»Π°Ρ‚ΠΊΠΈ, Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° распорСд Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, сС инсталирани ΠΏΡ€Π΅ΠΊΡƒ setup.py – Π·Π°Π΅Π΄Π½ΠΎ ΠΎΠ²Π° Π³ΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡƒΠ²Π° Π½Π°ΡˆΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π²ΠΎ СдинствСн СкосистСм, нСзависСн ΠΎΠ΄ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΎΡ‚ Π½Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅.

ΠžΠΏΠΈΡΠΎΡ‚ Π½Π° ΠΏΠΎΠ΄Π»ΠΎΠ³Π°Ρ‚Π° Π½Π° ΠšΡƒΠ±Π΅Ρ€Π½Π΅Ρ‚Π΅Ρ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

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

И Π·Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈ Π»Π°Π½ΡΠΈΡ€Π°ΡšΠ°, сС користи ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°, која сС Π½Π°ΠΎΡ“Π° Π²ΠΎ root Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΏΠΎ ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π½Π°Π²Π΅Π΄Π΅Π½Π° Π²ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½Π° ΠΆΠΈΠ²ΠΎΡ‚Π½Π°Ρ‚Π° срСдина. ΠšΠΎΠ΄ΠΎΡ‚ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° ΠΎΠ²ΠΈΠ΅ погодности ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π²ΠΎ ΡΠΏΠΎΡ˜Π»Π΅Ρ€ΠΎΡ‚.

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()

Π›ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° ΠΎΠ²Π΄Π΅ Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Сдноставна: ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ΄ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ΠΈ ΠΏΠ°Ρ‚Π΅ΠΊΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°Ρ‚Π° ΠΈ ΠΌΠ°Π»ΠΈ конфигурациски сСкции ΠΎΠ΄ Ρ‚Π°Ρ˜Π½ΠΈΡ‚Π΅ Π½Π° ΠšΡƒΠ±Π΅Ρ€, Π° ΠΏΠΎΡ‚ΠΎΠ° ΠΌΠ°Π»ΠΊΡƒ Π³ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄. ΠŸΠ»ΡƒΡ Π½Π΅ΠΊΠΎΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π—Π°Π±Π΅Π»Π΅ΠΆΡƒΠ²Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΎΠ΄ Ρ‚Π°Ρ˜Π½ΠΈ, сС користи ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄Π»Π°Π±ΠΎΡ‡ΠΈΠ½Π°Ρ‚Π°, бидСјќи K8s создава скриСна ΠΏΠ°ΠΏΠΊΠ° Π²ΠΎ сСкоја Ρ‚Π°Ρ˜Π½Π° ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ сС Ρ‡ΡƒΠ²Π°Π°Ρ‚ самитС Ρ‚Π°Ρ˜Π½ΠΈ, Π° само врската сС Π½Π°ΠΎΡ“Π° Π½Π° повисоко Π½ΠΈΠ²ΠΎ.

Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠΏΠΈΡˆΠ°Π½ΠΎΡ‚ΠΎ ќС Π±ΠΈΠ΄Π΅ корисно Π·Π° Π½Π΅ΠΊΠΎΠ³ΠΎ :) ΠŸΡ€ΠΈΡ„Π°Ρ‚Π΅Π½ΠΈ сС ситС ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ ΠΈ ΠΏΡ€Π΅ΠΏΠΎΡ€Π°ΠΊΠΈ Π²ΠΎ врска со бСзбСдноста ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ области Π·Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΡƒΠ²Π°ΡšΠ΅. ΠœΠΈΡΠ»Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Π·Π°Π΅Π΄Π½ΠΈΡ†Π°Ρ‚Π° Π΅ исто Ρ‚Π°ΠΊΠ° интСрСсно, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π²Ρ€Π΅Π΄ΠΈ Π΄Π° сС Π΄ΠΎΠ΄Π°Π΄Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π·Π° ConfigMaps (Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ сè ΡƒΡˆΡ‚Π΅ Π½Π΅ Π³ΠΈ користи) ΠΈ Π΄Π° Π³ΠΎ објавимС ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° GitHub / PyPI? Π›ΠΈΡ‡Π½ΠΎ мислам Π΄Π΅ΠΊΠ° Ρ‚Π°ΠΊΠ²ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ сС ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»Π½ΠΈ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ‚Π΅ Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ ΡƒΠ½ΠΈΠ²Π΅Ρ€Π·Π°Π»Π½ΠΈ, ΠΈ ΠΌΠ°Π»ΠΊΡƒ Π΄Π° сС Ρ•ΠΈΡ€Π½Π°Ρ‚ Ρ‚ΡƒΡ“ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊΠΎ ΠΎΠ²Π°Π° Π΄Π°Π΄Π΅Π½Π° ΠΎΠ²Π΄Π΅, ΠΈ Π΄ΠΈΡΠΊΡƒΡΠΈΡ˜Π° Π·Π° нијанси, совСти ΠΈ Π½Π°Ρ˜Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, ΠΊΠΎΠΈ сС Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° ќС Π³ΠΈ Π²ΠΈΠ΄Π°ΠΌ Π²ΠΎ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ , Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ πŸ˜‰

Π‘Π°ΠΌΠΎ рСгистрирани корисници ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° учСствуваат Π²ΠΎ Π°Π½ΠΊΠ΅Ρ‚Π°Ρ‚Π°. Најави сС, Π²ΠΈΠ΅ стС Π΄ΠΎΠ±Ρ€Π΅Π΄ΠΎΡ˜Π΄Π΅Π½ΠΈ.

Π”Π°Π»ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΠΌ ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚/Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°?

  • 0,0%Π”Π°, Π±ΠΈ користСл /contribution0

  • 33,3%Π”Π°, Ρ‚ΠΎΠ° Π·Π²ΡƒΡ‡ΠΈ ΠΎΠ΄Π»ΠΈΡ‡Π½ΠΎ4

  • 41,7%НС, кој Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ° сам Π²ΠΎ свој Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈ Π΄Π° ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π° Π½Π° Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈ5

  • 25,0%ЌС сС Π²ΠΎΠ·Π΄Ρ€ΠΆΠ°ΠΌ ΠΎΠ΄ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€3

Гласаа 12 корисници. 3 корисници сС Π²ΠΎΠ·Π΄Ρ€ΠΆΠ°Π°.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€