د Kubernetes دننه او بهر د پروژې ترتیب

ما پدې وروستیو کې لیکلي په ډاکر کې د پروژې ژوند او له دې څخه بهر د ډیبګ کولو کوډ په اړه ځواب، چیرې چې هغه په ​​​​لنډه توګه یادونه وکړه چې تاسو کولی شئ خپل د تنظیم کولو سیسټم رامینځته کړئ ترڅو خدمت په کوبر کې ښه کار وکړي ، رازونه راوباسي ، او په اسانۍ سره په محلي توګه پرمخ ځي ، حتی په بشپړ ډول د ډاکر څخه بهر. هیڅ شی پیچلی ندی، مګر تشریح شوی "ترکیب" ممکن د یو چا لپاره ګټور وي :) کوډ په Python کې دی، مګر منطق په ژبه پورې تړلی ندی.

د Kubernetes دننه او بهر د پروژې ترتیب

د پوښتنې شالید دا دی: یو وخت یوه پروژه وه، په لومړي سر کې دا د یوټیلټیو او سکریپټونو سره یو کوچنی واحد و، مګر د وخت په تیریدو سره دا وده وکړه، په خدماتو ویشل شوه، چې په پایله کې یې په مایکرو خدماتو ویشل پیل شول، او بیا اندازه شوی. په لومړي سر کې، دا ټول په خالي VPS کې ترسره شوي، د کوډ ترتیب کولو او پلي کولو پروسې په کوم کې چې د ځواب ورکوونکي په کارولو سره اتومات شوي، او هر خدمت د YAML ترتیب سره د اړین ترتیباتو او کیلو سره ترتیب شوی و، او ورته ورته ترتیب فایل کارول شوی و. محلي لانچونه، کوم چې خورا اسانه وو، ځکه چې دا ترتیب په یو نړیوال څیز کې بار شوی، د پروژې له هر ځای څخه د لاسرسي وړ دی.

په هرصورت، د مایکرو خدماتو په شمیر کې وده، د دوی اړیکې، او مرکزي ننوتلو او څارنې ته اړتیا، کوبر ته د حرکت وړاندوینه وکړه ، کوم چې لاهم په پرمختګ کې دی. د ذکر شویو ستونزو په حل کې د مرستې سره یوځای، Kubernetes د زیربناوو مدیریت ته خپلې تګلارې وړاندې کوي، په شمول تش په نامه رازونه и د هغوی سره د کار کولو لارې. میکانیزم معیاري او د باور وړ دی، نو دا په حقیقت کې یوه ګناه ده چې نه یې کارول کیږي! مګر په ورته وخت کې ، زه غواړم د تشکیل سره کار کولو لپاره زما اوسنی ب formatه وساتم: لومړی ، دا د پروژې مختلف مایکرو خدماتو کې په مساوي ډول وکاروئ ، او دوهم ، د دې وړتیا ولرئ چې په محلي ماشین کې د یو ساده په کارولو سره کوډ چل کړئ. د config فایل.

په دې اړه، د ترتیب کولو څیز جوړولو میکانیزم تعدیل شوی ترڅو زموږ د کلاسیک ترتیب فایل او د کوبر څخه رازونو سره کار وکړي. د دریم پایتون په ژبه کې یو ډیر سخت تشکیل جوړښت هم مشخص شوی و، په لاندې ډول:

Dict[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 - په ګډه دا زموږ کوډ په یو واحد اکوسیستم کې متحد کوي ، د پلیټ فارم او کارولو میتود څخه خپلواک.

د Kubernetes پوډ تشریح داسې ښکاري:

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()

دلته منطق خورا ساده دی: موږ د پروژې ډایرکټر څخه لوی تشکیلات او د چاپیریال متغیر له لارې لارې ، او د کوبر رازونو څخه کوچنۍ تشکیل برخې سره یوځای کوو ، او بیا یې یو څه دمخه پروسس کوو. پلس ځینې متغیرونه. زه یادونه کوم کله چې د رازونو څخه د فایلونو لټون کول ، د ژور محدودیت کارول کیږي ، ځکه چې K8s په هر راز کې یو پټ فولډر رامینځته کوي چیرې چې رازونه پخپله زیرمه شوي ، او یوازې یو لینک په لوړه کچه موقعیت لري.

زه امید لرم چې هغه څه چې تشریح شوي د یو چا لپاره به ګټور وي :) د امنیت یا د پرمختګ لپاره نورو برخو په اړه هر ډول نظرونه او وړاندیزونه منل کیږي. د ټولنې نظر هم په زړه پوری دی ، شاید دا د ConfigMaps لپاره د ملاتړ اضافه کولو ارزښت لري (زموږ پروژه لاهم دوی نه کاروي) او په GitHub / PyPI کې کوډ خپروي؟ په شخصي توګه، زه فکر کوم چې دا ډول شیان د پروژو لپاره خورا انفرادي دي چې نړیوال وي، او د نورو خلکو پلي کولو ته لږ څه ګوري، لکه څنګه چې دلته ورکړل شوي، او د باریکیو، لارښوونو او غوره کړنو بحث، کوم چې زه هیله لرم په نظرونو کې وګورم. ، بس ده 😉

یوازې راجستر شوي کاروونکي کولی شي په سروې کې برخه واخلي. ننوزئمهرباني وکړئ

ایا زه باید د پروژې / کتابتون په توګه خپور کړم؟

  • ۸۵٪هو، زه به /contribution0 وکاروم

  • ۸۵٪هو، دا ښه ښکاري 4

  • ۸۵٪نه، څوک اړتیا لري چې دا پخپله په خپل شکل او د دوی اړتیاو سره سم ترسره کړي

  • ۸۵٪زه به د ځواب ورکولو څخه ډډه وکړم 3

12 کاروونکو رایه ورکړه. 3 کاروونکي منع شوي.

سرچینه: www.habr.com

Add a comment