Mwen fèk ekri
Fondasyon an nan kesyon an se sa a: yon fwa te gen yon sèl pwojè, nan premye li te yon ti monolith ak sèvis piblik ak scripts, men ak tan li te grandi, divize an sèvis, ki an vire yo te kòmanse divize an mikwosèvis, ak Lè sa a, ogmante. Okòmansman, tout bagay sa yo te fè sou VPS vid, pwosesis yo nan konfigirasyon ak deplwaye kòd sou ki te otomatize lè l sèvi avèk Ansible, epi yo te chak sèvis konpile ak yon konfigirasyon YAML ak paramèt ak kle ki nesesè yo, epi yo te itilize yon dosye konfigirasyon menm jan an pou lanse lokal yo, ki te trè pratik, paske .k konfigirasyon sa a chaje nan yon objè mondyal, aksesib soti nan nenpòt kote nan pwojè a.
Sepandan, kwasans lan nan kantite mikwosèvis, koneksyon yo, ak
Nan sans sa a, mekanis pou konstwi yon objè konfigirasyon te modifye pou kapab travay tou de ak fichye konfigirasyon klasik nou an ak sekrè ki soti nan Kuber. Yon estrikti konfigirasyon ki pi rijid te espesifye tou, nan lang twazyèm Python la, jan sa a:
Dict[str, Dict[str, Inyon[str, int, float]]]
Sa vle di, cogfig final la se yon diksyonè ak seksyon yo nonmen, chak nan yo se yon diksyonè ak valè ki soti nan kalite senp. Ak seksyon yo dekri konfigirasyon an ak aksè a resous nan yon sèten kalite. Yon egzanp yon moso nan konfigirasyon nou an:
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"
An menm tan an, jaden an engine
baz done yo ka enstale sou SQLite, ak redis
mete nan mock
, ki espesifye tou non fichye a pou konsève pou - paramèt sa yo kòrèkteman rekonèt ak trete, sa ki fè li fasil pou kouri kòd la lokalman pou debogaj, tès inite ak nenpòt lòt bezwen. Sa a se espesyalman enpòtan pou nou paske gen anpil lòt bezwen - yon pati nan kòd nou an gen entansyon pou plizyè kalkil analyse, li kouri non sèlman sou sèvè ak òkestrasyon, men tou ak scripts divès kalite, ak sou òdinatè yo nan analis ki bezwen travay nan. ak debug konplèks done pwosesis tiyo san yo pa mangonmen pwoblèm backend. By wout la, li pa ta fè mal yo pataje ke zouti prensipal nou yo, ki gen ladan kòd la layout konfigirasyon, yo enstale atravè setup.py
– ansanm sa a ini kòd nou an nan yon sèl ekosistèm, endepandan de platfòm ak metòd pou itilize.
Deskripsyon yon gous Kubernetes sanble sa a:
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
Sa vle di, chak sekrè dekri yon seksyon. Sekrè yo tèt yo kreye tankou sa a:
apiVersion: v1
kind: Secret
metadata:
name: db-main-secret
type: Opaque
stringData:
db_main.yaml: |
engine: sqlite
filename: main.sqlite3
Ansanm sa a rezilta nan kreyasyon an nan dosye YAML sou chemen an /etc/secrets/db-main/section_name.yaml
Ak pou lanse lokal yo, yo itilize konfigirasyon an, ki chita nan anyè rasin pwojè a oswa sou chemen an espesifye nan varyab anviwònman an. Kòd ki responsab pou konvenyans sa yo ka wè nan beke la.
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()
Lojik isit la se byen senp: nou konbine gwo konfigirasyon ki soti nan anyè pwojè a ak chemen pa anviwònman varyab, ak ti seksyon konfigirasyon soti nan sekrè Kuber, ak Lè sa a, preprocessing yo yon ti kras. Plis kèk varyab. Mwen sonje ke lè w ap chèche dosye ki soti nan sekrè, yo itilize yon limit pwofondè, paske K8s kreye yon katab kache nan chak sekrè kote sekrè yo yo estoke, epi jis yon lyen ki sitiye nan yon nivo ki pi wo.
Mwen espere ke sa ki dekri a pral itil yon moun :) Nenpòt kòmantè ak rekòmandasyon konsènan sekirite oswa lòt domèn pou amelyorasyon yo aksepte. Opinyon kominote a enteresan tou, petèt li vo ajoute sipò pou ConfigMaps (pwojè nou an pa sèvi ak yo ankò) epi pibliye kòd la sou GitHub / PyPI? Pèsonèlman, mwen panse ke bagay sa yo twò endividyèl pou pwojè yo dwe inivèsèl, ak yon ti kras gade vit nan aplikasyon lòt moun, tankou sa ki bay la a, ak yon diskisyon sou nuans, konsèy ak pi bon pratik, ki mwen espere wè nan kòmantè yo. , se ase 😉
Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la.
Èske mwen ta dwe pibliye kòm yon pwojè / bibliyotèk?
-
0,0%Wi, mwen ta itilize /kontribisyon0
-
33,3%Wi, sa son gwo4
-
41,7%Non, ki moun ki bezwen fè li tèt yo nan pwòp fòma yo ak adapte bezwen yo5
-
25,0%Mwen pral evite reponn3
12 itilizatè yo te vote. 3 itilizatè te absteni.
Sous: www.habr.com