Veavakirina projeyê li hundur û derveyî Kubernetes

Min vê dawiyê nivîsand bersivê li ser jiyana projeyê li Docker û kodkirina xeletiyê li derveyî wê, ku wî bi kurtî behs kir ku hûn dikarin pergala veavakirina xwe çêbikin da ku karûbar li Kuber baş bixebite, razan derxîne, û bi rehetî herêmî bimeşîne, tewra bi tevahî li derveyî Docker. Tiştek tevlihev nîne, lê "reçeteya" ya hatî diyar kirin dibe ku ji kesek re bikêr be :) Kod di Python de ye, lê mantiq bi ziman ve ne girêdayî ye.

Veavakirina projeyê li hundur û derveyî Kubernetes

Piştgiriya pirsê ev e: Carekê projeyek hebû, di destpêkê de ew yekdestdarek piçûk bû bi karûbar û senaryoyan, lê bi demê re ew mezin bû, di nav karûbaran de hate dabeş kirin, ku di encamê de dest bi dabeşkirina mîkroservisan kir, û paşê mezin kirin. Di destpêkê de, ev hemî li ser VPS-ya tazî hate kirin, pêvajoyên sazkirin û bicîhkirina kodê ku li ser wan bi karanîna Ansible ve hatî otomatîk kirin, û her karûbar bi mîhengek YAML-ê bi mîheng û mifteyên pêwîst re hate berhev kirin, û pelek mîhengê ya bi vî rengî hate bikar anîn. destpêkirinên herêmî, ku pir rehet bû, ji ber ku .k ev konfigurasyon di nav cîhek gerdûnî de tête barkirin, ku ji her deverê projeyê ve tê gihîştin.

Lêbelê, mezinbûna hejmara mîkroservisan, girêdanên wan, û hewcedariya têketin û çavdêriya navendî, tevgerek berbi Kuberê vegot, ku hîn jî di pêş de ye. Li gel arîkariya di çareserkirina pirsgirêkên navborî de, Kubernetes nêzîkatiyên xwe yên rêveberiya binesaziyê pêşkêşî dike, di nav de bi navê Secrets и awayên xebatê bi wan re. Mekanîzma standard û pêbawer e, ji ber vê yekê bi rastî guneh e ku meriv wê bikar neynin! Lê di heman demê de, ez dixwazim formata xweya heyî ya ji bo xebata bi konfigurasyonê re bidomînim: yekem, di mîkroxizmetên cihêreng ên projeyê de wê bi yekreng bikar bînim, û ya duyemîn jî, ku ez bikaribim kodê li ser makîneya herêmî bi karanîna yek sade bimeşînim. pelê mîhengê.

Di vî warî de, mekanîzmaya avakirina hêmanek veavakirinê hate guheztin da ku hem bi pelê mîhengê meya klasîk hem jî bi sirên Kuber re bixebite. Di heman demê de, bi zimanê Python-a sêyemîn, avahiyek mîhengê ya hişktir jî hate destnîşankirin:

Dict[str, Dict[str, Yekîtî[str, int, float]]]

Ango, cogfiga paşîn ferhengek bi beşên navkirî ye, ku her yek ji wan ferhengek bi nirxên ji celebên hêsan e. Û beş veavakirin û gihîştina çavkaniyên cûreyek diyar diyar dikin. Mînakek perçeyek ji mîhengê me:

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"

Di heman demê de, zeviyê engine databases dikarin li ser SQLite werin saz kirin, û redis set to mock, di heman demê de navê pelê ku were hilanîn jî diyar dike - ev pîvan rast têne nas kirin û pêvajo kirin, ku ji bo debugkirin, ceribandina yekîneyê û hewcedariyên din karanîna kodê li herêmî hêsan dike. Ev bi taybetî ji bo me girîng e ji ber ku gelek hewcedariyên din jî hene - beşek ji koda me ji bo hesabên cûrbecûr analîtîkî tête armanc kirin, ew ne tenê li ser serverên bi orkestrasyonê, lê di heman demê de bi nivîsarên cihêreng, û li ser komputerên analîstên ku hewce ne ku bi wan re bixebitin dimeşîne. û lûleyên hilberandina daneya tevlihev bêyî fikarkirina pirsgirêkên paşerojê derxînin. Bi awayê, ne zirarê ye ku em parve bikin ku amûrên me yên sereke, tevî koda mîhengê ya mîhengê, bi navgîniya têne saz kirin setup.py - bi hev re ev koda me di ekosîstemek yekane de, ji platform û awayê karanîna serbixwe, yek dike.

Danasîna podek Kubernetes bi vî rengî xuya dike:

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

Ango her sirek yek beşê vedibêje. Veşartî bixwe bi vî rengî têne afirandin:

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

Bi hev re ev di rê de di afirandina pelên YAML de encam dide /etc/secrets/db-main/section_name.yaml

Û ji bo destpêkirinên herêmî, konfigurasyon tê bikar anîn, ku di pelrêça root ya projeyê de an li ser riya ku di guhêrbara jîngehê de hatî destnîşan kirin, tête bikar anîn. Koda ku ji van rehetiyan berpirsiyar e di spoilerê de tê dîtin.

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

Mantiq li vir pir hêsan e: em mîhengên mezin ji pelrêça projeyê û rêyên ji hêla guhêrbarên hawîrdorê ve, û beşên mîhengê yên piçûk ên ji razên Kuber berhev dikin, û dûv re wan hinekî pêşdixin. Plus hin guherbar. Ez bala xwe didim ku dema ku li pelan ji nehêniyan digere, tixûbek kûr tê bikar anîn, ji ber ku K8s di her sirê de peldankek veşartî diafirîne ku nehênî bixwe têne hilanîn, û tenê girêdanek di astek bilind de ye.

Ez hêvî dikim ku tiştên ku têne vegotin dê ji bo kesek kêrhatî be :) Her şîrove û pêşniyarên di derbarê ewlehiyê an deverên din ên ji bo çêtirkirinê de têne qebûl kirin. Raya civakê jî balkêş e, belkî hêja ye ku ji bo ConfigMaps piştgirî zêde bike (projeya me hîn wan bikar nayîne) û kodê li ser GitHub / PyPI biweşîne? Bi kesane, ez difikirim ku tiştên weha pir kesane ne ku projeyên gerdûnî bin, û piçekî li pêkanînên mirovên din, mîna ya ku li vir hatî dayîn, û nîqaşek li ser nuwaze, serişte û pratîkên çêtirîn, ku ez hêvî dikim ku di şîroveyan de bibînim, ferdî ne. , bes e 😉

Tenê bikarhênerên qeydkirî dikarin beşdarî anketê bibin. Têketinji kerema xwe.

Ma ez wekî proje/pirtûkxane çap bikim?

  • 0,0%Erê, ez ê /contribution0 bikar bînim

  • 33,3%Erê, ew dengek mezin e4

  • 41,7%Na, kî hewce dike ku wê bi xwe di forma xwe de û li gorî hewcedariyên xwe bike5

  • 25,0%Ez ê dev ji bersivdayînê berdim3

12 bikarhêneran deng dan. 3 bikarhêner betal bûn.

Source: www.habr.com

Add a comment