Konfigurasyon sa proyekto sulod ug gawas sa Kubernetes

Bag-o lang ako nagsulat tubag bahin sa kinabuhi sa proyekto sa Docker ug pag-debug sa code sa gawas niini, diin siya sa makadiyot naghisgot nga makahimo ka sa imong kaugalingon nga sistema sa pag-configure aron ang serbisyo molihok nga maayo sa Kuber, mokuha sa mga sekreto, ug modagan nga komportable sa lokal, bisan sa gawas sa Docker sa hingpit. Walay bisan unsa nga komplikado, apan ang gihulagway nga "resipe" mahimong mapuslanon sa usa ka tawo :) Ang code anaa sa Python, apan ang lohika wala gihigot sa pinulongan.

Konfigurasyon sa proyekto sulod ug gawas sa Kubernetes

Ang background sa pangutana mao kini: kaniadto adunay usa ka proyekto, sa sinugdan kini usa ka gamay nga monolith nga adunay mga gamit ug mga script, apan sa paglabay sa panahon kini mitubo, gibahin sa mga serbisyo, nga sa baylo nagsugod nga gibahin sa mga microservice, ug unya gi-scale up. Sa una, kining tanan gihimo sa hubo nga VPS, ang mga proseso sa pag-set up ug pag-deploy sa code diin awtomatiko gamit ang Ansible, ug ang matag serbisyo gihugpong sa usa ka YAML config nga adunay gikinahanglan nga mga setting ug mga yawe, ug usa ka susama nga config file ang gigamit alang sa lokal nga paglusad, nga sayon ​​kaayo, tungod kay .k kini nga config gikarga ngadto sa usa ka global nga butang, ma-access gikan sa bisan asa sa proyekto.

Bisan pa, ang pagtubo sa gidaghanon sa mga microservice, ilang mga koneksyon, ug panginahanglan alang sa sentralisadong logging ug monitoring, naglandong sa usa ka pagbalhin ngadto sa Kuber, nga nagpadayon pa. Uban sa tabang sa pagsulbad sa nahisgutang mga problema, ang Kubernetes nagtanyag sa mga pamaagi niini sa pagdumala sa imprastraktura, lakip na gitawag nga Secrets ΠΈ mga paagi sa pagtrabaho uban kanila. Ang mekanismo mao ang sumbanan ug kasaligan, mao nga literal nga sala ang dili paggamit niini! Apan sa parehas nga oras, gusto nako nga ipadayon ang akong karon nga format sa pagtrabaho kauban ang config: una, aron magamit kini nga parehas sa lainlaing mga microservice sa proyekto, ug ikaduha, aron mapadagan ang code sa lokal nga makina gamit ang usa ka yano. config file.

Niining bahina, ang mekanismo sa paghimo og usa ka butang sa pag-configure giusab aron magamit pareho sa among klasiko nga config file ug adunay mga sekreto gikan sa Kuber. Ang usa ka mas estrikto nga istruktura sa config gitakda usab, sa pinulongan sa ikatulo nga Python, ingon sa mosunod:

Dict[str, Dict[str, Union[str, int, float]]]

Kana mao, ang katapusan nga cogfig usa ka diksyonaryo nga adunay mga seksyon nga ginganlan, nga ang matag usa usa ka diksyonaryo nga adunay mga kantidad gikan sa yano nga mga tipo. Ug ang mga seksyon naghulagway sa pagsumpo ug pag-access sa mga kahinguhaan sa usa ka matang. Usa ka pananglitan sa usa ka piraso sa among config:

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"

Sa samang higayon, ang kapatagan engine ang mga database mahimong ma-install sa SQLite, ug redis gibutang sa mock, nga gipiho usab ang ngalan sa file nga i-save - kini nga mga parameter husto nga giila ug giproseso, nga nagpasayon ​​sa pagpadagan sa code sa lokal alang sa pag-debug, pagsulay sa yunit ug bisan unsang uban pang mga panginahanglanon. Kini labi ka hinungdanon alang kanamo tungod kay adunay daghang uban pang mga panginahanglanon - bahin sa among code gituyo alang sa lainlaing mga kalkulasyon sa analitikal, kini nagdagan dili lamang sa mga server nga adunay orkestrasyon, apan usab sa lainlaing mga script, ug sa mga kompyuter sa mga analista nga kinahanglan nga magtrabaho pinaagi sa. ug pag-debug sa komplikadong mga linya sa pagproseso sa datos nga wala mabalaka sa mga isyu sa backend. Pinaagi sa dalan, dili makadaot nga ipaambit nga ang among panguna nga mga himan, lakip ang config layout code, gi-install pinaagi setup.py – sa tingub kini naghiusa sa atong code ngadto sa usa ka ekosistema, independente sa plataporma ug paagi sa paggamit.

Ang paghulagway sa usa ka Kubernetes pod ingon niini:

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

Sa ato pa, ang matag sekreto naghulagway sa usa ka seksyon. Ang mga sekreto mismo gimugna sama niini:

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

Mag-uban kini nga resulta sa paghimo sa mga file sa YAML sa agianan /etc/secrets/db-main/section_name.yaml

Ug alang sa mga lokal nga paglansad, gigamit ang config, nga nahimutang sa direktoryo sa gamut sa proyekto o ubay sa agianan nga gitakda sa variable sa palibot. Ang code nga responsable niini nga mga kasayon ​​makita sa spoiler.

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

Ang lohika dinhi kay yano ra: gikombinar namo ang dagkong mga config gikan sa direktoryo sa proyekto ug mga agianan pinaagi sa variable sa palibot, ug gagmay nga mga seksyon sa config gikan sa mga sekreto sa Kuber, ug dayon iproseso kini og gamay. Dugang sa pipila ka mga variable. Namatikdan nako nga sa pagpangita sa mga file gikan sa mga sekreto, gigamit ang usa ka giladmon nga limitasyon, tungod kay ang K8s nagmugna og usa ka tinago nga folder sa matag sekreto diin ang mga sekreto mismo gitipigan, ug usa lamang ka link ang nahimutang sa mas taas nga lebel.

Nanghinaut ko nga ang gihulagway mahimong mapuslanon sa usa ka tawo :) Ang bisan unsang mga komento ug rekomendasyon bahin sa seguridad o uban pang mga lugar alang sa pag-uswag gidawat. Makapainteres usab ang opinyon sa komunidad, tingali angayan nga idugang ang suporta alang sa ConfigMaps (wala pa kini gigamit sa among proyekto) ug i-publish ang code sa GitHub / PyPI? Sa personal, sa akong hunahuna nga ang ingon nga mga butang indibiduwal kaayo alang sa mga proyekto nga mahimong unibersal, ug gamay nga pagtan-aw sa mga pagpatuman sa ubang mga tawo, sama sa gihatag dinhi, ug usa ka paghisgot sa mga nuances, mga tip ug labing kaayo nga mga gawi, nga akong gilauman nga makita sa mga komentaryo. , igo na πŸ˜‰

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Kinahanglan ba nako nga imantala ingon usa ka proyekto / librarya?

  • 0,0%Oo, akong gamiton ang /contribution0

  • 33,3%Oo, maayo kana paminawon4

  • 41,7%Dili, kinsa ang kinahanglan nga mobuhat niini sa ilang kaugalingon nga porma ug mohaum sa ilang mga panginahanglan5

  • 25,0%Maglikay ko sa pagtubag3

12 ka tiggamit ang miboto. 3 ka tiggamit ang nag- abstain.

Source: www.habr.com

Idugang sa usa ka comment