مون تازو لکيو
سوال جو پس منظر هي آهي ته: ڪنهن زماني ۾ هڪ پروجيڪٽ هوندو هو، شروع ۾ اهو يوٽيلٽيز ۽ اسڪرپٽ سان گڏ هڪ ننڍڙو منڊل هو، پر وقت گذرڻ سان گڏ اهو وڌيو، سروسز ۾ ورهائجي ويو، جنهن جي نتيجي ۾ مائڪرو سروسز ۾ ورهائجڻ شروع ٿيو، ۽ پوء وڌايو. شروعات ۾، اهو سڀ ڪجهه بيئر VPS تي ڪيو ويو، ڪوڊ ترتيب ڏيڻ ۽ ترتيب ڏيڻ جو عمل جنهن تي جوابي استعمال ڪندي خودڪار ڪيو ويو، ۽ هر خدمت هڪ YAML ترتيب سان گڏ ضروري سيٽنگون ۽ چابمن سان گڏ ڪيو ويو، ۽ ساڳئي ترتيب واري فائل لاء استعمال ڪيو ويو. مقامي لانچ، جيڪو تمام آسان هو، ڇاڪاڻ ته .k هي ترتيب هڪ گلوبل اعتراض ۾ لوڊ ڪيو ويو آهي، پروجيڪٽ ۾ ڪٿي به رسائي لائق آهي.
بهرحال، مائڪرو سروسز جي تعداد ۾ واڌ، انهن جي ڪنيڪشن، ۽
ان سلسلي ۾، ھڪڙي ٺاھ جوڙ جي ٺاھڻ جي ميکانيزم کي تبديل ڪيو ويو آھي جيڪو ڪم ڪرڻ جي قابل ٿي سگھي ٿو اسان جي کلاسک config فائل سان ۽ ڪبر جي رازن سان. ٽين پٿون جي ٻولي ۾، وڌيڪ سخت ترتيب واري جوڙجڪ پڻ بيان ڪئي وئي، جيئن هيٺ ڏنل:
ڊڪٽ[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 استعمال ٿئي ٿي، پراجيڪٽ جي روٽ ڊاريڪٽري ۾ يا ماحول جي متغير ۾ بيان ڪيل رستي سان. انهن سهولتن لاءِ ذميوار ڪوڊ اسپائلر ۾ ڏسي سگھجي ٿو.
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()
هتي منطق بلڪل سادو آهي: اسان پروجيڪٽ ڊاريڪٽري مان وڏين ترتيبن کي گڏ ڪريون ٿا ۽ ماحول جي تبديليءَ ذريعي رستا، ۽ ڪبر رازن مان ننڍا ترتيب سيڪشن، ۽ پوءِ انهن کي ٿورو اڳڀرائي ڪريون. پلس ڪجھ متغير. مون کي ياد آهي ته جڏهن ڳولها ڳولها ڳولها رازن کان فائلون، هڪ کوٽائي جي حد استعمال ڪئي وئي آهي، ڇاڪاڻ ته K8s هر راز ۾ هڪ پوشیدہ فولڊر ٺاهي ٿو جتي راز پاڻ کي محفوظ ٿيل آهن، ۽ صرف هڪ لنڪ اعلي سطح تي واقع آهي.
مون کي اميد آهي ته جيڪو بيان ڪيو ويو آهي اهو ڪنهن لاء ڪارائتو هوندو :) سيڪيورٽي يا بهتري جي ٻين علائقن جي حوالي سان ڪي به رايا ۽ سفارشون قبول ڪيون وينديون آهن. ڪميونٽي جي راءِ پڻ دلچسپ آهي، ٿي سگهي ٿو ته اهو ConfigMaps لاءِ سپورٽ شامل ڪرڻ جي قابل آهي (اسان جو پروجيڪٽ اڃا تائين انهن کي استعمال نٿو ڪري) ۽ ڪوڊ شايع ڪرڻ GitHub / PyPI تي؟ ذاتي طور تي، مان سمجهان ٿو ته اهڙيون شيون تمام انفرادي آهن منصوبن لاءِ آفاقي هجڻ لاءِ، ۽ ٻين ماڻهن جي عملن تي ٿورڙي نظر وجهڻ، جيئن هتي ڏنل آهي، ۽ nuances، ٽوٽڪا ۽ بهترين عملن جو هڪ بحث، جنهن کي مون کي تبصرن ۾ ڏسڻ جي اميد آهي. ، ڪافي آهي 😉
صرف رجسٽرڊ استعمال ڪندڙ سروي ۾ حصو وٺي سگهن ٿا.
ڇا مون کي هڪ پروجيڪٽ/لائبريري طور شايع ڪرڻ گهرجي؟
-
0,0٪ها، مان استعمال ڪندس /contribution0
-
33,3٪ها، اهو سٺو آواز آهي 4
-
41,7٪نه، جنهن کي ضرورت آهي ته اهو پاڻ کي پنهنجي شڪل ۾ ۽ انهن جي ضرورتن مطابق ڪرڻ لاءِ 5
-
25,0٪مان جواب ڏيڻ کان پاسو ڪندس 3
12 صارفين ووٽ ڪيو. 3 استعمال ڪندڙن کي روڪيو ويو.
جو ذريعو: www.habr.com