Konfigirasyon pwojè andedan ak deyò Kubernetes

Mwen fèk ekri repons sou lavi pwojè nan Docker ak kòd debogaj deyò li, kote li te mansyone yon ti tan ke ou ka fè pwòp sistèm konfigirasyon ou pou sèvis la travay byen nan Kuber, rale moute sekrè, epi kouri fasilman lokalman, menm deyò nan Docker tout ansanm. Pa gen anyen konplike, men "resèt la" ki dekri ka itil yon moun :) Kòd la se nan Python, men lojik la pa mare nan lang lan.

Konfigirasyon pwojè andedan ak deyò Kubernetes

Fondasyon an nan kesyon an se sa a: yon fwa te gen yon sèl pwojè, nan premye li te yon ti monolith ak sèvis piblik ak scripts, men ak tan li te grandi, divize an sèvis, ki an vire yo te kòmanse divize an mikwosèvis, ak Lè sa a, ogmante. Okòmansman, tout bagay sa yo te fè sou VPS vid, pwosesis yo nan konfigirasyon ak deplwaye kòd sou ki te otomatize lè l sèvi avèk Ansible, epi yo te chak sèvis konpile ak yon konfigirasyon YAML ak paramèt ak kle ki nesesè yo, epi yo te itilize yon dosye konfigirasyon menm jan an pou lanse lokal yo, ki te trè pratik, paske .k konfigirasyon sa a chaje nan yon objè mondyal, aksesib soti nan nenpòt kote nan pwojè a.

Sepandan, kwasans lan nan kantite mikwosèvis, koneksyon yo, ak bezwen pou antre ak siveyans santralize, prefigire yon mouvman nan Kuber, ki se toujou nan pwogrè. Ansanm ak asistans nan rezoud pwoblèm mansyone yo, Kubernetes ofri apwòch li nan jesyon enfrastrikti, ki gen ladan sa yo rele sekrè и fason pou travay avèk yo. Mekanis la se estanda ak serye, kidonk li literalman yon peche pa sèvi ak li! Men, an menm tan, mwen ta renmen kenbe fòma aktyèl mwen an pou travay ak konfigirasyon an: premye, yo sèvi ak li inifòm nan diferan mikwosèvis nan pwojè a, epi dezyèmman, yo dwe kapab kouri kòd la sou machin lokal la lè l sèvi avèk yon sèl senp. fichye konfigirasyon.

Nan sans sa a, mekanis pou konstwi yon objè konfigirasyon te modifye pou kapab travay tou de ak fichye konfigirasyon klasik nou an ak sekrè ki soti nan Kuber. Yon estrikti konfigirasyon ki pi rijid te espesifye tou, nan lang twazyèm Python la, jan sa a:

Dict[str, Dict[str, Inyon[str, int, float]]]

Sa vle di, cogfig final la se yon diksyonè ak seksyon yo nonmen, chak nan yo se yon diksyonè ak valè ki soti nan kalite senp. Ak seksyon yo dekri konfigirasyon an ak aksè a resous nan yon sèten kalite. Yon egzanp yon moso nan konfigirasyon nou an:

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"

An menm tan an, jaden an engine baz done yo ka enstale sou SQLite, ak redis mete nan mock, ki espesifye tou non fichye a pou konsève pou - paramèt sa yo kòrèkteman rekonèt ak trete, sa ki fè li fasil pou kouri kòd la lokalman pou debogaj, tès inite ak nenpòt lòt bezwen. Sa a se espesyalman enpòtan pou nou paske gen anpil lòt bezwen - yon pati nan kòd nou an gen entansyon pou plizyè kalkil analyse, li kouri non sèlman sou sèvè ak òkestrasyon, men tou ak scripts divès kalite, ak sou òdinatè yo nan analis ki bezwen travay nan. ak debug konplèks done pwosesis tiyo san yo pa mangonmen pwoblèm backend. By wout la, li pa ta fè mal yo pataje ke zouti prensipal nou yo, ki gen ladan kòd la layout konfigirasyon, yo enstale atravè setup.py – ansanm sa a ini kòd nou an nan yon sèl ekosistèm, endepandan de platfòm ak metòd pou itilize.

Deskripsyon yon gous Kubernetes sanble sa a:

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 vle di, chak sekrè dekri yon seksyon. Sekrè yo tèt yo kreye tankou sa a:

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

Ansanm sa a rezilta nan kreyasyon an nan dosye YAML sou chemen an /etc/secrets/db-main/section_name.yaml

Ak pou lanse lokal yo, yo itilize konfigirasyon an, ki chita nan anyè rasin pwojè a oswa sou chemen an espesifye nan varyab anviwònman an. Kòd ki responsab pou konvenyans sa yo ka wè nan beke la.

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

Lojik isit la se byen senp: nou konbine gwo konfigirasyon ki soti nan anyè pwojè a ak chemen pa anviwònman varyab, ak ti seksyon konfigirasyon soti nan sekrè Kuber, ak Lè sa a, preprocessing yo yon ti kras. Plis kèk varyab. Mwen sonje ke lè w ap chèche dosye ki soti nan sekrè, yo itilize yon limit pwofondè, paske K8s kreye yon katab kache nan chak sekrè kote sekrè yo yo estoke, epi jis yon lyen ki sitiye nan yon nivo ki pi wo.

Mwen espere ke sa ki dekri a pral itil yon moun :) Nenpòt kòmantè ak rekòmandasyon konsènan sekirite oswa lòt domèn pou amelyorasyon yo aksepte. Opinyon kominote a enteresan tou, petèt li vo ajoute sipò pou ConfigMaps (pwojè nou an pa sèvi ak yo ankò) epi pibliye kòd la sou GitHub / PyPI? Pèsonèlman, mwen panse ke bagay sa yo twò endividyèl pou pwojè yo dwe inivèsèl, ak yon ti kras gade vit nan aplikasyon lòt moun, tankou sa ki bay la a, ak yon diskisyon sou nuans, konsèy ak pi bon pratik, ki mwen espere wè nan kòmantè yo. , se ase 😉

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Èske mwen ta dwe pibliye kòm yon pwojè / bibliyotèk?

  • 0,0%Wi, mwen ta itilize /kontribisyon0

  • 33,3%Wi, sa son gwo4

  • 41,7%Non, ki moun ki bezwen fè li tèt yo nan pwòp fòma yo ak adapte bezwen yo5

  • 25,0%Mwen pral evite reponn3

12 itilizatè yo te vote. 3 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè