Waxaan dhawaan qoray
Dulucda su'aashu waa sidan: beri hore waxaa jiray hal mashruuc, markii hore wuxuu ahaa monolith yar oo leh adeeg iyo qoraal, laakiin muddo ka dib way kortay, oo u qaybsantay adeegyo, taas oo bilaabay in loo qaybiyo adeeg yar, iyo ka dibna kor loo qaaday. Markii hore, waxaas oo dhan waxaa lagu sameeyay VPS qaawan, hababka dejinta iyo geynta koodka kuwaas oo si otomaatig ah loo adeegsaday iyadoo la adeegsanayo macquul, adeeg kastana waxaa lagu soo ururiyay qaabeynta YAML oo leh goobaha lagama maarmaanka ah iyo furayaasha, iyo faylka isku midka ah ayaa loo adeegsaday bilaabista maxaliga ah, taas oo ahayd mid aad u habboon, sababtoo ah .k qaabkan waxaa lagu dhejiyaa shay caalami ah, oo laga heli karo meel kasta oo mashruuca ah.
Si kastaba ha ahaatee, kobaca tirada adeegyada yar yar, isku xirka, iyo
Marka tan la eego, habka lagu dhisayo shayga qaabeynta ayaa la bedelay si ay ugu shaqeyso labadaba faylka qaabeynta caadiga ah iyo siraha Kuber. Qaab dhismeed aad u adag ayaa sidoo kale lagu qeexay, luqadda Python saddexaad, sida soo socota:
Dict[str, Dict[str, Midowga[str, int, float]]]
Taasi waa, cogfig kama dambaysta ah waa qaamuus leh qaybo la magacaabay, mid kasta oo ka mid ah waa qaamuus leh qiyamka noocyada fudud. Qaybuhuna waxay qeexayaan habaynta iyo gelitaanka ilaha nooc gaar ah. Tusaale qayb ka mid ah habaynteena:
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"
Isla mar ahaantaana, garoonka engine
database-yada waxaa lagu rakibi karaa SQLite, iyo redis
dhigay mock
, qeexida sidoo kale magaca faylka si loo badbaadiyo - xuduudahan si sax ah ayaa loo aqoonsaday oo loo habeeyey, taas oo sahlaysa in lagu socodsiiyo koodka gudaha gudaha si loo saxo, tijaabinta cutubka iyo baahi kasta oo kale. Tani waxay si gaar ah muhiim noogu tahay sababtoo ah waxaa jira baahiyo kale oo badan - qayb ka mid ah koodkayaga waxaa loogu talagalay xisaabinta falanqaynta kala duwan, waxay ku shaqeysaa ma aha oo kaliya server-yada leh orchestration, laakiin sidoo kale qoraallo kala duwan, iyo kombuyuutarrada falanqeeyayaasha u baahan inay ka shaqeeyaan. iyo khaladka tubooyinka habaynta xogta adag iyada oo aan laga welwelin arrimaha dhabarka. Jid ahaan, ma dhaawacayso in la wadaago in agabkayaga ugu muhiimsan, oo ay ku jiraan koodhka qaabaynta, lagu rakibay iyada oo loo marayo setup.py
- si wadajir ah tani waxay midaynaysaa koodkayaga hal nidaam deegaan, oo ka madax bannaan madal iyo habka loo isticmaalo.
Sharaxaadda boodhka Kubernetes waxay u egtahay sidan:
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
Taasi waa, sir kastaa waxay qeexaysaa hal qayb. Siraha laftooda ayaa loo abuuray sida tan:
apiVersion: v1
kind: Secret
metadata:
name: db-main-secret
type: Opaque
stringData:
db_main.yaml: |
engine: sqlite
filename: main.sqlite3
Si wada jir ah tani waxay keenaysaa abuurista faylasha YAML ee jidka /etc/secrets/db-main/section_name.yaml
Iyo bilaabista maxalliga ah, qaabeynta ayaa loo isticmaalaa, oo ku taal tusaha xididka mashruuca ama jidka lagu qeexay doorsoomiyaha deegaanka. Koodhka ka mas'uulka ah fududayntan waxa lagu arki karaa qaswadayaasha.
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()
Macnaha halkan waa mid aad u fudud: waxaan isku daraynaa habab waaweyn oo ka socda tusaha mashruuca iyo waddooyinka doorsoomayaasha deegaanka, iyo qaybo yaryar oo ka mid ah siraha Kuber, ka dibna wax yar ka sii horumariyo. Oo lagu daray doorsoomayaasha qaarkood. Waxaan ogsoonahay in marka la raadinayo faylasha sirta ah, xaddidaad qoto dheer ayaa la isticmaalaa, sababtoo ah K8s waxay abuurtaa galka qarsoon ee sirta kasta halkaasoo sirta laftooda lagu kaydiyo, oo kaliya isku xirka ayaa ku yaal heer sare.
Waxaan rajeynayaa in waxa lagu tilmaamay ay faa'iido u yeelan doonaan qof :) Wixii faallooyin iyo talooyin ah oo ku saabsan amniga ama meelaha kale ee horumarinta la aqbalo. Fikradda bulshadu sidoo kale waa mid xiiso leh, laga yaabee inay mudan tahay in lagu daro taageerada ConfigMaps (mashruucayagu weli ma isticmaalo) oo ku daabaca koodka GitHub / PyPI? Shakhsi ahaan, waxaan u maleynayaa in waxyaalahan oo kale ay yihiin kuwo aad shakhsi u ah mashaariicda si ay u noqdaan kuwo caalami ah, iyo in yar oo fiirinaya fulinta dadka kale, sida midda halkan lagu bixiyay, iyo dood ku saabsan nuances, talooyin iyo hababka ugu fiican, taas oo aan filayo inaan ku arko faallooyinka. , waa ku filan π
Isticmaalayaasha diiwaangashan oo keliya ayaa ka qaybqaadan kara sahanka.
Miyaan u daabacaa mashruuc/maktabad ahaan?
-
0,0%Haa, waxaan isticmaali lahaa/wax ku darsiga0
-
33,3%Haa, taasi way fiicantahay4
-
41,7%Maya, yaa u baahan in uu isagu u sameeyo qaab u gaar ah oo ku habboon baahidooda5
-
25,0%Waxaan ka gaabsaday in aan ka jawaabo3
12 isticmaale ayaa codeeyay. 3 isticmaale ayaa ka aamusay.
Source: www.habr.com