Konfigurazzjoni tal-proġett ġewwa u barra Kubernetes

Dan l-aħħar ktibt tweġiba dwar il-ħajja tal-proġett f'Docker u l-kodiċi tad-debugging barra minnu, fejn semma fil-qosor li tista 'tagħmel is-sistema ta' konfigurazzjoni tiegħek stess sabiex is-servizz jaħdem tajjeb f'Kuber, jiġbed sigrieti, u jaħdem b'mod konvenjenti lokalment, anke barra minn Docker għal kollox. Xejn ikkumplikat, iżda r-"riċetta" deskritta tista 'tkun utli għal xi ħadd :) Il-kodiċi huwa f'Python, iżda l-loġika mhix marbuta mal-lingwa.

Konfigurazzjoni tal-proġett ġewwa u barra Kubernetes

L-isfond tal-mistoqsija huwa dan: darba kien hemm proġett wieħed, għall-ewwel kien monolitu żgħir b'utilitajiet u skripts, iżda maż-żmien kiber, maqsum f'servizzi, li mbagħad bdew jinqasmu f'mikroservizzi, u imbagħad skalat. Għall-ewwel, dan kollu sar fuq VPS vojta, il-proċessi tat-twaqqif u l-iskjerament tal-kodiċi li fuqhom kienu awtomatizzati bl-użu ta 'Ansible, u kull servizz ġie kkompilat b'konfigurazzjoni YAML bis-settings u ċ-ċwievet meħtieġa, u fajl ta' konfigurazzjoni simili intuża għal tniedi lokali, li kien konvenjenti ħafna, minħabba li .k din il-konfigurazzjoni hija mgħobbija f'oġġett globali, aċċessibbli minn kullimkien fil-proġett.

Madankollu, it-tkabbir fin-numru ta 'mikroservizzi, il-konnessjonijiet tagħhom, u ħtieġa għal qtugħ u monitoraġġ ċentralizzati, ippreveda pass lejn Kuber, li għadu għaddej. Flimkien mal-assistenza biex issolvi l-problemi msemmija, Kubernetes joffri l-approċċi tiegħu għall-ġestjoni tal-infrastruttura, inkluż hekk imsejħa Sigrieti и modi kif taħdem magħhom. Il-mekkaniżmu huwa standard u affidabbli, għalhekk huwa litteralment dnub li ma tużahx! Iżda fl-istess ħin, nixtieq inżomm il-format attwali tiegħi biex naħdem mal-konfigurazzjoni: l-ewwelnett, biex tużah b'mod uniformi f'mikroservizzi differenti tal-proġett, u t-tieni, biex inkun kapaċi tħaddem il-kodiċi fuq il-magna lokali billi tuża waħda sempliċi fajl tal-konfigurazzjoni.

F'dan ir-rigward, il-mekkaniżmu għall-kostruzzjoni ta 'oġġett ta' konfigurazzjoni ġie modifikat biex ikun jista 'jaħdem kemm mal-fajl tal-konfigurazzjoni klassiku tagħna kif ukoll b'sigrieti minn Kuber. Ġiet speċifikata wkoll struttura ta 'konfigurazzjoni aktar riġida, fil-lingwa tat-tielet Python, kif ġej:

Dict[str, Dict[str, Unjoni[str, int, float]]]

Jiġifieri, il-cogfig finali huwa dizzjunarju b'sezzjonijiet imsemmija, li kull wieħed minnhom huwa dizzjunarju b'valuri minn tipi sempliċi. U sezzjonijiet jiddeskrivu l-konfigurazzjoni u l-aċċess għal riżorsi ta 'ċertu tip. Eżempju ta' biċċa tal-konfigurazzjoni tagħna:

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"

