Kugadziriswa kweprojekiti mukati uye kunze kweKubernetes

Ini nguva pfupi yadarika ndakanyora pindura nezve hupenyu hweprojekiti muDocker uye debugging kodhi kunze kwayo, kwaakataura muchidimbu kuti iwe unogona kugadzira yako yekumisikidza sisitimu kuitira kuti sevhisi ishande zvakanaka muKuber, inodhonza zvakavanzika, uye inomhanya munharaunda zviri nyore, kunyangwe kunze kweDocker zvachose. Hapana chakaoma, asi iyo yakatsanangurwa "recipe" inogona kubatsira kune mumwe munhu :) Kodhi iri muPython, asi pfungwa haina kusungirirwa kumutauro.

Kugadziriswa kweprojekiti mukati uye kunze kweKubernetes

Mhedzisiro yemubvunzo ndeiyi: pane imwe nguva pane imwe purojekiti, pakutanga yaive diki monolith ine zvishandiso uye zvinyorwa, asi nekufamba kwenguva yakakura, yakakamurwa kuita masevhisi, ayo akatanga kukamurwa kuita microservices, uye akabva awedzera. Pakutanga, zvese izvi zvakaitwa paVPS yakashama, maitiro ekumisikidza nekuisa kodhi paari otomatiki uchishandisa Ansible, uye sevhisi yega yega yakaunganidzwa neYAML config nemasetirwo anodiwa uye makiyi, uye yakafanana config file yakashandiswa. kuvhurwa kwenzvimbo, izvo zvaive zvakanakira, nekuti .k iyi config inoiswa muchinhu chepasi rose, chinowanikwa kubva chero kupi muchirongwa.

Nekudaro, kukura kwehuwandu hwe microservices, kubatana kwavo, uye kudiwa kwekutema miti pakati nekutarisa, zvaifananidzira kutamira kuKuber, uko kuchiri kuitika. Pamwe chete nerubatsiro mukugadzirisa matambudziko ataurwa, Kubernetes inopa maitiro ayo ekugadzirisa zvivakwa, kusanganisira anonzi maSecrets ΠΈ nzira dzekushanda navo. Iyo michina ndeyeyero uye yakavimbika, saka icho chaicho chitadzo kusaishandisa! Asi panguva imwecheteyo, ndinoda kuchengetedza chimiro changu chazvino chekushanda neiyo config: chekutanga, kuishandisa zvakafanana mumamicroservices akasiyana epurojekiti, uye chechipiri, kukwanisa kumhanyisa kodhi pamushini wemuno uchishandisa imwe yakapusa. config file.

Panyaya iyi, magadzirirwo ekugadzira chinhu chekugadzirisa akagadziridzwa kuti akwanise kushanda zvese neyedu classic config file uye nezvakavanzika kubva Kuber. Imwe yakaomesesa dhizaini yakatsanangurwa zvakare, mumutauro wechitatu Python, sezvinotevera:

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

Kureva kuti, cogfig yekupedzisira iduramazwi rine zvikamu zvine mazita, chimwe nechimwe chiri duramazwi rine kukosha kubva kumhando dzakareruka. Uye zvikamu zvinotsanangura kugadzirisa uye kuwana zviwanikwa zveimwe mhando. Muenzaniso wechidimbu chegadziriro yedu:

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"

Panguva imwecheteyo, munda engine databases inogona kuiswa paSQLite, uye redis set to mock, kutsanangura zvakare zita refaira rekuchengetedza - aya ma parameter anonyatso zivikanwa uye akagadziriswa, izvo zvinoita kuti zvive nyore kumhanyisa kodhi munzvimbo yedebugging, unit test uye chero zvimwe zvinodiwa. Izvi zvinonyanya kukosha kwatiri nekuti kune zvimwe zvakawanda zvinodiwa - chikamu chekodhi yedu chakagadzirirwa maverengero akasiyana ekuongorora, haafambire chete pamaseva ane orchestration, asiwo neakasiyana magwaro, uye pamakomputa evanoongorora vanofanirwa kushanda uye debug yakaoma data kugadzirisa mapaipi pasina kunetseka backend nyaya. Nenzira, hazvingakuvadze kugovera kuti maturusi edu makuru, kusanganisira iyo config marongero kodhi, akaiswa kuburikidza setup.py - pamwechete izvi zvinobatanidza kodhi yedu kuita imwe ecosystem, yakazvimirira papuratifomu uye nzira yekushandisa.

Rondedzero yeKubernetes pod inotaridzika seizvi:

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

Kureva kuti chakavanzika chimwe nechimwe chinotsanangura chikamu chimwe chete. Zvakavanzika pachazvo zvakagadzirwa seizvi:

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

Pamwe chete izvi zvinoguma nekugadzirwa kwemafaira eYAML munzira /etc/secrets/db-main/section_name.yaml

Uye kune kuvhurwa kwenzvimbo, iyo config inoshandiswa, iri mumudzi wedhairekitori reprojekiti kana munzira inotsanangurwa mune nharaunda inosiyana. Iyo kodhi inokonzeresa izvi zviri nyore inogona kuoneka mune 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()

Iyo logic pano iri nyore: isu tinosanganisa mahombe configs kubva kudhairekitori reprojekiti uye nzira nekusiyana kwezvakatipoteredza, uye zvidiki zvigadziriso zvikamu kubva Kuber zvakavanzika, uye wozozvigadzirisa zvishoma. Kuwedzera zvimwe zvakasiyana. Ini ndinocherekedza kuti kana uchitsvaga mafaera kubva pazvakavanzika, kudzikisira kwakadzama kunoshandiswa, nekuti K8s inogadzira yakavanzika folda mune yega yega chakavanzika uko zvakavanzika pachazvo zvinochengeterwa, uye chete chinongedzo chiri panzvimbo yepamusoro.

Ndinovimba izvo zvinotsanangurwa zvichave zvinobatsira kune mumwe munhu :) Chero mhinduro uye mazano pamusoro pekuchengetedza kana dzimwe nzvimbo dzekuvandudza zvinogamuchirwa. Maonero enharaunda anonakidzawo, pamwe zvakakodzera kuwedzera rutsigiro rweConfigMaps (purojekiti yedu haisati yavashandisa) uye kuburitsa kodhi paGitHub / PyPI? Ini pachangu, ndinofunga kuti zvinhu zvakadaro zvakanyanyisa kuti mapurojekiti ave epasirese, uye kutarisa zvishoma kune vamwe vanhu kuita, seyakapihwa pano, uye nhaurirano yemanuances, matipi uye maitiro akanakisa, ayo andinotarisira kuona mune zvakataurwa. , zvakwana πŸ˜‰

Vashandisi vakanyoresa chete ndivo vanogona kutora chikamu muongororo. Nyorera mu, Munogamuchirwa.

Ndinofanira kushambadza sechirongwa/raibhurari?

  • 0,0%Hongu, ndaizoshandisa /contribution0

  • 33,3%Hongu, zvinonzwika zvakanaka4

  • 41,7%Kwete, ndiani anofanirwa kuzviita ega mune yavo fomati uye kuti ienderane nezvavanoda5

  • 25,0%Ndicharega kupindura3

12 vashandisi vakavhota. 3 vashandisi vakaramba.

Source: www.habr.com

Voeg