சமீபத்தில் எழுதினேன்
கேள்வியின் பின்னணி இதுதான்: ஒரு காலத்தில் ஒரு திட்டம் இருந்தது, முதலில் அது பயன்பாடுகள் மற்றும் ஸ்கிரிப்ட்களைக் கொண்ட ஒரு சிறிய மோனோலித், ஆனால் காலப்போக்கில் அது வளர்ந்து, சேவைகளாகப் பிரிக்கப்பட்டது, இதையொட்டி மைக்ரோ சர்வீஸ்களாக பிரிக்கத் தொடங்கியது, மற்றும் பின்னர் அளவிடப்பட்டது. முதலில், இவை அனைத்தும் வெற்று VPS இல் செய்யப்பட்டன, குறியீட்டை அமைக்கும் மற்றும் வரிசைப்படுத்தும் செயல்முறைகள் அன்சிபிளைப் பயன்படுத்தி தானியங்கு செய்யப்பட்டன, மேலும் ஒவ்வொரு சேவையும் தேவையான அமைப்புகள் மற்றும் விசைகளுடன் YAML கட்டமைப்புடன் தொகுக்கப்பட்டது, மேலும் இதே போன்ற கட்டமைப்பு கோப்பு பயன்படுத்தப்பட்டது. உள்ளூர் துவக்கங்கள், இது மிகவும் வசதியானது, ஏனெனில் .k இந்த கட்டமைப்பு ஒரு உலகளாவிய பொருளில் ஏற்றப்பட்டது, திட்டத்தில் எங்கிருந்தும் அணுகலாம்.
இருப்பினும், மைக்ரோ சர்வீஸ்களின் எண்ணிக்கையில் வளர்ச்சி, அவற்றின் இணைப்புகள் மற்றும்
இது சம்பந்தமாக, எங்கள் கிளாசிக் கட்டமைப்பு கோப்பு மற்றும் குபேரின் ரகசியங்கள் இரண்டிலும் வேலை செய்யக்கூடிய வகையில் உள்ளமைவு பொருளை உருவாக்குவதற்கான வழிமுறை மாற்றியமைக்கப்பட்டது. மிகவும் உறுதியான கட்டமைப்பு அமைப்பும், மூன்றாவது பைத்தானின் மொழியில் பின்வருமாறு குறிப்பிடப்பட்டது:
கட்டளை[str, Dict[str, Union[str, int, float]]]
அதாவது, இறுதி cogfig என்பது பெயரிடப்பட்ட பிரிவுகளைக் கொண்ட ஒரு அகராதி ஆகும், அவை ஒவ்வொன்றும் எளிய வகைகளிலிருந்து மதிப்புகளைக் கொண்ட அகராதி. ஒரு குறிப்பிட்ட வகையின் உள்ளமைவு மற்றும் வளங்களுக்கான அணுகலைப் பிரிவுகள் விவரிக்கின்றன. எங்கள் கட்டமைப்பின் ஒரு பகுதியின் எடுத்துக்காட்டு:
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"
அதே நேரத்தில், களம் engine
தரவுத்தளங்களை SQLite இல் நிறுவலாம் மற்றும் redis
தயாராதல் mock
, சேமிப்பதற்கான கோப்பின் பெயரையும் குறிப்பிடுகிறது - இந்த அளவுருக்கள் சரியாக அங்கீகரிக்கப்பட்டு செயலாக்கப்படுகின்றன, இது பிழைத்திருத்தம், அலகு சோதனை மற்றும் பிற தேவைகளுக்கு குறியீட்டை உள்நாட்டில் இயக்குவதை எளிதாக்குகிறது. இது எங்களுக்கு மிகவும் முக்கியமானது, ஏனெனில் வேறு பல தேவைகள் உள்ளன - எங்கள் குறியீட்டின் ஒரு பகுதி பல்வேறு பகுப்பாய்வுக் கணக்கீடுகளுக்காக வடிவமைக்கப்பட்டுள்ளது, இது ஆர்கெஸ்ட்ரேஷனுடன் கூடிய சேவையகங்களில் மட்டுமல்ல, பல்வேறு ஸ்கிரிப்ட்களிலும், மேலும் வேலை செய்ய வேண்டிய ஆய்வாளர்களின் கணினிகளிலும் இயங்குகிறது. பின்தளத்தில் சிக்கல்கள் இல்லாமல் சிக்கலான தரவு செயலாக்க குழாய்களை பிழைத்திருத்தவும். கான்ஃபிக் லேஅவுட் குறியீடு உட்பட எங்களின் முக்கிய கருவிகள் இதன் மூலம் நிறுவப்பட்டிருப்பதை பகிர்வது வலிக்காது. setup.py
- இது ஒன்றாக எங்கள் குறியீட்டை ஒரு சுற்றுச்சூழல் அமைப்பாக ஒன்றிணைக்கிறது, இது இயங்குதளம் மற்றும் பயன்பாட்டு முறையிலிருந்து சுயாதீனமாக உள்ளது.
குபெர்னெட்டஸ் பாட்டின் விளக்கம் இதுபோல் தெரிகிறது:
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
அதாவது, ஒவ்வொரு ரகசியமும் ஒரு பகுதியை விவரிக்கிறது. இரகசியங்கள் பின்வருமாறு உருவாக்கப்படுகின்றன:
apiVersion: v1
kind: Secret
metadata:
name: db-main-secret
type: Opaque
stringData:
db_main.yaml: |
engine: sqlite
filename: main.sqlite3
இவை அனைத்தும் சேர்ந்து பாதையில் YAML கோப்புகளை உருவாக்குகிறது /etc/secrets/db-main/section_name.yaml
மற்றும் உள்ளூர் துவக்கங்களுக்கு, கட்டமைப்பு பயன்படுத்தப்படுகிறது, இது திட்டத்தின் ரூட் கோப்பகத்தில் அல்லது சூழல் மாறியில் குறிப்பிடப்பட்ட பாதையில் அமைந்துள்ளது. இந்த வசதிகளுக்குப் பொறுப்பான குறியீட்டை ஸ்பாய்லரில் காணலாம்.
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()
இங்குள்ள தர்க்கம் மிகவும் எளிமையானது: திட்டக் கோப்பகத்தில் இருந்து பெரிய கட்டமைப்புகள் மற்றும் சூழல் மாறியின் பாதைகள் மற்றும் குபேர் ரகசியங்களிலிருந்து சிறிய கட்டமைப்பு பிரிவுகளை ஒருங்கிணைத்து, பின்னர் அவற்றை சிறிது முன்செயல்படுத்துகிறோம். மேலும் சில மாறிகள். ரகசியங்களிலிருந்து கோப்புகளைத் தேடும்போது, ஒரு ஆழமான வரம்பு பயன்படுத்தப்படுகிறது என்பதை நான் கவனிக்கிறேன், ஏனென்றால் ஒவ்வொரு ரகசியத்திலும் K8 கள் ஒரு மறைக்கப்பட்ட கோப்புறையை உருவாக்குகின்றன, அங்கு ரகசியங்கள் சேமிக்கப்படுகின்றன, மேலும் ஒரு இணைப்பு உயர் மட்டத்தில் அமைந்துள்ளது.
விவரிக்கப்பட்டுள்ளவை ஒருவருக்கு பயனுள்ளதாக இருக்கும் என்று நம்புகிறேன் :) பாதுகாப்பு அல்லது மேம்பாட்டிற்கான பிற பகுதிகள் தொடர்பான கருத்துகள் மற்றும் பரிந்துரைகள் ஏற்றுக்கொள்ளப்படும். சமூகத்தின் கருத்தும் சுவாரஸ்யமானது, ஒருவேளை ConfigMaps க்கான ஆதரவைச் சேர்ப்பது (எங்கள் திட்டம் இன்னும் அவற்றைப் பயன்படுத்தவில்லை) மற்றும் GitHub / PyPI இல் குறியீட்டை வெளியிடுவது மதிப்புக்குரியதா? தனிப்பட்ட முறையில், திட்டங்கள் உலகளாவியதாக இருப்பதற்கு இதுபோன்ற விஷயங்கள் மிகவும் தனிப்பட்டவை என்று நான் நினைக்கிறேன், மேலும் இங்கு கொடுக்கப்பட்டுள்ளதைப் போன்ற மற்றவர்களின் செயலாக்கங்களை சற்று உற்றுப் பார்ப்பது மற்றும் நுணுக்கங்கள், உதவிக்குறிப்புகள் மற்றும் சிறந்த நடைமுறைகள் பற்றிய விவாதம், நான் கருத்துகளில் பார்க்க நம்புகிறேன். , போதும் 😉
பதிவு செய்த பயனர்கள் மட்டுமே கணக்கெடுப்பில் பங்கேற்க முடியும்.
நான் ஒரு திட்டம்/நூலகமாக வெளியிட வேண்டுமா?
-
0,0%ஆம், நான் / பங்களிப்பு0 ஐப் பயன்படுத்துவேன்
-
33,3%ஆம், நன்றாக இருக்கிறது4
-
41,7%இல்லை, யார் அதை தங்கள் சொந்த வடிவத்தில் மற்றும் அவர்களின் தேவைகளுக்கு ஏற்ப செய்ய வேண்டும்5
-
25,0%நான் பதிலளிப்பதைத் தவிர்க்கிறேன்3
12 பயனர்கள் வாக்களித்தனர். 3 பயனர்கள் வாக்களிக்கவில்லை.
ஆதாரம்: www.habr.com