Fl-istess ħin, il-qasam engine databases jistgħu jiġu installati fuq SQLite, u redis issettjat għal mock, li tispeċifika wkoll l-isem tal-fajl biex issalva - dawn il-parametri huma rikonoxxuti u pproċessati b'mod korrett, li jagħmilha faċli biex titħaddem il-kodiċi lokalment għad-debugging, l-ittestjar tal-unità u kwalunkwe ħtiġijiet oħra. Dan huwa speċjalment importanti għalina għaliex hemm ħafna ħtiġijiet oħra - parti mill-kodiċi tagħna hija maħsuba għal diversi kalkoli analitiċi, taħdem mhux biss fuq servers b'orkestrazzjoni, iżda wkoll b'diversi skripts, u fuq il-kompjuters tal-analisti li għandhom bżonn jaħdmu. u tiddibaggja pipelines kumplessi tal-ipproċessar tad-dejta mingħajr ma tinkwieta kwistjonijiet ta 'backend. Mill-mod, ma jagħmilx ħsara li taqsam li l-għodod ewlenin tagħna, inkluż il-kodiċi tat-tqassim tal-konfigurazzjoni, huma installati permezz setup.py – flimkien dan jgħaqqad il-kodiċi tagħna f'ekosistema waħda, indipendenti mill-pjattaforma u l-metodu ta 'użu.

Id-deskrizzjoni ta’ pod Kubernetes tidher bħal din:

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

Jiġifieri, kull sigriet jiddeskrivi taqsima waħda. Is-sigrieti nfushom huma maħluqa hekk:

apiVersion: v1
kind: Secret
metadata:
  name: db-main-secret
type: Opaque
stringData:
  db_main.yaml: |
    engine: sqlite
    filename: main.sqlite3

Flimkien dan jirriżulta fil-ħolqien ta 'fajls YAML tul it-triq /etc/secrets/db-main/section_name.yaml

U għat-tnedija lokali, tintuża l-konfigurazzjoni, li tinsab fid-direttorju tal-għeruq tal-proġett jew tul il-mogħdija speċifikata fil-varjabbli tal-ambjent. Il-kodiċi responsabbli għal dawn il-konvenjenzi jista 'jidher fl-ispoiler.

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

Il-loġika hawnhekk hija pjuttost sempliċi: aħna ngħaqqdu konfigurazzjonijiet kbar mid-direttorju tal-proġett u mogħdijiet skont il-varjabbli tal-ambjent, u sezzjonijiet żgħar tal-konfigurazzjoni minn sigrieti Kuber, u mbagħad ipproċessahom ftit minn qabel. Flimkien ma 'xi varjabbli. Ninnota li meta tfittex fajls minn sigrieti, tintuża limitazzjoni tal-fond, minħabba li K8s joħloq folder moħbi f'kull sigriet fejn is-sigrieti nfushom huma maħżuna, u rabta biss tinsab f'livell ogħla.

Nittama li dak deskritt ikun utli għal xi ħadd :) Kwalunkwe kumment u rakkomandazzjoni dwar is-sigurtà jew oqsma oħra għal titjib huma aċċettati. L-opinjoni tal-komunità hija wkoll interessanti, forsi ta 'min iżżid l-appoġġ għal ConfigMaps (il-proġett tagħna għadu ma jużahomx) u tippubblika l-kodiċi fuq GitHub / PyPI? Personalment, naħseb li affarijiet bħal dawn huma wisq individwali biex il-proġetti jkunu universali, u nagħti ftit ħarsa lejn implimentazzjonijiet ta’ nies oħrajn, bħal dik mogħtija hawn, u diskussjoni ta’ sfumaturi, pariri u l-aħjar prattiki, li nittama li nara fil-kummenti , huwa biżżejjed 😉

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

Għandi nippubblika bħala proġett/librerija?

  • 0,0%Iva, kont nuża /contribution0

  • 33,3%Iva, dak ħsejjes kbir4

  • 41,7%Le, min irid jagħmel dan huwa stess fil-format tiegħu stess u biex jaqdi l-bżonnijiet tagħhom5

  • 25,0%Jiena noqgħod lura milli nwieġeb3

Ivvutaw 12 utent. 3 utent astjenew.

Sors: www.habr.com

Żid kumment