Nanoratra aho vao haingana
Ny fototry ny fanontaniana dia izao: nisy tetik'asa iray taloha, tamin'ny voalohany dia monolith kely miaraka amin'ny fitaovana sy script, saingy rehefa nandeha ny fotoana dia nitombo, nizara ho serivisy, izay nanomboka nizara ho microservices, ary dia nitombo. Tamin'ny voalohany, izany rehetra izany dia natao tamin'ny VPS miboridana, ny fizotran'ny fametrahana sy ny fametrahana kaody izay mandeha ho azy amin'ny fampiasana Ansible, ary ny serivisy tsirairay dia natambatra miaraka amin'ny YAML config miaraka amin'ny fanovana sy ny fanalahidy ilaina, ary ny rakitra config mitovy amin'izany dia nampiasaina ho an'ny. ny fandefasana eo an-toerana, izay tena nety tokoa, satria .k ity config ity dia ampidirina amina zavatra manerantany, azo idirana na aiza na aiza ao amin'ilay tetikasa.
Na izany aza, ny fitomboan'ny isan'ny microservices, ny fifandraisany, ary
Amin'io lafiny io, ny mekanika amin'ny fananganana zavatra fikajiana dia novaina mba ho afaka miasa miaraka amin'ny rakitra config mahazatra anay sy miaraka amin'ny tsiambaratelo avy amin'i Kuber. Nisy rafitra config henjana kokoa ihany koa nofaritana, amin'ny fitenin'ny Python fahatelo, toy izao manaraka izao:
Dict[str, Dict[str, Union[str, int, float]]]
Izany hoe, ny cogfig farany dia rakibolana misy fizarana nomena anarana, ny tsirairay amin'izy ireo dia rakibolana misy soatoavina avy amin'ny karazana tsotra. Ary ny fizarana dia mamaritra ny fanamafisana sy ny fidirana amin'ny loharanon'ny karazana iray. Ohatra iray amin'ny ampahany amin'ny config:
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"
Mandritra izany fotoana izany, ny saha engine
azo apetraka amin'ny SQLite ny databases, ary redis
napetraka amin'ny mock
, manondro ihany koa ny anaran'ny rakitra hotehirizina - ireo masontsivana ireo dia fantatra sy voakarakara tsara, izay manamora ny fampandehanana ny kaody eo an-toerana ho an'ny debugging, fitiliana unit ary izay ilaina hafa. Tena zava-dehibe ho antsika izany satria misy filàna maro hafa - ny ampahany amin'ny kaody ataontsika dia natao ho an'ny kajy famakafakana isan-karazany, tsy amin'ny lohamilina misy orkestra ihany no mandeha, fa amin'ny script isan-karazany, ary amin'ny solosain'ny mpandinika izay mila miasa. ary debug ny fantsona fanodinana angon-drakitra sarotra nefa tsy manahy ny olana any aoriana. Raha ny marina, tsy maninona ny mizara fa ny fitaovana fototra, anisan'izany ny kaody layout config, dia napetraka amin'ny alàlan'ny setup.py
– miaraka izany dia mampiray ny kaodinay ho lasa tontolo iainana tokana, tsy miankina amin'ny sehatra sy ny fomba fampiasana.
Toy izao ny famaritana ny pod 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
Izany hoe, ny tsiambaratelo tsirairay dia mamaritra fizarana iray. Ny tsiambaratelo dia noforonina toy izao:
apiVersion: v1
kind: Secret
metadata:
name: db-main-secret
type: Opaque
stringData:
db_main.yaml: |
engine: sqlite
filename: main.sqlite3
Miaraka izany dia miteraka famoronana rakitra YAML eny an-dalana /etc/secrets/db-main/section_name.yaml
Ary ho an'ny fandefasana eo an-toerana dia ampiasaina ny config, hita ao amin'ny lahatahiry fototry ny tetikasa na amin'ny lalana voafaritra ao amin'ny fari-piainan'ny tontolo iainana. Ny kaody tompon'andraikitra amin'ireo fanamorana ireo dia azo jerena ao amin'ny 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()
Tsotra ny lojika eto: manambatra ny config lehibe avy amin'ny lahatahiry sy ny lalan'ny tetikasa amin'ny fari-piainan'ny tontolo iainana, ary ny fizarana config kely avy amin'ny tsiambaratelo Kuber, ary avy eo amboary kely. Miampy variables sasany. Marihiko fa rehefa mikaroka rakitra avy amin'ny tsiambaratelo, dia misy fetra lalina no ampiasaina, satria K8s dia mamorona lahatahiry miafina ao amin'ny tsiambaratelo tsirairay izay itahirizana ny tsiambaratelo, ary rohy iray fotsiny no misy amin'ny ambaratonga ambony.
Manantena aho fa hahasoa olona iray ny voalaza :) Ekena izay fanehoan-kevitra sy tolo-kevitra momba ny fiarovana na sehatra hafa ho fanatsarana. Mahaliana ihany koa ny hevitry ny vondrom-piarahamonina, mety ilaina ny manampy fanohanana ny ConfigMaps (mbola tsy mampiasa azy ireo ny tetikasanay) ary mamoaka ny kaody ao amin'ny GitHub / PyPI? Amiko manokana dia mihevitra aho fa ny zavatra toy izany dia tena manokana ho an'ny tetikasa ho an'ny rehetra, ary mijery kely amin'ny fampiharana ny olon-kafa, toy ny voalaza eto, ary ny fifanakalozan-kevitra momba ny nuances, toro-hevitra ary fomba fanao tsara indrindra, izay antenaiko ho hita ao amin'ny fanehoan-kevitra. , ampy 😉
Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana.
Tokony havoaka ho tetikasa/fitehirizam-boky ve aho?
-
0,0%Eny, hampiasa /contribution0 aho
-
33,3%Eny, toa mahafinaritra izany4
-
41,7%Tsia, iza no mila manao izany amin'ny endriny manokana sy mifanaraka amin'ny filany5
-
25,0%Tsy hamaly aho3
Mpampiasa 12 no nifidy. Mpampiasa 3 no nifady.
Source: www.habr.com