Scríobh mé le déanaí
Is é seo a leanas cúlra na ceiste: uair amháin bhí tionscadal amháin ann, ar dtús bhí sé ina monolith beag le fóntais agus scripteanna, ach le himeacht ama d'fhás sé, roinnte i seirbhísí, a thosaigh ina dhiaidh sin a roinnt i microservices, agus ansin de réir scála suas. Ar dtús, rinneadh é seo go léir ar VPS lom, rinneadh na próisis chun cód a bhunú agus a imscaradh a uathoibriú ag baint úsáide as Ansible, agus tiomsaíodh gach seirbhís le cumraíocht YAML leis na socruithe agus na heochracha riachtanacha, agus úsáideadh comhad cumraíochta den chineál céanna le haghaidh seoltaí áitiúla, a bhí an-áisiúil, mar gheall ar .k tá an config seo luchtaithe isteach i réad domhanda, inrochtana ó áit ar bith sa tionscadal.
Mar sin féin, an fás ar líon na microservices, a gcuid naisc, agus
Maidir leis seo, athraíodh an mheicníocht chun réad cumraíochta a thógáil chun a bheith in ann oibriú lenár gcomhad cumraíochta clasaiceach agus le rúin ó Kuber. Sonraíodh struchtúr cumraíochta níos déine freisin, i dteanga an tríú Python, mar seo a leanas:
Dict[str, Dict[str, Aontas[str, int, snámh]]]
Is é sin, is foclóir é an cogfig deiridh le hailt ainmnithe, gach ceann acu ina foclóir le luachanna ó chineálacha simplí. Agus déanann ailt cur síos ar chumraíocht agus rochtain ar acmhainní de chineál áirithe. Sampla de phíosa dár cumraíochta:
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"
Ag an am céanna, an réimse engine
is féidir bunachair shonraí a shuiteáil ar SQLite, agus redis
leagtha chun mock
, ag sonrú freisin ainm an chomhaid le sábháil - déantar na paraiméadair seo a aithint agus a phróiseáil i gceart, rud a fhágann go bhfuil sé éasca an cód a reáchtáil go háitiúil le haghaidh dífhabhtaithe, tástáil aonaid agus aon riachtanais eile. Tá sé seo tábhachtach go háirithe dúinn toisc go bhfuil go leor riachtanais eile - tá cuid dár gcód beartaithe le haghaidh ríomhaireachtaí anailíseacha éagsúla, ritheann sé ní hamháin ar fhreastalaithe le orchestration, ach freisin le scripteanna éagsúla, agus ar na ríomhairí na n-anailísithe a bhfuil gá acu a bheith ag obair tríd. agus píblínte próiseála sonraí casta dífhabhtaithe gan a bheith buartha faoi shaincheisteanna backend. Dála an scéil, ní ghortódh sé a roinnt go bhfuil ár bpríomhuirlisí, lena n-áirítear an cód leagan amach cumraíochta, suiteáilte trí setup.py
– le chéile déanann sé seo ár gcód a aontú in éiceachóras aonair, neamhspleách ar ardán agus ar mhodh úsáide.
Breathnaíonn an cur síos ar pod Kubernetes mar seo:
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
Is é sin, déanann gach rún cur síos ar alt amháin. Cruthaítear na rúin féin mar seo:
apiVersion: v1
kind: Secret
metadata:
name: db-main-secret
type: Opaque
stringData:
db_main.yaml: |
engine: sqlite
filename: main.sqlite3
Cruthaítear comhaid YAML feadh an chosáin mar thoradh air seo /etc/secrets/db-main/section_name.yaml
Agus le haghaidh seolta áitiúla, úsáidtear an cumraíocht, atá suite i bhfréamheolaire an tionscadail nó feadh an chosáin atá sonraithe san athróg timpeallachta. Tá an cód atá freagrach as na háiseanna seo le feiceáil sa 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()
Tá an loighic anseo simplí go leor: cuirimid le chéile cumraíochtaí móra ón eolaire tionscadail agus cosáin de réir athróg timpeallachta, agus rannóga cumraíochta beaga ó rúin Kuber, agus ansin iad a réamhphróiseáil beagán. Plus roinnt athróg. Tugaim faoi deara, nuair a bhíonn comhaid rúnda á chuardach, go n-úsáidtear teorannú doimhneachta, toisc go gcruthaíonn K8s fillteán i bhfolach i ngach rún ina stóráiltear na rúin féin, agus níl ach nasc suite ar leibhéal níos airde.
Tá súil agam go mbeidh an méid a thuairiscítear úsáideach do dhuine éigin :) Glactar le haon tuairimí agus moltaí maidir le slándáil nó réimsí eile le feabhsú. Tá tuairim an phobail suimiúil freisin, b’fhéidir gur fiú tacaíocht a chur leis do ConfigMaps (ní úsáideann ár dtionscadal iad fós) agus an cód a fhoilsiú ar GitHub / PyPI? Go pearsanta, is dóigh liom go bhfuil rudaí den sórt sin ró-aonair chun tionscadail a bheith uilíoch, agus beagán peeking ar fheidhmiúcháin daoine eile, cosúil leis an gceann a thugtar anseo, agus plé ar nuances, leideanna agus cleachtais is fearr, a bhfuil súil agam a fheiceáil sna tuairimí. , is leor 😉
Ní féidir ach le húsáideoirí cláraithe páirt a ghlacadh sa suirbhé.
Ar cheart dom foilsiú mar thionscadal/leabharlann?
-
0,0%Sea, d’úsáidfinn /ranníocaíocht0
-
33,3%Sea, is iontach an rud é sin4
-
41,7%Ní hea, cé a chaithfidh é a dhéanamh iad féin ina bhformáid féin agus a oireann dá riachtanais5
-
25,0%Staonfaidh mé ón bhfreagra3
Vótáil 12 úsáideoir. Staon 3 úsáideoir.
Foinse: will.com