Kubernetes اندر ۽ ٻاهر پروجيڪٽ جي جوڙجڪ

مون تازو لکيو Docker ۾ پروجيڪٽ جي زندگي ۽ ان کان ٻاهر ڊيبنگ ڪوڊ بابت جواب ڏيو، جتي هن مختصر طور تي ذڪر ڪيو ته توهان پنهنجو ٺاهي سگهو ٿا ترتيب ترتيب وارو نظام ته جيئن خدمت ڪبير ۾ چڱي طرح ڪم ڪري، راز کي ڇڪي، ۽ آساني سان مقامي طور تي هلندي، جيتوڻيڪ ڊڪر کان ٻاهر مڪمل طور تي. ڪجھ به پيچيده نه آهي، پر بيان ڪيل "ترڪيب" ڪنهن لاء ڪارائتو ٿي سگهي ٿو :) ڪوڊ پائٿون ۾ آهي، پر منطق ٻوليء سان ڳنڍيل ناهي.

Kubernetes اندر ۽ ٻاهر پروجيڪٽ جي جوڙجڪ

سوال جو پس منظر هي آهي ته: ڪنهن زماني ۾ هڪ پروجيڪٽ هوندو هو، شروع ۾ اهو يوٽيلٽيز ۽ اسڪرپٽ سان گڏ هڪ ننڍڙو منڊل هو، پر وقت گذرڻ سان گڏ اهو وڌيو، سروسز ۾ ورهائجي ويو، جنهن جي نتيجي ۾ مائڪرو سروسز ۾ ورهائجڻ شروع ٿيو، ۽ پوء وڌايو. شروعات ۾، اهو سڀ ڪجهه بيئر VPS تي ڪيو ويو، ڪوڊ ترتيب ڏيڻ ۽ ترتيب ڏيڻ جو عمل جنهن تي جوابي استعمال ڪندي خودڪار ڪيو ويو، ۽ هر خدمت هڪ YAML ترتيب سان گڏ ضروري سيٽنگون ۽ چابمن سان گڏ ڪيو ويو، ۽ ساڳئي ترتيب واري فائل لاء استعمال ڪيو ويو. مقامي لانچ، جيڪو تمام آسان هو، ڇاڪاڻ ته .k هي ترتيب هڪ گلوبل اعتراض ۾ لوڊ ڪيو ويو آهي، پروجيڪٽ ۾ ڪٿي به رسائي لائق آهي.

بهرحال، مائڪرو سروسز جي تعداد ۾ واڌ، انهن جي ڪنيڪشن، ۽ مرڪزي لاگنگ ۽ نگراني جي ضرورت آهي، ڪبير ڏانهن وڃڻ جي اڳڪٿي ڪئي، جيڪا اڃا تائين جاري آهي. ذڪر ڪيل مسئلن کي حل ڪرڻ ۾ مدد سان گڏ، ڪبرنيٽس انفراسٽرڪچر مينيجمينٽ لاءِ پنهنجا طريقا پيش ڪري ٿو، بشمول نام نهاد راز и ان سان گڏ ڪم ڪرڻ جا طريقا. ميڪانيزم معياري ۽ قابل اعتماد آهي، تنهنڪري اهو لفظي طور تي هڪ گناهه آهي ان کي استعمال نه ڪرڻ! پر ساڳئي وقت، مان ترتيب سان ڪم ڪرڻ لاء منهنجي موجوده فارميٽ کي برقرار رکڻ چاهيندس: پهريون، ان کي پروجيڪٽ جي مختلف مائڪرو سروسز ۾ هڪجهڙائي سان استعمال ڪرڻ، ۽ ٻيو، هڪ سادي استعمال ڪندي مقامي مشين تي ڪوڊ هلائڻ جي قابل ٿي. config فائل.

ان سلسلي ۾، ھڪڙي ٺاھ جوڙ جي ٺاھڻ جي ميکانيزم کي تبديل ڪيو ويو آھي جيڪو ڪم ڪرڻ جي قابل ٿي سگھي ٿو اسان جي کلاسک 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

تبصرو شامل ڪريو