Fa'atulagaina o poloketi i totonu ma fafo o Kubernetes

Sa ou tusia talu ai nei tali e uiga i le olaga poloketi i Docker ma le faʻailogaina o le code i fafo atu, lea na ia taʻua faʻapuupuu ai e mafai ona e faia lau lava faiga faʻatulagaina ina ia galue lelei le auaunaga i Kuber, toso i luga mealilo, ma tamoʻe lelei i le lotoifale, e oʻo lava i fafo atu o Docker atoa. E leai se mea faigata, ae o le "fua" o loʻo faʻamatalaina e mafai ona aoga i se tasi :) O le code o loʻo i le Python, ae o le manatu e le o noatia i le gagana.

Fa'atulagaina o poloketi i totonu ma fafo o Kubernetes

O le pito i tua o le fesili o lenei: i se tasi taimi sa i ai se tasi o galuega faatino, i le taimi muamua o se monolith laitiiti ma aoga ma tusitusiga, ae i le aluga o taimi na tuputupu ae, vaevaeina i auaunaga, lea na amata ona vaevaeina i microservices, ma ona fa'ateleina lea. I le taimi muamua, o nei mea uma na faia i luga ole VPS, o le faʻagasologa o le faʻatulagaina ma le faʻapipiʻiina o le code lea na faʻaogaina e faʻaaoga ai le Ansible, ma o auaunaga taʻitasi na tuʻufaʻatasia ma se YAML config faʻatasi ai ma tulaga talafeagai ma ki, ma sa faʻaaogaina se faila faila tutusa mo. fa'asalalauga fa'apitonu'u, lea sa faigofie tele, ona o le .k lenei fa'apipi'i ua utaina i totonu o se mea fa'alelalolagi, e mafai ona maua mai so'o se mea i totonu o le poloketi.

Ae ui i lea, o le tuputupu aʻe i le numera o microservices, latou fesoʻotaʻiga, ma mana'omia le fa'atotonugalemu o la'au ma mata'itū, na faʻaalia ai le siitia atu i Kuber, lea o loʻo faʻaauau pea. Faatasi ai ma le fesoasoani i le foia o faʻafitauli ua taʻua, e ofoina atu e Kubernetes ana auala ile pulega o atinaʻe, e aofia ai e ta'ua o mea lilo и auala e galulue ai ma i latou. O le masini e masani ma faʻatuatuaina, o lona uiga o se agasala le faʻaaogaina! Ae i le taimi lava e tasi, ou te manaʻo e faʻatumauina laʻu faatulagaga o loʻo i ai nei mo le galue ma le config: muamua, ia faʻaogaina tutusa i microservices eseese o le poloketi, ma lona lua, ia mafai ona faʻatautaia le code i luga o le masini faʻapitonuʻu e faʻaaoga ai se tasi faigofie. config faila.

I lenei itu, o le masini mo le fausiaina o se mea faʻapipiʻi na suia ina ia mafai ona galue uma i la matou faila faila masani ma mealilo mai Kuber. Sa fa'amaoti mai fo'i se fa'atonuga sili atu ona mautu, i le gagana a le Python lona tolu, e fa'apea:

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

O lona uiga, o le cogfig mulimuli o se lolomifefiloi ma vaega ua taʻua, o ia mea taʻitasi o se lolomifefiloi ma tulaga taua mai ituaiga faigofie. Ma o vaega o loʻo faʻamatalaina le faʻatulagaina ma le avanoa i punaoa o se ituaiga. O se faʻataʻitaʻiga o se vaega o la matou 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"

