Niliandika hivi majuzi
Asili ya swali ni hii: mara moja kulikuwa na mradi mmoja, mwanzoni ilikuwa monolith ndogo na huduma na maandishi, lakini baada ya muda ilikua, imegawanywa katika huduma, ambayo ilianza kugawanywa katika huduma ndogo, na. kisha kuongezwa. Hapo awali, haya yote yalifanyika kwenye VPS tupu, michakato ya kusanidi na kupeleka nambari ambayo ilijiendesha kwa kutumia Ansible, na kila huduma iliundwa na usanidi wa YAML na mipangilio na funguo muhimu, na faili kama hiyo ya usanidi ilitumika kwa uzinduzi wa ndani, ambao ulikuwa rahisi sana, kwa sababu .k usanidi huu umepakiwa kwenye kitu cha kimataifa, kinachoweza kufikiwa kutoka mahali popote kwenye mradi.
Hata hivyo, ukuaji wa idadi ya microservices, uhusiano wao, na
Katika suala hili, utaratibu wa kuunda kitu cha usanidi ulirekebishwa ili kuweza kufanya kazi na faili yetu ya usanidi wa kawaida na kwa siri kutoka Kuber. Muundo mgumu zaidi wa usanidi pia ulibainishwa, katika lugha ya Python ya tatu, kama ifuatavyo.
Dict[str, Dict[str, Union[str, int, float]]]
Hiyo ni, cogfig ya mwisho ni kamusi iliyo na sehemu zilizotajwa, ambayo kila moja ni kamusi iliyo na maadili kutoka kwa aina rahisi. Na sehemu zinaelezea usanidi na ufikiaji wa rasilimali za aina fulani. Mfano wa kipande cha usanidi wetu:
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"
Wakati huo huo, shamba engine
hifadhidata zinaweza kusanikishwa kwenye SQLite, na redis
kuweka kwa mock
, ikibainisha pia jina la faili ya kuhifadhi - vigezo hivi vinatambuliwa kwa usahihi na kusindika, ambayo inafanya kuwa rahisi kuendesha msimbo ndani ya nchi kwa ajili ya kurekebisha, kupima kitengo na mahitaji mengine yoyote. Hii ni muhimu sana kwetu kwa sababu kuna mahitaji mengine mengi - sehemu ya nambari yetu imekusudiwa kwa mahesabu anuwai ya uchambuzi, haifanyiki tu kwenye seva zilizo na orchestration, lakini pia na maandishi anuwai, na kwenye kompyuta za wachambuzi wanaohitaji kufanya kazi. na utatue mabomba changamano ya kuchakata data bila kuwa na wasiwasi kuhusu masuala ya nyuma. Kwa njia, haitaumiza kushiriki kwamba zana zetu kuu, ikiwa ni pamoja na msimbo wa mpangilio wa usanidi, umewekwa kupitia setup.py
- kwa pamoja hii inaunganisha msimbo wetu kuwa mfumo mmoja wa ikolojia, usiotegemea jukwaa na njia ya matumizi.
Maelezo ya ganda la Kubernetes inaonekana kama hii:
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
Hiyo ni, kila siri inaelezea sehemu moja. Siri zenyewe zimeundwa kama hii:
apiVersion: v1
kind: Secret
metadata:
name: db-main-secret
type: Opaque
stringData:
db_main.yaml: |
engine: sqlite
filename: main.sqlite3
Kwa pamoja hii inasababisha kuundwa kwa faili za YAML kwenye njia /etc/secrets/db-main/section_name.yaml
Na kwa ajili ya uzinduzi wa ndani, usanidi hutumiwa, ulio kwenye saraka ya mizizi ya mradi au kando ya njia iliyotajwa katika kutofautiana kwa mazingira. Nambari inayohusika na matumizi haya inaweza kuonekana kwenye kiharibu.
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()
Mantiki hapa ni rahisi sana: tunachanganya usanidi mkubwa kutoka kwa saraka ya mradi na njia kwa kutofautisha kwa mazingira, na sehemu ndogo za usanidi kutoka kwa siri za Kuber, na kisha kuzishughulikia kidogo. Plus baadhi ya vigezo. Ninaona kwamba wakati wa kutafuta faili kutoka kwa siri, upungufu wa kina hutumiwa, kwa sababu K8s huunda folda iliyofichwa katika kila siri ambapo siri yenyewe huhifadhiwa, na kiungo tu iko kwenye ngazi ya juu.
Natumaini kile kilichoelezwa kitakuwa na manufaa kwa mtu :) Maoni na mapendekezo yoyote kuhusu usalama au maeneo mengine ya kuboresha yanakubaliwa. Maoni ya jumuiya pia yanavutia, labda inafaa kuongeza usaidizi kwa ConfigMaps (mradi wetu bado hautumii) na kuchapisha msimbo kwenye GitHub / PyPI? Binafsi, nadhani vitu kama hivyo ni vya kibinafsi sana kwa miradi kuwa ya ulimwengu wote, na kutazama kidogo utekelezwaji wa watu wengine, kama ile iliyotolewa hapa, na mjadala wa nuances, vidokezo na mazoea bora, ambayo natumai kuona kwenye maoni. , inatosha π
Watumiaji waliojiandikisha pekee ndio wanaweza kushiriki katika utafiti.
Je, nichapishe kama mradi/maktaba?
-
0,0%Ndio, ningetumia /contribution0
-
33,3%Ndiyo, hiyo inasikika vizuri4
-
41,7%Hapana, ni nani anayehitaji kuifanya wenyewe katika umbizo lao na kukidhi mahitaji yao5
-
25,0%Nitaacha kujibu3
Watumiaji 12 walipiga kura. Watumiaji 3 walijizuia.
Chanzo: mapenzi.com