I le taimi lava e tasi, o le fanua engine e mafai ona faʻapipiʻi faʻamaumauga i SQLite, ma redis seti i mock, faʻamaonia foi le igoa o le faila e teu - o nei taʻiala e saʻo ona iloa ma faʻatautaia, lea e faigofie ai ona faʻatautaia le code i le lotoifale mo le debugging, suʻega iunite ma soʻo se isi manaʻoga. E taua tele lenei mea mo i tatou ona o loʻo i ai le tele o isi manaʻoga - o se vaega o la tatou code ua faʻamoemoe mo faʻatusatusaga suʻesuʻega eseese, e le gata i luga o sapalai ma faʻasalalauga, ae faʻapea foʻi ma tusitusiga eseese, ma luga o komepiuta a tagata suʻesuʻe e manaʻomia ona galue. ma debug lavelave faiga fa'amaumauga paipa e aunoa ma le popole i tua fa'afitauli. I le auala, e le afaina le faʻasoa atu oa tatou meafaigaluega autu, e aofia ai le faʻasologa o le faʻasologa o tulafono, o loʻo faʻapipiʻiina e ala i setup.py - fa'atasi e tu'ufa'atasia ai la tatou tulafono i totonu o se fa'alapotopotoga fa'anatura e tasi, e tuto'atasi mai le fa'avae ma le auala e fa'aoga ai.

O le faʻamatalaga o le Kubernetes pod e pei o lenei:

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

O lona uiga, o mealilo ta'itasi e fa'amatala ai se vaega e tasi. O mea lilo lava ia na faia e pei o lenei:

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

Faʻatasi lenei mea i le fatuina o faila YAML i luga o le ala /etc/secrets/db-main/section_name.yaml

Ma mo faʻasalalauga faʻapitonuʻu, o loʻo faʻaogaina le config, o loʻo i totonu o le root directory o le poloketi poʻo luga o le ala faʻamaonia i le fesuiaiga o le siosiomaga. O le code e nafa ma nei fa'aogagofie e mafai ona va'aia i le 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()

O le manatu iinei e fai si faigofie: matou te tuʻufaʻatasia lapopoa configs mai le poloketi directory ma auala e fesuiaʻi siosiomaga, ma vaega config config mai mealilo Kuber, ona muai faʻagasolo i latou teisi. Fa'atasi ai ma nisi fesuiaiga. Ou te maitauina pe a suʻeina faila mai mea lilo, e faʻaaogaina se tapulaa loloto, aua o K8s e fatuina se faila natia i mea lilo taʻitasi o loʻo teuina ai mealilo, ma naʻo se fesoʻotaʻiga e tu i se tulaga maualuga.

Ou te faʻamoemoe o mea o loʻo faʻamatalaina o le a aoga i se tasi :) Soo se faʻamatalaga ma fautuaga e uiga i le saogalemu poʻo isi vaega mo le faʻaleleia e talia. E manaia foi le manatu o le alalafaga, atonu e aoga le faʻaopoopoina o le lagolago mo ConfigMaps (e leʻo faʻaaogaina e le matou poloketi) ma faʻasalalau le code ile GitHub / PyPI? I le tagata lava ia, ou te manatu o ia mea e sili ona taʻitoʻatasi mo galuega faatino e lautele, ma sina vaʻavaʻai i faʻatinoga a isi tagata, e pei o le tuʻuina atu iinei, ma se talanoaga o nuances, fautuaga ma faiga sili, lea ou te faʻamoemoe e vaʻai i faʻamatalaga. , ua lava 😉

Na'o tagata fa'aigoaina e mafai ona auai i le su'esu'ega. Saini ese j, faʻamolemole.

E tatau ona ou lomia faasalalau e avea o se poloketi/faletusi?

  • 0,0%Ioe, ou te faʻaaogaina /contribution0

  • 33,3%Ioe, e manaia tele

  • 41,7%Leai, o ai e mana'omia ona faia e i latou lava i la latou lava faatulagaga ma ia fetaui ma o latou mana'oga5

  • 25,0%O le a ou aloese mai le tali3

12 tagata fa'aoga na palota. 3 tagata fa'aoga na fa'amama.

puna: www.habr.com

Faaopoopo i ai se faamatalaga